愉快的一天,不得不做的三件事:
种田,锄地,整代码!!!
【题目】
“1898——要发就发”。请将不超过1993的所有素数从小到大排成第一行,第二行上的每个数都等于它右肩上的素数之差。编程用函数实现并求出:第二行数中是否存在这样的若干个连续的整数,它们的和恰好是1898?假设存在的话,又有几种这样的情况?
第1行:2 3 5 7 11 13 17 ……1979 1987 1993
第2行:1 2 2 4 2 4 …… 8 6
【设计思路】
假设第1行中的素数为n[1]、n[2]、n[3]……n[j]…… , 第2行中的差值为m[1]、m[2]、m[3]……m[j]…… , 其中m[j]=n[j+1]-n[j],则第2行连续j个数的和为
SUM =m[1]+m[2]+m[3]+…+m[j]
=(n[2]-n[1])+(n[3]-n[2])+(n[4]-n[3])+…+(n[j+1]-n[j])
=n[j+1]-n[1]
由此题目就变成了:在不超过1993的所有素数中是否存在这样两个素数,它们的差恰好是1898。
若存在,则第2行中必有所需整数序列,其和恰为1898. 由分析可知,因为任意素数与2的差一定为奇数,所以不用考虑2.
【代码分析】
int prime(int n)
{
int i;
long k;
k = sqrt(n)+1;
for(i=2;i
if(n%i==0)
return 0;
return 1;
}
prime() 为判断是否为素数的函数,
若是,返回 1;若不是,返回 0.
for(i=3;i<=1993;i+=2)
{
if(prime(i))
num[j++]=i;
}
从3到1993,将所有的素数全部存在数组num[]中.
for(j--; num[j]>1898; j--)
{
for(i=0; num[j]-num[i]>1898; i++);
if(num[j]-num[i] == 1898)
{
k++;
printf("第%d种情况:%-4d - %-4d = 1898\n",k,num[j],num[i]);
}
}
依次匹配数组里的数字,若两数之差为1898,则k++,并打印此时的两位数字.
【代码展示】
C语言 要发就发#include
#include
#define N 1000
int prime();
void fa();
int main()
{
fa();
return 0;
}
int prime(int n)
{
int i;
long k;
k = sqrt(n)+1;
for(i=2;i
if(n%i==0)
return 0;
return 1;
}
void fa()
{
int i,j=0,num[N],k=0;
printf("-------欢迎进入操作界面-------\n\n");
for(i=3;i<=1993;i+=2)
{
if(prime(i))
num[j++]=i;
}
for(j--; num[j]>1898; j--)
{
for(i=0; num[j]-num[i]>1898; i++);
if(num[j]-num[i] == 1898)
{
k++;
printf("第%d种情况:%-4d - %-4d = 1898\n",k,num[j],num[i]);
}
}
}
【运行结果展示】
IT 农工要回家休息了,我们下期再见吧
记得点击“在看”进行收藏哦
往期精彩
C语言 捕鱼和分鱼
C语言 求π的近似值