問題
兩素數之差爲2,則稱該兩素數爲雙胞胎數。求出[2,300]內:
- 所有素數並保存到文件prime.txt中;
- 有多少對雙胞胎數;
- 最大的一對雙胞胎數。
分析
首先腦子裏要有文件操作的框架,
其次要知道素數怎麼求。這裏僅給出一種求素數的方法:就是判斷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