nyist——ACM新生牛刀小试 Round#1题解
2017-10-04 00:05
344 查看
下述代码有任何疑问都可以就近向学长请教,一道题有多个代码的只要求会使用代码1的形式
A题:基本的输入输出+循环
代码:
B题:基本的输入输出+保留整数(四舍五入)
代码:
C题:循环语句的结束条件(无限组输入,a=0时结束)
代码1:
代码2:
D题:if判断语句的使用
代码:
E题:和整型比较大小一样,注意用getchar吸收掉换行,考察逻辑能力?
代码:
F题:for循环和break的使用
代码1:
代码2:
G题:直接判断
代码1:
代码2:
代码3:
H题:寻找最小值,
代码1:
代码2:
I题:判断素数
代码1:
代码2://这种方法如果实在看不懂可以直接略过
J题:这种题观察规律后,直接模拟
代码:
下面的代码也是AC的代码,但是里面可能有一些东西比较难理解,所以下面的代码有兴趣的同学看一下就行了
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) 1832b //同理,直接判断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 ); } 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 ); } 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 ) { 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; } */ /*B题 int main() { double r; while(~scanf("%lf",&r)) printf("%.0lf\n",4.0/3.0*PI*r*r*r); return 0; } */ /*C题 int 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"); } } */ /*D题 int 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; } */ /*E题 int 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; } */ /*F题 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; } } printf("No answer\n"); return 0; } */ /*G题 int 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; } */ /*H题 int 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 ); } return 0; } */ /*I题 int 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 ) { 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; } */ /*J题 int 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; } */
相关文章推荐
- nyist——ACM新生牛刀小试 Round#1题解
- nyist——ACM新生牛刀小试 Round#1题解
- nyist——ACM新生牛刀小试 Round#1题解
- nyist——ACM新生牛刀小试 Round#1题解
- nyist——ACM新生牛刀小试 Round#1题解
- nyist——ACM新生牛刀小试 Round#1题解
- nyist——ACM新生牛刀小试 Round#1题解
- nyist——ACM新生牛刀小试 Round#1题解
- nyist——ACM新生牛刀小试 Round#1题解
- nyist——ACM新生牛刀小试 Round#1题解
- nyist——ACM新生牛刀小试 Round#1题解
- nyist——ACM新生牛刀小试 Round#1题解
- nyist——ACM新生牛刀小试 Round#1题解
- nyist——ACM新生牛刀小试 Round#1题解
- http://acm.nyist.net/JudgeOnline/problem.php?pid=653
- 2015NCHU第一届ACM新生选拔赛F题题解
- ACM2016级新生第三周训练赛
- nyoj 21 到水问题 http://acm.nyist.net/JudgeOnline/problem.php?pid=21
- NYOJ 42 一笔画问题 http://acm.nyist.net/JudgeOnline/problem.php?pid=42
- SPFA+DP&&http://acm.nyist.net/JudgeOnline/problem.php?pid=203