第1题:简单斐波那契
斐波那契数列是一种非常有意思的数列,由 0 和 1 开始,之后的斐波那契系数就由之前的两数相加。用数学公式定义斐波那契数列则可以看成如下形式:
F0=0
F1=1
Fn=Fn-1+Fn-2
我们约定Fn表示斐波那契数列的第n项,你能知道斐波那契数列中的任何一项吗?
输入包括一行,包括一个数字N(0≤N≤50)。
输出包括一行,包括一个数字,为斐波那契数列的第N项的值。
样例输入
7样例输出
13其实for (i=2;i<num;i++)改成到num的根号就足够了。假设A*B=num,如果A大于根号num的话,在检查B的#include<iostream> using namespace std; int main() { int num,i=0; int f0=0,f1=1,result; cin>>num; switch(num) { case 0 : result=0; break; case 1: result=1; break; default: for (i=1;i<num;i++) { result=f0+f1; f0=f1; f1=result; } break; } cout<<result<<endl; return 0; } int main() { int num,i,flag,j; flag=1; scanf("%d",&num); for (i=2;i<num;i++) { if ((num%i) == 0) { flag=0; break; } } (flag==1) ? printf("YES\n") : printf("NO\n"); return 0; }
时候,就能检查到A能够整除num。第2题:判断质数
对于大于1的数,如果除了1和它本身,它不能再被其它正整数整除,那么我们说它是一个质数。晓萌想判断一个数是不是质数,希望找你写个程序,帮助她进行判断。
输入包括一行,为一个整数N(1 < N ≤1000),正是晓萌给出你让你判断的数字。
输出包括一行,如果晓萌给出的整数N为质数,那么输出YES;如果N不是质数,那么输出NO。
样例输入
3样例输出
YES#include<stdio.h> int main() { int num,i,flag,j; flag=1; scanf("%d",&num); for (i=2;i<num;i++) { if ((num%i) == 0) { flag=0; break; } } (flag==1) ? printf("YES\n") : printf("NO\n"); return 0; }
拓展:查找2-N之间的所有质数
之前是检查到num的根号,但是对num开根号会出现精度问题,所以可以用i*i<=num来代替,这样精度的问题解决了,速度也更快。#include<iostream> using namespace std; #define N 1000 int main() { int flag[N+1]; int i,j; for (i=2;i<=N;i++) flag[i]=1; for (i=2;i*i<=N;i++) { if (flag[i]) { j=i+1; for (;j<=N;j++) { if (j % i == 0) flag[j]=0; } } } j=0; for (i=2;i<=N;i++) { if (flag[i]) { j++; cout<<" "<<i; if (j % 10 == 0) cout<<endl; } } return 0; }
事实上可以更进一步:质数除了2,3 剩下的符合6n+1和6n+5,这样检查的次数可以更少了。第3题:加一
动态数组存放了一些个位数字(正数),组成一个大数。将这个数加1。
例如:
A = [2,3,1,1,4],
return [2,3,1,1,5]
A = [7,8,9],
return [7,9,0].
格式:
第一行输入一个正整数n,接下来的一行,输入数组A[n](每一位都是正数且为个位数)。
最后输出新的数组。
样例输入
5 8 9 9 9 9样例输出
9 0 0 0 0#include<stdio.h> #include<stdlib.h> int main() { int num,i; int flag=1;//进位标志 int *array; scanf("%d",&num); array=(int *)malloc(sizeof(int)*(num+1)); for (i=1;i<=num;i++) scanf("%d",(array+i)); for (i=num;i>0;i--) { if (flag) { array[i]+=1; flag=0; } if (array[i]>9) { flag=1; array[i]-=10; } else break; } //num input like 999 array[0]=flag; for(i=!flag;i<num;i++) printf("%d ",array[i]); printf("%d",array[num]); return 0; }
第4题:局部求合
输入20个整数,输出其中能被数组中其它元素整除的那些数组元素。
样例输入
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21样例输出
4 6 8 9 10 12 14 15 16 18 20 21#include<iostream> #include <string.h> using namespace std; int main () { int array[21]; int flag[21]; int i,j,m; for (i=1;i<21;i++) { cin>>array[i]; flag[i]=1; } for (i=1;i<21;i++) { for (j=1;j<21;j++) { if (j != i) { if (flag[j] == 1 && array[j] % array[i] == 0) flag[j]=0; } } } for (i=1;i<21;i++) if (flag[i] == 0) cout<<array[i]<<endl; return 0; }
第5题:泥塑课
小米是一个幼儿园老师,每学期的泥塑课上,她都会给每个学生发不超过250立方厘米的等量橡皮泥,教大家做泥塑。在上课过程中,她发现每个班都恰好有一个小朋友会去抢另一个小朋友的橡皮泥,于是她决定,在正式开始做泥塑前,让大家把手里的橡皮泥都捏成一个立方体,并且测量手里捏好的橡皮泥的长、宽和高。这样,她就可以知道谁被谁抢了橡皮泥了。
小米老师在不同的学期可能会带一个班或者同时带多个班,因此输入数据可能有一组或者多组。每组输入数据的第一行为一个整数n,表示了这个班的小朋友数,之后n行每行包括了由空格分隔的三个整数和一个字符串,那个字符串表示了小朋友的名字,前面三个整数则是这个学生手里橡皮泥块的长、宽、高数据。按照幼儿园的规定,每个班最多有9个小朋友,最少也要有2个小朋友,每个小朋友在学籍系统中的名称不超过8个字符长。当出现一个班级的小朋友数为-1时,表示没有更多的班级了。
输出行数与小米老师带的班级数相同,形式为“X took clay from Y.”,具体请参考样例输出。
样例输入
3 10 10 2 Jill 5 3 10 Will 5 5 10 Bill 4 2 4 10 Cam 4 3 7 Sam 8 11 1 Graham 6 2 7 Pam -1样例输出
Bill took clay from Will. Graham took clay from Cam.#include<stdio.h> #include<stdlib.h> typedef struct{ int num1; int num2; int num3; char name[10]; int all; }Student; int main() { int i,num; int aver=0; char result[2][10]; Student *ptr=NULL; scanf("%d",&num); while(1) { ptr=(Student *)malloc(sizeof(Student)*num); for (i=0;i<num;i++) { scanf("%d %d %d %s",&(ptr+i)->num1,&(ptr+i)->num2,&(ptr+i)->num3,(ptr+i)->name); (ptr+i)->all=(ptr+i)->num1*(ptr+i)->num2*(ptr+i)->num3; aver+=(ptr+i)->all; } aver/=num; for (i=0;i<num;i++) { if ((ptr+i)->all > aver) strcpy(result[0],(ptr+i)->name); if ((ptr+i)->all < aver) strcpy(result[1],(ptr+i)->name); } printf("%s took clay from %s.",(result[0]),(result[1])); aver=0; scanf("%d",&num); if (num == -1) break; else printf("\n"); } free(ptr); return 0; }
计蒜客(ACM)5题
最新推荐文章于 2021-05-28 21:01:00 发布