nyist——ACM新生牛刀小试 Round#1题解

来源:互联网 发布:dracut命令安装linux 编辑:程序博客网 时间:2024/06/06 03:19

下述代码有任何疑问都可以就近向学长请教,一道题有多个代码的只要求会使用代码1的形式

A题:基本的输入输出+循环
代码:

#include<stdio.h>int main(){    int n;//定义n    scanf("%d",&n);//输入n    while(n--)//循环n次        printf("I Love Acm.\n");//每次都输出一行I Love Acm.    return 0;}

B题:基本的输入输出+保留整数(四舍五入)
代码:

#include<stdio.h>double PI=3.1415926;int main(){    double r;//定义r    while(scanf("%lf",&r)!=EOF)//多组输入        printf("%.0lf\n",4.0/3.0*PI*r*r*r);//输出体积    return 0;}

C题:循环语句的结束条件(无限组输入,a=0时结束)
代码1:

#include<stdio.h>int main(){    int a,b,c;//定义三个整型变量a,b,c    while(true)//无限执行while循环,因为判断条件为true    {        scanf("%d",&a);//输入a        if(!a)//如果a=0            break;//结束while循环        scanf("%d%d",&b,&c);//输入b和c        if(a+b>c&&a+c>b&&b+c>a)//任意两边之和大于第三边            printf("Great,you are genius!\n");//是三角形        else            printf("oh,my god!\n");//不是三角形    }}

代码2:

#include<stdio.h>int main(){    int a,b,c;//定义三个整型变量a,b,c    while(scanf("%d",&a)&&a)//无限输入n,当a=0时(1&&0的结果为0),while里边的判断条件为假结束循环    {        scanf("%d%d",&b,&c);//输入b和c        if(a+b>c&&a+c>b&&b+c>a)//任意两边之和大于第三边            printf("Great,you are genius!\n");//是三角形        else            printf("oh,my god!\n");//不是三角形    }}

D题:if判断语句的使用
代码:

#include<stdio.h>int main(){    int n;//定义n    scanf("%d",&n);//输入n    while(n--)//n组数据    {        int m;//定义m        scanf("%d",&m);//输入m        if(m>=90)//m不可能大于100,所以直接判断m是否大于等于90            printf("A\n");        else if(m>=80)//不满足第一个if条件,那么m肯定小于90,所以直接判断m是否大于等于80            printf("B\n");        else if(m>=70)//同理,直接判断m是否大于等于70            printf("C\n");        else if(m>=60)//同理,直接判断m是否大于等于60            printf("D\n");        else//剩下的就是小于60的数了            printf("E\n");    }    return 0;}

E题:和整型比较大小一样,注意用getchar吸收掉换行,考察逻辑能力?
代码:

#include<stdio.h>int main(){    int t;//定义整型变量t    scanf("%d",&t);//输入t    getchar();//getchar()吸收一个字符,吸收掉了t后的换行(换行也是字符)    while(t--)//t组数据    {        char a,b,c,temp;//定义字符型变量a,b,c,temp        scanf("%c%c%c",&a,&b,&c);//输入a,b,c,temp        getchar();//吸收掉了输入c后的换行        if(a>b)        {            temp=a;            a=b;            b=temp;        }//执行完if语句后,确定状态a<=b        if(b>c)        {            temp=b;            b=c;            c=temp;        }//执行完if语句后,确定状态b<=c(b的值有可能在此步骤后变化)        if(a>b)        {            temp=a;            a=b;            b=temp;        }//执行完if语句后,确定状态a<=b(因为b的值有可能在上一步中变化了,所以我们需要重新比较a和b的大小)        printf("%c %c %c\n",a,b,c);//输出a,b,c    }    return 0;}

F题:for循环和break的使用
代码1:

#include<stdio.h>int main(){    int a,b,c;//定义三个整型变量a,b,c    int flag=0;//定义变量flag,用以判断是否已经找到了满足条件的值    scanf("%d%d%d",&a,&b,&c);//输入a,b,c    for(int i=10; i<=100; ++i)//i从10一步一步递加到100    {        if(i%3==a&&i%5==b&&i%7==c)//i满足条件        {            flag=1;//flag=1表明已经找到了满足条件的值            printf("%d\n",i);//输出i            break;//结束循环语句        }    }    if(flag==0)//flag=0表明没有找到满足条件的值        printf("No answer\n");//输出No answer    return 0;}

代码2:

#include<stdio.h>int main(){    int a,b,c;    scanf("%d%d%d",&a,&b,&c);    for(int i=10; i<=100; ++i)    {        if(i%3==a&&i%5==b&&i%7==c)        {            printf("%d\n",i);            return 0;//直接结束main函数,表明后面的代码不会再执行了        }    }    printf("No answer\n");//能够执行到这里,表明前面并没有找到满足条件的值    return 0;}

G题:直接判断
代码1:

#include<stdio.h>int main(){    int n,m;    while(scanf("%d%d",&n,&m)!=EOF)//多组输入    {        if(n==0&&m==0)//n和m同时为0时,while循环结束            break;        int a[5],b[5];        a[1]=n%10;//n的个位        a[2]=n/10%10;//n的十位        a[3]=n/100;//n的百位        b[1]=m%10;//m的个位        b[2]=m/10%10;//m的十位        b[3]=m/100;//m的百位        int tot1=0,tot2=0,ans=0;//tot表示是否进位,ans表示有几次进位,tot1是个位进位,tot2是十位进位        if(a[1]+b[1]>9)            ++ans,tot1=1;        if(a[2]+b[2]+tot1>9)//n和m十位上的数加上个位的进位(如果个位不进位tot1为0,进位则tot1为1)            ++ans,tot2=1;        if(a[3]+b[3]+tot2>9)//同理            ++ans;        printf("%d\n",ans);    }    return 0;}

代码2:

#include<stdio.h>int main(){    int n,m;    while(scanf("%d%d",&n,&m)!=EOF)//多组输入    {        if(n==0&&m==0)//n和m同时为0时,while循环结束            break;        int ans=0;//ans记录有多少次进位        if((n%10)+(m%10)>9)//如果个位能进位        {            ++ans;//ans+1            if((n/10%10)+(m/10%10)>8)//如果十位能进位(个位进位了,所以十位上的和只要大于8,            {//再加上进位的1,最后结果肯定大于9)                ++ans;//ans+1                if(n/100+m/100>8)//如果百位能进位(同理)                {                    ++ans;//ans+1                }            }        }        else//个位没有进位        {            if((n/10%10)+(m/10%10)>9)//如果十位能进位(个位没进位,所以是>9)            {                ++ans;                if(n/100+m/100>8)//如果百位能进位(>8也是同上面的>8一样的道理)                {                    ++ans;//ans+1                }            }            else//十位也没有进位            {                if(n/100+m/100>9)//如果百位能进位(个位和十位都没有进位,所以是>9)                {                    ++ans;                }            }        }        printf("%d\n",ans);    }    return 0;}

代码3:

#include<stdio.h>int main(){    int n,m;    while(~scanf("%d%d",&n,&m),n||m)//仅是这里和代码1不一样,想了解这个的可以就近问学长    {        int ans=0;        if((n%10)+(m%10)>9)        {            ++ans;            if((n/10%10)+(m/10%10)>8)            {                ++ans;                if(n/100+m/100>8)                {                    ++ans;                }            }        }        else        {            if((n/10%10)+(m/10%10)>9)            {                ++ans;                if(n/100+m/100>8)                {                    ++ans;                }            }            else            {                if(n/100+m/100>8)                {                    ++ans;                }            }        }        printf("%d\n",ans);    }    return 0;}

H题:寻找最小值,
代码1:

#include<stdio.h>int main(){    int n,a[110];//定义整型变量n,和一个能容纳110个数据的整型数组a[110]    while(scanf("%d",&n)!=EOF)    {        if(!n)            break;        for(int i=1; i<=n; ++i)//输入n个数            scanf("%d",&a[i]);        int Min_v=a[1],index=1;//Min_v存储最小的数,index存储最小的数的下标,这句代码的意思就是假设a[1]为最小的值        for(int i=2; i<=n; ++i)//遍历后面的数,寻找更小的数            if(Min_v>a[i])//如果有更小的数                Min_v=a[i],index=i;//将更小的数的值赋给Min_v,同时更新更小的数的下标        int temp=a[1];//交换最小的数和第一个数        a[1]=a[index];//...        a[index]=temp;//...        for(int i=1; i<n; ++i)//输出交换后的序列            printf("%d ",a[i]);        printf("%d\n",a[n]);    }    return 0;}

代码2:

#include<stdio.h>int main(){    int n,a[110];    while(scanf("%d",&n),n)//仅是这里和代码1不一样,想了解这个的可以就近问学长    {        for(int i=1; i<=n; ++i)            scanf("%d",&a[i]);        int Min_v=a[1],index=1;        for(int i=2; i<=n; ++i)            if(Min_v>a[i])                Min_v=a[i],index=i;        int temp=a[1];        a[1]=a[index];        a[index]=temp;        for(int i=1; i<n; ++i)            printf("%d ",a[i]);        printf("%d\n",a[n]);    }    return 0;}

I题:判断素数
代码1:

#include<stdio.h>bool judge_isPrime(int x)//判断一个数x是否是素数{    if(x<2)        return false;    for(int i=2; i<x; ++i)//除了1和它本身外没有其他的约数        if(x%i==0)//如果有其他的约数            return false;//说明不是素数,返回false    return true;//能执行到这里说明没有其他的约数,返回true}int main(){    int t;    scanf("%d",&t);    while(t--)    {        int n;        scanf("%d",&n);        if(judge_isPrime(n))//先判断n是不是素数        {            printf("%d\n",n);//是素数则输出            continue;//输出后则之间跳过本次循环,开始进行下一次循环        }        for(int i=1,le=n,ri=n;ri<1000||le>1;++i)//循环的结束条件是le和ri都超出范围,只有一个超出范围还不能结束        {            ri=n+i;//ri表示右边的数            if(judge_isPrime(ri))//如果ri是素数            {                printf("%d\n",ri);//则输出ri                break;//并结束for循环            }            le=n-i;//le表示左边的数            if(judge_isPrime(le))//如果le是素数            {                printf("%d\n",le);//则输出le                break;//并结束for循环            }        }    }    return 0;}

代码2://这种方法如果实在看不懂可以直接略过

#include<stdio.h>int a[1010];void init()//素数筛法打表(大概第5天或者第6天会讲到,想提前了解的可以就近问学长){    a[0]=1,a[1]=1;    for(int i=2;i<=1000;++i)    {        if(!a[i])        {            for(int j=i+i;j<=1000;j+=i)                a[j]=1;        }    }}int main(){    init();    int t;    scanf("%d",&t);    while(t--)    {        int n;        scanf("%d",&n);        if(!a[n])        {            printf("%d\n",n);            continue;        }        for(int i=1,le=n,ri=n;ri<1000||le>1;++i)        {            ri=n+i;            if(!a[ri]&&ri<=1000)            {                printf("%d\n",ri);                break;            }            le=n-i;            if(!a[le]&&le>1)            {                printf("%d\n",le);                break;            }        }    }    return 0;}

J题:这种题观察规律后,直接模拟
代码:

#include<stdio.h>int main(){    int n,flag=0;//两组数据之间有空行,最后一组数据之后没空行,所以我们定义flag表示接下来的这组数据前面是否有过数据了    while(~scanf("%d",&n))    {        if(!flag)            flag=1;//这组数据就是下一组的前一组数据        else            printf("\n");//有数据则输出空行,这样就能保证两组数据之间有空行,最后一组数据之后没空行        for(int i=1; i<=n-1; ++i)//先模拟最长的那一行的上面n-1行        {            for(int j=1; j<=i-1; ++j)//第一个类型是空格,所以我们找出空格的规律                printf(" ");            for(int j=1; j<=n+1-i; ++j)//然后是*,找出*的规律                printf("*");            for(int j=1; j<=n-1-i; ++j)//然后又是空格,找规律                printf(" ");            for(int j=1; j<=i; ++j)//最后又是*没,找规律                printf("*");            printf("\n");//这样一行就结束了,所以输出换行        }        for(int i=1;i<=2*n-1;++i)//输出最长的那一行            printf("*");        printf("\n");        for(int i=1;i<=n-1;++i)//对下面的n-1行进行找规律        {            for(int j=1;j<=n-i;++j)//第一个类型是*                printf("*");            for(int j=1;j<=i-1;++j)//接着是空格                printf(" ");            for(int j=1;j<=i+1;++j)//接着*                printf("*");            for(int j=1;j<=n-1-i;++j)//最后空格                printf(" ");            printf("\n");//一行结束,则换行        }    }    return 0;}




下面的代码也是AC的代码,但是里面可能有一些东西比较难理解,所以下面的代码有兴趣的同学看一下就行了

#include<stdio.h>#include<algorithm>#include<math.h>using namespace std;const double PI=3.1415926;/*A题int main(){    int n;    scanf("%d",&n);    while(n--)        printf("I Love Acm.\n");    return 0;}*//*Bint main(){    double r;    while(~scanf("%lf",&r))        printf("%.0lf\n",4.0/3.0*PI*r*r*r);    return 0;}*//*Cint main(){    int a,b,c;    while(scanf("%d",&a))    {        if(!a)            break;        scanf("%d%d",&b,&c);        if(a+b>c&&a+c>b&&b+c>a)            printf("Great,you are genius!\n");        else            printf("oh,my god!\n");    }}*//*Dint main(){    int n;    scanf("%d",&n);    while(n--)    {        int m;        scanf("%d",&m);        if(m>=90)            printf("A\n");        else if(m>=80)            printf("B\n");        else if(m>=70)            printf("C\n");        else if(m>=60)            printf("D\n");        else            printf("E\n");    }    return 0;}*//*Eint main(){    int t;    scanf("%d",&t);    while(t--)    {        char a,b,c;        getchar();        scanf("%c%c%c",&a,&b,&c);        char x=min(min(a,b),c);        char y=max(max(a,b),c);        char z=(char)(a^b^c^x^y);        printf("%c %c %c\n",x,z,y);    }    return 0;}*//*Fint main(){    int a,b,c;    scanf("%d%d%d",&a,&b,&c);    for(int i=10; i<=100; ++i)    {        if(i%3==a&&i%5==b&&i%7==c)        {            printf("%d\n",i);            return 0;        }    }    printf("No answer\n");    return 0;}*//*Gint main(){    int n,m;    while(~scanf("%d%d",&n,&m),n||m)    {        int ans=0;        if((n%10)+(m%10)>9)        {            ++ans;            if((n/10%10)+(m/10%10)>8)            {                ++ans;                if(n/100+m/100>8)                {                    ++ans;                }            }        }        else        {            if((n/10%10)+(m/10%10)>9)            {                ++ans;                if(n/100+m/100>8)                {                    ++ans;                }            }            else            {                if(n/100+m/100>9)                {                    ++ans;                }            }        }        printf("%d\n",ans);    }    return 0;}*//*Hint main(){    int n,a[110];    while(scanf("%d",&n),n)    {        for(int i=1; i<=n; ++i)            scanf("%d",&a[i]);        int w=a[1],c=1;        for(int i=2; i<=n; ++i)            if(w>a[i])                w=a[i],c=i;        swap(a[1],a[c]);        for(int i=1; i<n; ++i)            printf("%d ",a[i]);        printf("%d\n",a[n]);    }    return 0;}*//*Iint a[1010];void init(){    a[0]=1,a[1]=1;    for(int i=2;i<=1000;++i)    {        if(!a[i])        {            for(int j=i+i;j<=1000;j+=i)                a[j]=1;        }    }}int main(){    int t;    init();    scanf("%d",&t);    while(t--)    {        int n;        scanf("%d",&n);        if(!a[n])        {            printf("%d\n",n);            continue;        }        for(int i=1,l=n,r=n;r<1000||l>1;++i)        {            r=n+i;            if(!a[r]&&r<=1000)            {                printf("%d\n",r);                break;            }            l=n-i;            if(!a[l]&&l>1)            {                printf("%d\n",l);                break;            }        }    }    return 0;}*//*Jint main(){    int n,flag=0;    while(~scanf("%d",&n))    {        if(!flag)            flag=1;        else            puts("");        for(int i=1; i<=n-1; ++i)        {            for(int j=1; j<=i-1; ++j)                printf(" ");            for(int j=1; j<=n+1-i; ++j)                printf("*");            for(int j=1; j<=n-1-i; ++j)                printf(" ");            for(int j=1; j<=i; ++j)                printf("*");            printf("\n");        }        for(int i=1;i<=2*n-1;++i)            printf("*");        printf("\n");        for(int i=1;i<=n-1;++i)        {            for(int j=1;j<=n-i;++j)                printf("*");            for(int j=1;j<=i-1;++j)                printf(" ");            for(int j=1;j<=i+1;++j)                printf("*");            for(int j=1;j<=n-1-i;++j)                printf(" ");            printf("\n");        }    }    return 0;}*/
原创粉丝点击