计蒜客(ACM)5题

来源:互联网 发布:foxmail公司邮箱数据 编辑:程序博客网 时间:2024/06/09 22:02

第1题:简单斐波那契

斐波那契数列是一种非常有意思的数列,由 0 和 1 开始,之后的斐波那契系数就由之前的两数相加。用数学公式定义斐波那契数列则可以看成如下形式:

F0=0

F1=1

Fn=Fn-1+Fn-2

我们约定Fn表示斐波那契数列的第n项,你能知道斐波那契数列中的任何一项吗?

输入包括一行,包括一个数字N(0≤N≤50)。

输出包括一行,包括一个数字,为斐波那契数列的第N项的值。

样例输入

7

样例输出

13
#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;}
其实for (i=2;i<num;i++)改成到num的根号就足够了。假设A*B=num,如果A大于根号num的话,在检查B的
时候,就能检查到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  1000int 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](每一位都是正数且为个位数)。

最后输出新的数组。

样例输入

58 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 999array[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

样例输出

46891012141516182021
#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.”,具体请参考样例输出。

样例输入

310 10 2 Jill5 3 10 Will5 5 10 Bill42 4 10 Cam4 3 7 Sam8 11 1 Graham6 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;}






0 0