计蒜客(ACM)5题

第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  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;
}


	




 
 
 
 
 
 
 
 

 
 
 
 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值