问题
两素数之差为2,则称该两素数为双胞胎数。求出[2,300]内:
- 所有素数并保存到文件prime.txt中;
- 有多少对双胞胎数;
- 最大的一对双胞胎数。
分析
首先脑子里要有文件操作的框架,
其次要知道素数怎么求。这里仅给出一种求素数的方法:就是判断n是否可以被
n
\sqrt n
n整除,
然后在找出的素数中找其他数,就很简单了。
代码
#include <stdio.h>
#include <math.h>
#define N 300
int prime(int n){ //判断素数
int k,i;
k = sqrt(n);
for(i=2;i<=k;i++)
if(n%i==0) //如果n被i整除,终止内循环,此时i<k+1
break;
if(i>=k+1) //若i≥k+1,表示n未曾被整除
return 1; //应确定n是素数
else return 0;
}
int main(){
int n,l,m=0,h[N],j=0,p=0,x=0,y=0,o[N];
FILE *fp;
fp = fopen("prime.txt","w");
for(n=2;n<=300;n++) { //遍历2~300对每个n进行判定
l = prime(n);
if(l) {
h[j] = n;
j++;
fprintf(fp, "%d\t", n); //将找到的素数写入文件
m++; //m用来在文件中控制换行,一行输入10个素数
if(m%10==0) //m累计到10的倍数,换行
fprintf(fp,"\n");
}
}
int aj = 0;
for(j=0;j<=300;j++) //找出双胞胎数
if(h[j+1]-h[j]==2) {
aj = j; //最大双胞胎数所对应的下标
p++; //统计有几对双胞胎数
}
printf("%d,%d\n",h[aj],h[aj+1]);
printf("%d对\n",p);
fclose(fp);
return 0;
}
结果
prime.txt
2 3 5 7 11 13 17 19 23 29
31 37 41 43 47 53 59 61 67 71
73 79 83 89 97 101 103 107 109 113
127 131 137 139 149 151 157 163 167 173
179 181 191 193 197 199 211 223 227 229
233 239 241 251 257 263 269 271 277 281
283 293