1.实验4-2-3 验证“哥德巴赫猜想” (20 分)
数学领域著名的“哥德巴赫猜想”的大致意思是:任何一个大于2的偶数总能表示为两个素数之和。比如:24=5+19,其中5和19都是素数。本实验的任务是设计一个程序,验证20亿以内的偶数都可以分解成两个素数之和。
输入格式:
输入在一行中给出一个(2, 2 000 000 000]范围内的偶数N。
输出格式:
在一行中按照格式“N = p + q”输出N的素数分解,其中p ≤ q均为素数。又因为这样的分解不唯一(例如24还可以分解为7+17),要求必须输出所有解中p最小的解。
输入样例:
24
输出样例:
24 = 5 + 19
#include<stdio.h>
#include<math.h>
int isPrime(int n);
int main()
{
int n,i;
scanf("%d",&n);
for(i = 2;i <= n/2;i++)//终值是i/2的原因:举例,34=17+17,而且质数p必须要小于q
{
if(isPrime(i)&&isPrime(n-i))//意思是这两个数都是素数
{
printf("%d = %d + %d",n,i,n-i);
break;
}
}
return 0;
}
int isPrime(int n)//建立一个求出素数的函数
{
int div;
for(div = 2;div <= sqrt(n);div++)
{
if(n%div == 0)
return 0;//不是素数
}
return 1;
}
2.实验4-1-12 黑洞数 (20 分)
黑洞数也称为陷阱数,又称“Kaprekar问题”,是一类具有奇特转换特性的数。
任何一个各位数字不全相同的三位数,经有限次“重排求差”操作,总会得到495。最后所得的495即为三位黑洞数。所谓“重排求差”操作即组成该数的数字重排后的最大数减去重排后的最小数。(6174为四位黑洞数。)
例如,对三位数207:
- 第1次重排求差得:720 - 27 = 693;
- 第2次重排求差得:963 - 369 = 594;
- 第3次重排求差得:954 - 459 = 495;
以后会停留在495这一黑洞数。如果三位数的3个数字全相同,一次转换后即为0。
任意输入一个三位数,编程给出重排求差的过程。
输入格式:
输入在一行中给出一个三位数。
输出格式:
按照以下格式输出重排求差的过程:
序号: 数字重排后的最大数 - 重排后的最小数 = 差值
序号从1开始,直到495出现在等号右边为止。
输入样例:
123
输出样例:
1: 321 - 123 = 198
2: 981 - 189 = 792
3: 972 - 279 = 693
4: 963 - 369 = 594
5: 954 - 459 = 495
#include<stdio.h>
int main()
{
int m,a,b,c,i=1,max,min,t;
scanf("%d",&m);
do{
c=m%10;//c代表的是个位数
b=m/10%10;//b代表的是十位数
a=m/100;//a代表的是百位数
if(a<b)
{
t=a;
a=b;
b=t;
}
if(a<c)
{
t=a;
a=c;
c=t;
}
if(b<c)
{
t=b;
b=c;
c=t;
}
max=a*100+b*10+c;//百位>十位>个位
min=c*100+b*10+a;//百位<十位<个位
m=max-min;
printf("%d: %d - %d = %d\n",i,max,min,m);
i++;
}while(m!=495);
return 0;
}
3.实验4-2-5 水仙花数 (20 分)
水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=13+53+33。 本题要求编写程序,计算所有N位水仙花数。
输入格式:
输入在一行中给出一个正整数N(3≤N≤7)。
输出格式:
按递增顺序输出所有N位水仙花数,每个数字占一行。
输入样例:
3
153
370
371
407
输出样例:
#include<stdio.h>
#include<math.h>
int p(int x,int y);
int main()
{
int a,b,sum=0;
int min,max;
int n;
scanf("%d",&n);
max=pow(10,n);
min=pow(10,n-1);//确定指定位数数字的取值范围
for(int i=min;i<max;i++)
{
a=i,sum=0;
while(a>0)
{
b=a%10;//依次取出个位的数
sum+=p(b,n);//个位数的n次方,n为位数
a/=10;
}
if(sum==i)//如果乘方的累加和等于当前数字
{
printf("%d\n",i);//这个书就是水仙花数
}
}
return 0;
}
int p(int x, int y)
{
int k;
k=x;
for(int i=1;i<y;i++)//说明执行(y-1)次循环
{
x=x*k;//实际上是x的y次方
}
return x;
}