洛谷试炼场---新手村

洛谷试炼场---新手村

洛谷的第一个任务

1.p1001 A+B Problem
难度:入门难度
考点:输入,输出 ,整数四则运算  

适用:小学生

#include <stdio.h>
int main(){
    int a,b;
    scanf("%d%d",&a,&b);
    printf("%d\n",a+b);
    return 0;
}
2. p1421 小玉买文具

难度:入门难度
考点:输入,输出,整数的四则运算
适用:小学生

#include <stdio.h>
int main(){
    int a,b,c;
    scanf("%d%d",&a,&b);
    c=(a*10+b)/19;
    printf("%d\n",c);
    return 0;
}

3. p1425 小鱼的游泳时间 类似 P1421 小玉买文具
难度:入门难度
考点:输入,输出 ,整数四则运算,取整,取模  
适用:小学生
#include <stdio.h>
int main(){
    int a,b,c,d;
    int e,f,g,h,i;
    scanf("%d%d%d%d",&a,&b,&c,&d);
    e=a*60+b;
    f=c*60+d;
    g=f-e;
    h=g/60;
    i=g%60;
    printf("%d %d\n",h,i);
    return 0;
} 

顺序与分支


4.p1422  小玉家的电费
难度:入门难度
考点:输入,输出 ,浮点数计算,if else语句  

适用:小学生

#include <stdio.h>
int main(){
    int a;
    float b;
    scanf("%d",&a);
    if(a<=150)
        b=a*0.4463;
    else if(a>=151&&a<=400)
        b=150*0.4463+(a-150)*0.4663;
    else if(a>400)
        b=150*0.4463+(400-150)*0.4663+(a-400)*0.5663;
    printf("%.1f\n",b);
    return 0;
}
5. p1085 不高兴的津津 
难度:入门难度
考点:输入,输出 ,整数四则运算,数组,找最大值  
适用:小学生
技巧:大于等于8,痛苦指数为a+b,否者为0
#include <stdio.h>
int main(){
    int a,b,c[8],i,max,k;
    for(i=1;i<=7;i++){
        scanf("%d%d",&a,&b);
        if(a+b>=8)
            c[i]=a+b;
        else
            c[i]=0;
    }
    max=0;
    k=0;
    for(i=1;i<=7;i++)
        if(max<c[i]){
            max=c[i];
            k=i;
        }
    printf("%d\n",k);
    return 0;
}
6. NOIP2004 提高组 复赛 save 津津的储蓄计划

1.题目对程序知识要求比较简单,主要考思考。

2.需要开sheng(剩),cun(存)两个变量对每个月的结余进行处理。

3.两个关键点,一是cun*1.2不合适,因cun是整数,不能与浮点直接相乘,可以采用cun/10*12。

4.二是,别忘了手中的钱还要加上12月剩的钱,即cun/10*12+sheng。

5.样例通过后,提交AC。

耗时:15分钟

难度:简单

附上AC代码,编译环境Dev-C++4.9.9.2

//2004 save
#include <stdio.h>
int ys[13];
int main(){
    int i;
    int sheng,cun;
    int flag;
    for(i=1;i<=12;i++)
        scanf("%d",&ys[i]);
    sheng=0;
    cun=0;
    flag=0;
    for(i=1;i<=12;i++){
        sheng=sheng+300-ys[i];
        if(sheng<0){
            flag=1;
            break;
        }
        if(sheng>=100){
            cun=cun+(sheng/100)*100;
            sheng%=100;            
        }
    }
    if(flag)
        printf("%d\n",i*(-1));
    else
        printf("%d\n",cun/10*12+sheng);
}


循环!循环!循环!

7.//p1008 三连击
//难度:入门难度
//考点:输入,输出 ,整数四则运算,取整,取模  
//适用:小学生
//小技巧:分离出每个数的个十百位,其中 1*2*3*4*5*6*7*8*9=362880 1+2+3+4+5+6+7+8+9=45能判定数字是否重复
//方法:枚举
#include <stdio.h>
int main(){
    int a,b,c;
    int x[10];
    int m,n,i;
    for(a=123;a<=333;a++){
        b=a*2;
        c=a*3;
        x[1]=a%10;
        x[2]=a/10%10;
        x[3]=a/100;
        x[4]=b%10;
        x[5]=b/10%10;
        x[6]=b/100;
        x[7]=c%10;
        x[8]=c/10%10;
        x[9]=c/100;
        m=1;
        n=0;
        for(i=1;i<=9;i++)
            m*=x[i];
        for(i=1;i<=9;i++)
            n+=x[i];
        if(m==362880&&n==45)//1*2*3*4*5*6*7*8*9 1+2+3+4+5+6+7+8+9//笔误,写成3628880查了会
            printf("%d %d %d\n",a,b,c);
    }
}
p1008 三连击

难度:入门难度
考点:输入,输出 ,整数四则运算,深度优先算法  
适用:小学生
#include <stdio.h>
#include <string.h>
int a[10];
int visited[10];
int n=9;
void dfs(int step){
    int b,c,d;
    int i;
    b=a[1]*100+a[2]*10+a[3];
    c=a[4]*100+a[5]*10+a[6];
    d=a[7]*100+a[8]*10+a[9];
    if(step==n+1){
        if(c==2*b&&d==3*b)
            printf("%d %d %d\n",b,c,d);
        return;
    }
    for(i=1;i<=9;i++)
        if(visited[i]==0){
            a[step]=i;
            visited[i]=1;
            dfs(step+1);
            visited[i]=0;
        }
}
int main(){
    memset(visited,0,sizeof(visited));
    dfs(1);
    return 0;
} 
8. p1035 级数求和 
难度:入门难度
考点:输入,输出 ,整数、浮点数运算,  
适用:小学生 
陷阱:此题写得不好,容易超时 
感悟:测试 12时,已经反应很慢了,比较忐忑. 提交果然超时。本题的特点是容易测试,发现问题,就需要找出超时的问题,进行改进。

#include <stdio.h>
int main(){
    int k;
    int i;
    double ans;
    scanf("%d",&k);
    ans=1;
    i=1;
    while(1){
        if(ans>k)
            break;
        i++;
        ans+=1.0/i;
    }
    printf("%d\n",i);
    return 0;
} 
9. p1307 数字反转
难度:入门难度
考点:输入,输出 ,取整,取模,分离出个十百千万位数,数组  
适用:小学生
陷阱:如9000,反转后是9,不容易想到。

#include <stdio.h>
int main(){
    int n;
    int a[20];
    int top;
    int flag;
    int i,j;
    scanf("%d",&n);
    if(n==0){//n=0处理 
        printf("0\n");
        return 0;
    }
    if(n>0)//大于0 
        flag=1;
    else{//小于0 
        flag=-1;
        n*=-1;
    }    
    top=-1;
    while(n){
        top++;
        a[top]=n%10;
        n/=10;
    }
    if(flag==-1)
        printf("-");
    j=0;
    while(a[j]==0&&j<=top)
        j++;
    for(i=j;i<=top;i++)
        printf("%d",a[i]);
    return 0;
}

//p1307 数字反转
//难度:入门难度
//考点:输入,输出 ,整数四则运算,取整,取模  
//适用:小学生
#include <stdio.h>
int main(){
    int n;
    int ans=0;
    scanf("%d",&n);
    if(n<0){
        printf("-");
        n=-n;
    }
    while(n){
        ans*=10;
        ans+=n%10;
        n/=10;
    }
    printf("%d\n",ans);
    return 0;
}

10.p1423 小玉在游泳

难度:入门难度
考点:输入,输出 ,浮点数计算  
适用:小学生

#include <stdio.h>
int main(){
    float x;
    int i;
    float step;
    float ans;
    scanf("%f",&x);
    i=1;
    step=2;
    ans=step;
    while(ans<x){
        i++;
        step*=0.98;
        ans+=step;
    }
    printf("%d\n",i); 
    return 0;
} 
11.p1424 小鱼的航程(改进版)
难度:入门难度
考点:输入,输出 ,取模  
适用:小学生
陷阱:结束时间是n+x-1
#include <stdio.h>
int main(){
    int x,n;
    int i;
    int ans;
    int end;
    scanf("%d%d",&x,&n);
    ans=0;
    end=n+x;
    for(i=x;i<end;i++)
        if(i%7!=0&&i%7!=6)//非双休日
             ans+=250;
    printf("%d\n",ans);
    return 0;
}
12. p1980 计数问题 
难度:入门难度
考点:输入,输出 ,取整,取模,分离出整数的个十百千万  
适用:小学生

#include <stdio.h>
int cal(int a,int x){
    int ans;
    ans=0;
    while(a){
        if(a%10==x)
            ans++;
        a/=10;
    }
    return ans;
}
int main(){
    int n,x;
    int i;
    int ans;
    scanf("%d%d",&n,&x);
    ans=0;
    for(i=1;i<=n;i++)
        ans+=cal(i,x);
    printf("%d\n",ans);
    return 0;
}


数组

13. p1046 陶陶摘苹果 
难度:入门难度
考点:输入,输出 ,整数四则运算,数组 
适用:小学生
感悟:菜题

#include <stdio.h>
int main(){
    int h[10+10];
    int i;
    int t;
    int count=0;
    for(i=0;i<10;i++)
        scanf("%d",&h[i]);
    scanf("%d",&t);
    for(i=0;i<10;i++)
        if(t+30>=h[i])
            count++;
    printf("%d\n",count);
    return 0;
}
14.p1047 校门外的树
难度:入门难度
考点:输入,输出 ,整数数组操作  
适用:小学生

注意:过大的数组要开到main函数的外面

int a[10000+10]; 
#include <stdio.h>
int main(){
    int L,m;
    int i,j,start,end;
    int remain;
    scanf("%d%d",&L,&m);
    for(i=0;i<=L;i++)
        a[i]=1;
    for(i=0;i<m;i++){
        scanf("%d%d",&start,&end);
        for(j=start;j<=end;j++)
            a[j]=0;
    }
    remain=0;
    for(i=0;i<=L;i++)
        if(a[i]==1)
            remain++;
    printf("%d\n",remain);
    return 0;
}
15.p1427 小鱼的数字游戏
难度:入门难度
考点:输入,输出 ,一维数组操作  
适用:小学生
#include <stdio.h>
int a[100+10];
int main(){
    int v;
    int count=0;
    int i;
    scanf("%d",&v);
    while(v){
        a[count]=v;
        count++;
        scanf("%d",&v);
    }
    printf("%d",a[count-1]);
    for(i=count-2;i>=0;i--)
        printf(" %d",a[i]);
    printf("\n");
    return 0;
} 
16.p1428 小鱼比可爱
难度:入门难度
考点:输入,输出 ,一维数组操作  
适用:小学生
#include <stdio.h>
#include <string.h>
int a[1000+10];
int b[1000+10];
int main(){
    int n;
    int i,j;
    memset(b,0,sizeof(b));
    scanf("%d",&n);
    for(i=0;i<n;i++)
        scanf("%d",&a[i]);
    for(i=0;i<n;i++)
        for(j=i+1;j<n;j++)
            if(a[i]<a[j])
                b[j]++;
    printf("%d",b[0]);
    for(i=1;i<n;i++)
        printf(" %d",b[i]);
    printf("\n");
    return 0;

}

简单字符串

17. p1055 ISBN号码
难度:入门难度
考点:输入,输出 ,字符串,字符转数字,数字转字符  
适用:小学生
注意:过大的数组要开到main函数的外面。
小技巧:要设置一个计数变量
陷阱:没注意%11,结果可能是0,1,2,3,4,5,6,7,8,9,10 10是两位数,题目太简单了,容易漏看:所得的余数即为识别码,如果余数为10,则识别码为大写字母X

#include <stdio.h>
int main(){
    char s[20];
    int ans;
    scanf("%s",s);
    ans=(s[0]-'0')*1+(s[2]-'0')*2+(s[3]-'0')*3+(s[4]-'0')*4;
    ans+=(s[6]-'0')*5+(s[7]-'0')*6+(s[8]-'0')*7+(s[9]-'0')*8+(s[10]-'0')*9;
    ans%=11;
    if(ans==10)
        if(s[12]=='X')
            printf("Right\n");
        else{
            s[12]='X';
            printf("%s\n",s);
        }
    else if(ans==s[12]-'0')
        printf("Right\n");
    else{
        s[12]=ans+'0';
        printf("%s\n",s);
    }
    return 0;
}
18.p1200 你的飞碟在这儿
难度:入门难度
考点:输入,输出 ,字符串操作,字符转数字,取模  
适用:小学生
#include <stdio.h>
#include <string.h>
int main(){
    char hui[10],dui[10];
    int h,d;
    int hlen,dlen;
    int i;
    scanf("%s%s",hui,dui);
    hlen=strlen(hui);
    dlen=strlen(dui);
    h=1;
    d=1;
    for(i=0;i<hlen;i++)
        h*=hui[i]-'A'+1;
    for(i=0;i<dlen;i++)
        d*=dui[i]-'A'+1;
    if(h%47==d%47)
        printf("GO\n");
    else
        printf("STAY\n");
    return 0;
}

19.//p1308 统计单词数  
//难度:普及-
//考点:输入,输出 ,含空格字符串读取  
//适用:小学生
//注意:过大的数组要开到main函数的外面。
//陷阱:题目比较刁钻,第二行提供的字符串,开始部分也可以是空格,真是难以想象啊,测试数据1,8就是。

#include <stdio.h>
#include <string.h>
#include <ctype.h>
char s1[20];
char s2[1000000+10];
int main(){
    int count=0;
    char c;
    int i,j;
    int s1len,s2len;
    int flag;
    int num,k;
    scanf("%s",s1);
    
    //字符串s2读取,比较费力 
    while((c=getchar())!=EOF)
        if(c!='\r'&&c!='\n')
            s2[count++]=c;
    while(!isalpha(s2[count-1]))
        count--;
    s2[count]='\0';
    
    s1len=strlen(s1);
    s2len=strlen(s2);
    
    //s1,s2字符串,转化成小写 
    for(i=0;i<s1len;i++)
        if(isalpha(s1[i])&&s1[i]>='A'&&s1[i]<='Z')
            s1[i]='a'+s1[i]-'A';
    for(i=0;i<s2len;i++)
        if(isalpha(s2[i])&&s2[i]>='A'&&s2[i]<='Z')
            s2[i]='a'+s2[i]-'A';
    
    num=0;
    for(i=0;i<s2len;i++){
        flag=0;
        for(j=0;j<s1len;j++){
            if(s2[i+j]==s1[j])
                flag=1;
            else{
                flag=0;
                break;
            }
        }
        if(flag==1){
            if(s2[i+s1len]==' '||i+s1len==count){//i+s1len==count表示结尾
                if(i==0||s2[i-1]==' '){//开头
                    num++;
                    if(num==1)
                        k=i;
                } 
            } 
        }
    }
    if(num>0)
        printf("%d %d\n",num,k);
    else
        printf("-1\n");
    return 0;
} 

20.//p1553 数字反转(升级版)
//难度:普及-
//考点:输入,输出 ,字符串处理,字符查找,字符串反转  
//适用:小学生
//小技巧:输出%技巧 %%
//陷阱:陷阱,输出应该用字符串,若用整数,容易越界。
//附上该题测试点9奇葩的输入输出数据额:1390000.00000000  931.0
//附上该题测试点12奇葩的输入输出数据额:000000000/8213 0/3128
//感悟:升级版题目很难做,奇葩数据特别多。似乎不按常理出牌

#include <stdio.h>
#include <string.h>
char s[100],s2[100],s3[100],t[100];
void fun(char *a){
    int i,j,len,b;
    char t[100];
    len=strlen(a);
    
    if(len==1)
        return;
    strcpy(t,a);
    i=0;
    j=0;
    while(t[i]=='0')
        i++;
    while(t[i]!='\0'){
        a[j]=t[i];
        i++;
        j++;
    }
    a[j]='\0';
    len=strlen(a);
    if(len==0){
        a[0]='0';
        a[1]='\0';
    }
}
int main(){
    int len;
    int i,j,m;
    int flag;//整0.1/2%3
    int k;
    scanf("%s",s);
    len=strlen(s);
    flag=0;
    for(i=0;i<len;i++){//查找. / % 
        if(s[i]=='.'){
            flag=1;
            k=i;
            break;
        }
        if(s[i]=='/'){//写成s[i]='/'查了好长时间 
            flag=2;
            k=i;
            break;
        }
        if(s[i]=='%'){//写成s[i]='%'查了好长时间 
            flag=3;
            k=i;
            break;
        }
    }
    switch(flag){
        case 0://整数
            for(i=0;i<len;i++)
                 s2[i]=s[len-1-i];
            s2[i]='\0';
            fun(s2);
            printf("%s\n",s2);
            break;
        case 1://小数
            for(i=0;i<k;i++)
                s2[i]=s[k-1-i];
            s2[i]='\0';
            fun(s2);
            
            for(i=k+1;i<len;i++)
                s3[i-k-1]=s[i];
            s3[i-k-1]='\0';
            len=strlen(s3);
            i=0;
            j=0;
            while(s3[i]=='0')//s3去除首位连续的0 
                i++;
            while(s3[i]!='\0'){
                s3[j]=s3[i];
                j++;
                i++;
            }
            s3[j]='\0';
            
            strcpy(t,s3);//s3逆序处理 
            len=strlen(s3);
            for(i=0;i<len;i++)
                s3[i]=t[len-1-i];
            fun(s3);
            printf("%s.%s\n",s2,s3);
            break;
            
        case 2://分数
            for(i=0;i<k;i++)
                s2[i]=s[k-1-i];
            s2[i]='\0';
            fun(s2);
            
            for(i=0;i<len-k-1;i++)
                s3[i]=s[len-1-i];
            s3[i]='\0';
            fun(s3);
            printf("%s/%s\n",s2,s3); 
            break;
        case 3://百分数
            for(i=0;i<len-1;i++)
                 s2[i]=s[len-1-1-i];
            s2[i]='\0';
            fun(s2);
            printf("%s%%\n",s2);
            break; 
    }
    return 0;
}

21.//p1598 垂直柱状图
//难度:普及-
//考点:输入,输出 ,字符串读取,字符转数字,数字转字符,矩阵读写  
//适用:小学生
//陷阱:Dev-C++4.9.9.2竟无数组越界提醒 ,查了好半天

#include <stdio.h>
#include <string.h>
int a[100];//数组开的太小,越界,查了好半天a[50] 
char b[100][100];//数组开的太小,越界,查了好半天b[50][50]
int main(){
    char c;
    int max,i,j;
    memset(a,0,sizeof(a));
    while((c=getchar())!=EOF){
        if(c>='A'&&c<='Z')
            a[c-'A']++;
    }
    max=0;
    for(i=0;i<26;i++)
        if(max<a[i])
            max=a[i];
    for(j=0;j<26+25;j++)
        for(i=0;i<max;i++)
            if(j%2==1)//奇数 
                b[i][j]=' ';
            else//偶数 
                if(i<max-a[j/2])
                    b[i][j]=' ';
                else
                    b[i][j]='*';
    for(i=0;i<max;i++){
        for(j=0;j<26+25;j++)
            printf("%c",b[i][j]);
        printf("\n");
    }
    for(i=0;i<26+25;i++)
        if(i%2==1)
            printf(" ");
        else
            printf("%c",'A'+i/2);
    printf("\n");
    return 0;
}
22. p1914 小书童---密码
难度:入门难度
考点:输入,输出 ,字符串,字符处理,取模  
适用:小学生

#include <stdio.h>
#include <string.h>
char s[1024];
int main(){
    int n;
    int i;
    int len;
    scanf("%d%s",&n,s);
    len=strlen(s);
    for(i=0;i<len;i++)
        s[i]=(s[i]-'a'+n)%26+'a';
    printf("%s\n",s);
    return 0;
} 

过程函数与递归

23.//p1028 数的计算
//难度:普及-
//考点:输入,输出 ,递归  
//适用:小学生
//小技巧:先将各种情况打印出,之后注释,再进行各种可能结果统计。
//疑惑:测试n=1000,明显超时,但提交AC,很明显,数据弱
#include <stdio.h>
//int a[1000];
//int pos;
long long count=0;
void fun(int n){
    int i,j,top;
    for(i=1;i<=n/2;i++){
        /*pos++;
        a[pos]=i;
        top=pos;
        printf(",");
        for(j=top;j>=0;j--)
            printf("%d",a[j]);*/
        count++;
        fun(i);
        //pos--;
    }
}

int main(){
    int n;
    scanf("%d",&n);
    /*printf("%d",n);
    pos=0;
    a[pos]=n;*/
    count++;
    fun(n);
    printf("%lld\n",count);
    return 0;
}
24.//p1036 选数
//难度:普及-
//考点:输入,输出 ,递归,排列组合,质数的判定,深度优先遍历,阶乘计算  
//适用:初中
//小技巧:深度优先遍历,数据有重复,别忘了/f(k) 阶乘
#include <stdio.h>
#include <string.h>
int a[30],b[30],vis[30];
int n,k;
int count=0;
int f(int n){//阶乘 
    if(n==1)
        return 1;
    return f(n-1)*n;
}
int isprime(int n){//0非质数,1质数 
    int i;
    if(n==1)
        return 0;
    if(n==2)
        return 1;
    for(i=2;i*i<=n;i++)
        if(n%i==0)
            return 0;
    return 1;
}
void dfs(int step){
    int i,j,sum;
    if(step==k+1){
        sum=0;
        for(j=1;j<=k;j++)
            sum+=a[j];
        if(isprime(sum))
            count++;    
        return ;
    }
    for(i=1;i<=n;i++)
        if(vis[i]==0){
            vis[i]=1;
            a[step]=b[i];
            dfs(step+1);
            vis[i]=0;
        }
}
int main(){
    int i;
    memset(vis,0,sizeof(vis));
    scanf("%d%d",&n,&k);
    for(i=1;i<=n;i++)
        scanf("%d",&b[i]);
    dfs(1);
    printf("%d\n",count/f(k));
    return 0;
} 
25.//p1149 火柴棒等式
//难度:普及-
//考点:输入,输出 ,数组,取整,取模,将一个整数的个十百千万等位取出。  
//适用:小学生
//小技巧:穷举法,做了个超时测试i<=10000,j<=10000,发现算出答案与i<=1000,j<=1000相一致,提交时采用1000
//猜测:数据都在1000以内,因24-4=20等于10个1
#include <stdio.h>
int b[10]={6,2,5,5,4,5,6,3,7,6};//0-9火柴根数 
int fun(int n){
    int sum=0;
    if(n==0)
        return b[0];
    while(n){
        sum+=b[n%10];
        n/=10;
    }
    return sum;
} 
int main(){
    int i,j,n,m,count=0; 
    scanf("%d",&n);
    for(i=0;i<=1000;i++)
        for(j=0;j<=1000;j++){
            m=fun(i)+fun(j)+fun(i+j)+4;
            if(m==n)
                count++;
        }
    printf("%d\n",count);        
    return 0;
}
26.//p1217 回文质数
//难度:普及-
//考点:输入,输出 ,质数判定,回文数生成技巧  
//适用:小学生
//注意:过大的数组要开到main函数的外面。
//感悟:开始还没什么头绪,但接着题目往下看,题目还有详细的提示。
//思路:枚举题目范围内的所有回文数,判定质数进行存储,在题目给定的方位内进行查找
#include <stdio.h>
int a[10000];//存储质数
int count=0;//质数个数 
int isprime(int n){//质数返回1,非质数返回0 
    int i;
    if(n==1)
        return 0;
    if(n==2)
        return 1;
    for(i=2;i*i<=n;i++)
        if(n%i==0)
            return 0;
    return 1;
}
void palindrome(){
    int d1,d2,d3,d4,d5,t;
    //1个数
    for(d1=1;d1<=9;d1+=2)
        if(isprime(d1))
            a[count++]=d1;
    //2个数
    for(d1=1;d1<=9;d1+=2){
        t=d1*10+d1;
        if(isprime(t))
            a[count++]=t;
    }
    //3个数
    for(d1=1;d1<=9;d1+=2)
        for(d2=0;d2<=9;d2++){
            t=d1*100+d2*10+d1;
            if(isprime(t))
                a[count++]=t;
        }
    //4个数
    for(d1=1;d1<=9;d1+=2)
        for(d2=0;d2<=9;d2++){
            t=d1*1000+d2*100+d2*10+d1;
            if(isprime(t))
                a[count++]=t;
        }
    //5个数
    for(d1=1;d1<=9;d1+=2)
        for(d2=0;d2<=9;d2++)
            for(d3=0;d3<=9;d3++){
                t=d1*10000+d2*1000+d3*100+d2*10+d1;
                if(isprime(t))
                    a[count++]=t;
            }
    //6个数
    for(d1=1;d1<=9;d1+=2)
        for(d2=0;d2<=9;d2++)
            for(d3=0;d3<=9;d3++){
                t=d1*100000+d2*10000+d3*1000+d3*100+d2*10+d1;
                if(isprime(t))
                    a[count++]=t;
            }
    //7个数
    for(d1=1;d1<=9;d1+=2)
        for(d2=0;d2<=9;d2++)
            for(d3=0;d3<=9;d3++)
                for(d4=0;d4<=9;d4++){
                    t=d1*1000000+d2*100000+d3*10000+d4*1000+d3*100+d2*10+d1;
                    if(isprime(t))
                        a[count++]=t;
                }
    //8个数
    for(d1=1;d1<=9;d1+=2)
        for(d2=0;d2<=9;d2++)
            for(d3=0;d3<=9;d3++)
                for(d4=0;d4<=9;d4++){
                    t=d1*10000000+d2*1000000+d3*100000+d4*10000+d4*1000+d3*100+d2*10+d1;
                    if(isprime(t))
                        a[count++]=t;
                }
    //9个数
    for(d1=1;d1<=9;d1+=2)
        for(d2=0;d2<=9;d2++)
            for(d3=0;d3<=9;d3++)
                for(d4=0;d4<=9;d4++)
                    for(d5=0;d5<=9;d5++){
                        t=d1*100000000+d2*10000000+d3*1000000+d4*100000+d5*10000+d4*1000+d3*100+d2*10+d1;
                        if(isprime(t))
                            a[count++]=t;
                    } 
} 
int main(){
    int a2,b;
    int i;
    palindrome();
    scanf("%d%d",&a2,&b);
    for(i=0;i<count;i++)
        if(a[i]>=a2&&a[i]<=b)
            printf("%d\n",a[i]);
        else if(a[i]>b)
            break;
    return 0;
} 
2017-7-24 6:56 重新修改 p1217 回文质数

BOSS战-入门综合练习1

27.//p1478 陶陶摘苹果(升级版)
//难度:普及-
//考点:输入,输出 ,数组,结构体,排序  
//适用:小学生
//注意:存在力气用不完,苹果已摘完;存在力气不够用苹果已摘完。
//思路:找出能摘到的苹果,按消耗的力气由小到大排序。第一遍扫描,将能摘到的苹果存下来,采用结构体,数据比较清晰。
#include <stdio.h>
struct node{
    int x;
    int y;
}p[5000+10],p_t;//苹果 

int main(){
    int n,s;
    int i,j;
    int x,y;
    int a,b;
    int count=0;
    int num=0;
    scanf("%d%d",&n,&s);
    scanf("%d%d",&a,&b);
    for(i=0;i<n;i++){
        scanf("%d%d",&x,&y);
        if(a+b>=x){//存能摘到的苹果 
            p[count].x=x;
            p[count].y=y;
            count++;
        }
    }
    for(i=0;i<count;i++)//自小到大排序 
        for(j=i+1;j<count;j++)
            if(p[i].y>p[j].y){
                p_t=p[i];
                p[i]=p[j];
                p[j]=p_t;
                
            }
    for(i=0;i<count;i++)
        if(s>=p[i].y){
            s=s-p[i].y;
            num++;
        }else
            break; 
    printf("%d\n",num);
    return 0;
}
28.//p1618 三连击(升级版)
//难度:普及-
//考点:输入,输出 ,整数四则运算,数组,递归,深度优先遍历。  
//适用:小学生
//陷阱:编得高兴的时候,容易漏了 若无解,输出“No!!!”
#include <stdio.h>
#include <string.h>
int A,B,C;
int a[10],vis[10];
int count=0; 
void dfs(int step){
    int i;
    int b1,b2,b3;
    if(step==10){
        b1=a[1]*100+a[2]*10+a[3];
        b2=a[4]*100+a[5]*10+a[6];
        b3=a[7]*100+a[8]*10+a[9];
        if(b1*B*C==b2*A*C&&b2*A*C==b3*A*B){
            count++;
            printf("%d %d %d\n",b1,b2,b3);
        }
    }
    for(i=1;i<=9;i++)
        if(vis[i]==0){
            vis[i]=1;
            a[step]=i;
            dfs(step+1);
            vis[i]=0;
        }
}
int main(){
    memset(vis,0,sizeof(vis));
    scanf("%d%d%d",&A,&B,&C);
    dfs(1);
    if(count==0)
        printf("No!!!\n");
    return 0;
} 
29.//p1579 哥德巴赫猜想(升级版)
//难度:普及-
//考点:输入,输出 ,判断质数,数组
//适用:小学生
//思考:将2000以内的素数全部找出,三层循环,判断,输出符合条件的数据。
#include <stdio.h>
int a[20000];
int count=0; 
int isprime(int n){//0非质数 1质数 
    int i;
    if(n==1)
        return 0;
    if(n==2)
        return 1;
    for(i=2;i*i<=n;i++)
        if(n%i==0)
            return 0;
    return 1; 
}
void find(){
    int i;
    for(i=1;i<20000;i++)
        if(isprime(i))
            a[count++]=i;
}
int main(){
    int i,j,k;
    int n;
    int flag=0;
    find();
    scanf("%d",&n);
    for(i=0;i<count;i++){
        for(j=0;j<count;j++){
            for(k=0;k<count;k++)
                if(n==a[i]+a[j]+a[k]){
                    printf("%d %d %d\n",a[i],a[j],a[k]);
                    flag=1;
                    break;
                }
             if(flag==1)
                break;        
        }
        if(flag==1)
            break;
    }
    return 0;
}
30.//p2089 烤鸡
//难度:入门难度
//考点:输入,输出 ,暴力,或深度优先遍历  
//适用:小学生
//注意:过大的数组要开到main函数的外面。
//陷阱:没想到解的数量十分巨大,如何计算接的数量,(3333333333-1111111111)=2222222222还要研究
//思路:准备暴力破解,但for循环有10个,写得难受,采用dfs方式缩减代码。
//收获:成功的将多层for循环写成递归的形式,dfs搜索更上一层楼。
#include <stdio.h>
int a[100000][20],b[20];//a[20][20]开得太小了,导致WA 1000也要WA于是开到100000
int count=0;
int n;
void dfs(int step){
    int i,j;
    int sum;
    if(step==11){
        sum=0;
        for(j=1;j<=10;j++) 
            sum+=b[j];
        if(sum==n){
            for(j=1;j<=10;j++)
                a[count][j]=b[j];
            count++;
        }
        return;
    }
    for(i=1;i<=3;i++){
        b[step]=i;
        dfs(step+1);
    }
} 
int main(){
    int i,j;
    scanf("%d",&n);
    if(n>30){
        printf("0\n");
        return 0;
    }
    dfs(1);
    printf("%d\n",count);
    for(i=0;i<count;i++)
    {
        printf("%d",a[i][1]);
        for(j=2;j<=10;j++)
            printf(" %d",a[i][j]);
        printf("\n");
    }    
    return 0;
}

BOSS战-入门综合练习2

31.//p1426 小鱼会有危险吗
//难度:入门难度
//考点:输入,输出 ,等比数列,浮点数运算  
//适用:知识(高中生),编程(小学生)
//陷阱:测试点2挺奇葩的,3 4 y一开始就在猎人捕杀范围  
//疑惑:时间足够长,小鱼有可能没进猎捕范围就停下了。应该要判断。 经过等比数列计算a1/1-q=350米,故不用判断。

#include <stdio.h>
int main(){
    float s,x;
    float dis,sp;
    scanf("%f%f",&s,&x);
    dis=0;//第0秒
    if(dis>=s-x){//特列判断
        dis=7;//第一秒
        if(dis<=s+x)
            printf("y\n");
        else
            printf("n\n");
        return 0; 
    } 
    dis=sp=7;//第一秒 
    while(dis<s-x){
        sp*=0.98;//每秒距离 
        dis+=sp; 
    }
    //跳出循环,进入范围
    sp*=0.98;
    dis+=sp;
    if(dis>s+x)
        printf("n\n");
    else
        printf("y\n"); 
    return 0;
}
32.//p1464 Function
//难度:普及-
//考点:输入,输出 ,整数四则运算,取整,取模  
//适用:小学生
//注意:过大的数组要开到main函数的外面。
//小技巧:要设置一个计数变量
//陷阱:输出格式w(1, 1, 1) = 2注意有4个空格。 此题陷阱多多
//思考:题目的输入数据挺吓人,采用long long,看完题目突然看到记忆化搜索,正好2017-3-17
//看到《挑战程序设计竞赛(第2版)》巫泽俊 里有介绍,那么编起程序是手到擒来。
//提交:没有经过优化竟然全报TLE,突然醒悟到记忆化搜索该怎么编。再次提交RE,明白数组开小了
//注意:输入负数要单独处理,题目没看仔细,负数,或是超大的数都单独处理即可。生手毕竟生手。

#include <stdio.h>
#define n 30//改了mem[100][100][100]此处没改成30又折腾了一会 
long long mem[30][30][30];//mem[30][30][30]太小了 ,后来一看,开得够大了 
long long w(long long a,long long b,long long c){
    if(a<=0||b<=0||c<=0)
        return 1;
    if(a>20||b>20||c>20){
        if(mem[20][20][20]==0)
            mem[20][20][20]=w(20,20,20);
        return mem[20][20][20];
    }
    if(a<b&&b<c){
        if(mem[a][b][c-1]==0)
            mem[a][b][c-1]=w(a,b,c-1);
        if(mem[a][b-1][c-1]==0)
            mem[a][b-1][c-1]=w(a,b-1,c-1);
        if(mem[a][b-1][c]==0)
            mem[a][b-1][c]=w(a,b-1,c);
        return mem[a][b][c-1]+mem[a][b-1][c-1]-mem[a][b-1][c];
    }
    if(mem[a-1][b][c]==0)
        mem[a-1][b][c]=w(a-1,b,c);
    if(mem[a-1][b-1][c]==0)
        mem[a-1][b-1][c]=w(a-1,b-1,c);
    if(mem[a-1][b][c-1]==0)
        mem[a-1][b][c-1]=w(a-1,b,c-1);
    if(mem[a-1][b-1][c-1]==0)
        mem[a-1][b-1][c-1]=w(a-1,b-1,c-1);
    return mem[a-1][b][c]+mem[a-1][b-1][c]+mem[a-1][b][c-1]-mem[a-1][b-1][c-1];
}
int main(){
    long long a,b,c;
    for(a=0;a<n;a++)
        for(b=0;b<n;b++)
            for(c=0;c<n;c++)
                mem[a][b][c]=0;
    while(scanf("%lld%lld%lld",&a,&b,&c)==3){
        if(a==-1&&b==-1&&c==-1)
            break;
        if(a<=0||b<=0||c<=0)
            printf("w(%lld, %lld, %lld) = %lld\n",a,b,c,1);
        else if(a>20||b>20||c>20){
            if(mem[20][20][20]==0)
                mem[20][20][20]=w(20,20,20);
            printf("w(%lld, %lld, %lld) = %lld\n",a,b,c,mem[20][20][20]);
        }
        else{
            if(mem[a][b][c]==0)
                mem[a][b][c]=w(a,b,c);
            printf("w(%lld, %lld, %lld) = %lld\n",a,b,c,mem[a][b][c]);
        }
    }
    return 0;
}

33.配上该幅图,该题所要表达的意思就清楚了,不过纯粹由提供的数据想到该图对应的取数方法,还是很困难的。

//p1014 Cantor表
//难度:入门难度
//考点:输入,输出 ,找规律  
//适用:小学生
//小技巧:同一对角线上,分子降序,分母升序 ,分子+分母=定值
//配上该幅图,该题所要表达的意思就清楚了,不过纯粹由提供的数据想到该图对应的取数方法,还是很困难的。

#include <stdio.h>
int main(){
    int n,i;//n分子,i分母 
    int ascend;//分子升序1,降序0 
    scanf("%d",&n);
    i=1;
    ascend=0;
    while(n>i){
        n=n-i;
        i++;
        ascend=!ascend;
    }
    if(ascend==0){//降序
        n=i-n+1;//分子处理 
    }
    i=i-n+1;
    printf("%d/%d\n",n,i);
    return 0;
}
2017-3-19 上午10:20完结。

新手村通关。水平得以提升,掌握了多行字符串(包含空格)的处理,深度优先遍历(其中包括将多层循环写成递归形式),记忆搜索。

猜你喜欢

转载自blog.csdn.net/mrcrack/article/details/61419446