6-7 PrimeNum1.c
1 #include <stdio.h> 2 #define MAXNUM 1000 //求1000以内的所有素数 3 int main() 4 { 5 int i,j,c=0; 6 int prime[MAXNUM+1]; //保存质数 7 for(i=2;i<=MAXNUM;i++) //初始化数组 8 prime[i]=1; //标志为1表示对应的数是质数 9 for(i=3;i<=MAXNUM;i++) //循环计算各数 10 { 11 prime[i]=PrimeNum(i); //计算数i是否为质数 12 } 13 for(i=2;i<MAXNUM;i++) //输出质数 14 { 15 if(prime[i]==1) //若是质数 16 { 17 printf("%4d ",i); //输出质数 18 c++; 19 if(c%10==0) //每行输出10个数据 20 printf("\n"); 21 } 22 } 23 printf("\n"); 24 getch(); 25 return 0; 26 } 27 int PrimeNum(int i) //判断数i是否为质数 28 { 29 int j,flag=1; 30 for(j=2;j<i-1;j++) //循环除以每个数 31 { 32 if(i%j==0) //i能被j整除,表示不是质数 33 { 34 flag=0; 35 break; 36 } 37 } 38 return flag; //返回结果 39 } 40 int PrimeNum1(int i) //判断数i是否为质数 41 { 42 int j,flag=1; 43 for(j=2;j*j<i;j++) //循环除以每个数 44 { 45 if(i%j==0) //i能被j整除,表示不是质数 46 { 47 flag=0; 48 break; 49 } 50 } 51 return flag; //返回结果 52 }
6-8 PrimeNum2.c
1 #include <stdio.h> 2 #define MAXNUM 1000 //求1000以内的所有素数 3 int main() 4 { 5 int i,j,c=0; 6 int prime[MAXNUM+1]; //保存质数 7 for(i=2;i<=MAXNUM;i++) //初始化数组 8 prime[i]=1; //标志为1表示对应的数是质数 9 for(i=2;i*i<=MAXNUM;i++) //循环处理前i个 10 { 11 if(prime[i]==1) //若为质数 12 { 13 for(j=2*i;j<=MAXNUM;j++) //筛去合数 14 { 15 if(j%i==0) //能被整除 16 prime[j]=0; //不是质数 17 } 18 } 19 } 20 for(i=2;i<MAXNUM;i++) //输出质数 21 { 22 if(prime[i]==1) //是质数,则输出 23 { 24 printf("%4d ",i); //输出质数 25 c++; 26 if(c%10==0) //每行输出10个质数 27 printf("\n"); 28 } 29 } 30 printf("\n"); 31 getch(); 32 return 0; 33 }
6-9 PalindromeNum1.c
1 #include <stdio.h> 2 int PrimeNum(int i); //判断质数 3 int main() 4 { 5 int i,j,t,k,s; 6 printf("1000以内的回文素数有:\n"); 7 for(i=0;i<=9;++i) //百位 8 for(j=0;j<=9;++j) //十位 9 { 10 if(i==0 && j==0) //若前两位都为0 11 continue; //重新循环 12 for(k=0;k<=9;++k)//个位 13 { 14 if(i!=0 && i!=k) //若百位不为0,且百位和个位不等 15 continue; //重新循环 16 s=i*100+j*10+k; //给合为一个整数 17 t=k*100+j*10+i; //组合为另一个整数(反序数) 18 if(i==0) //整数的第一位为0,是二位整数 19 t/=10; //调整反向组成的数 20 if(s>10 && s==t) //若大于10且为回文数 21 if(PrimeNum(s)==1)//若是素数 22 printf("%d\t",s); //输出回文数 23 } 24 } 25 getch(); 26 return 0; 27 } 28 int PrimeNum(int i) //判断数i是否为质数 29 { 30 int j,flag=1; 31 for(j=2;j*j<i;j++) //循环除以每个数 32 { 33 if(i%j==0) //i能被j整除,表示不是质数 34 { 35 flag=0; 36 break; 37 } 38 } 39 return flag; //返回结果 40 }
6-10 PalindromeNum2.c
1 #include <stdio.h> 2 int main(void) 3 { 4 int n,high,low,count=0; 5 int b[10]; //保存平方数的各位 6 long s; 7 printf("序号\t数值\t回文数\n"); 8 for(n=10;n<1000;n++) //循环所有范围 9 { 10 s=n*n; //计算n的平方 11 high=0; 12 while(s>0) 13 { 14 b[high++]=s%10; 15 s/=10; 16 } 17 low=-1; //低位指示器 18 while(++low<--high) //high是高位指示器 19 { 20 if(b[low]!=b[high]) //若高位和低位不相等,则不对称 21 break; //退出循环 22 } 23 if(low>=high)//所有高位和低位都比较后退出循环 24 printf("%2d\t%d\t%d\n",++count,n,n*n); //输出n和回文数 25 } 26 getch(); 27 return 0; 28 }
6-11 Goldbach1.c
1 #include <stdio.h> 2 int PrimeNum(int i) //判断数i是否为质数 3 { 4 int j,flag=1; 5 for(j=2;j*j<i;j++) //循环除以每个数 6 { 7 if(i%j==0) //i能被j整除,表示不是质数 8 { 9 flag=0; 10 break; 11 } 12 } 13 return flag; //返回结果 14 } 15 int main() 16 { 17 int n,i,j,flag; 18 printf("输入一个最大范围n(n>=6):"); 19 scanf("%d",&n); 20 if(n<6) //判断输入数据是否合法 21 { 22 printf("数据输入错误!\n"); 23 return 0; 24 } 25 for(i=6;i<=n;i+=2) //从6开始,循环验证各偶数 26 { 27 flag=1; 28 for(j=2;j<=i/2;j++) //判断组成每个数的两个加数 29 { 30 if(j%2==0 || ((i-j)%2==0)) continue; //若一个加数是偶数,不进行素数判断 31 if(PrimeNum(j) && PrimeNum(i-j)) //若两个加数都是素数 32 { 33 printf("%d=%d+%d\n",i,j,i-j);//输出素数 34 flag=0; //清除标志 35 break; 36 } 37 } 38 if(1==flag)//若某个偶数不是由两个奇数组成 39 printf("找到一个不符合要求的偶数:%d\n",j); 40 } 41 getch(); 42 return 0; 43 }
6-12 Goldbach2.c
1 #include <stdio.h> 2 #include <stdlib.h> 3 int CreatePrime(int n,int prime[]) 4 { 5 int i,j; 6 for(i=2;i<=n;i++) //初始化数组 7 prime[i]=1; //标志为1表示对应的数是质数 8 for(i=2;i*i<=n;i++) //循环处理前i个 9 { 10 if(prime[i]==1) //若为质数 11 { 12 for(j=2*i;j<=n;j++) //筛去合数 13 { 14 if(j%i==0) //能被整除 15 prime[j]=0; //不是质数 16 } 17 } 18 } 19 } 20 int main() 21 { 22 int n,i,j,flag; 23 int *prime; 24 printf("输入一个最大范围n(n>=6):"); 25 scanf("%d",&n); 26 if(n<6) //判断输入数据是否合法 27 { 28 printf("数据输入错误!\n"); 29 return 0; 30 } 31 if(!(prime=(int *)malloc(sizeof(int)*n))) 32 { 33 printf("分配内存失败!\n"); 34 getch(); 35 return 0; 36 } 37 CreatePrime(n,prime); //生成素数数组 38 for(i=6;i<=n;i+=2) //从6开始,循环验证各偶数 39 { 40 flag=1; 41 for(j=2;j<=i/2;j++) //判断组成每个数的两个加数 42 { 43 if(j%2==0 || ((i-j)%2==0)) continue; //若一个加数是偶数,不进行素数判断 44 if(prime[j]==1 && prime[i-j]==1) //若两个加数都是素数 45 { 46 printf("%d=%d+%d\n",i,j,i-j);//输出素数 47 flag=0; //清除标志 48 break; 49 } 50 } 51 if(1==flag)//若某个偶数不是由两个奇数组成 52 printf("找到一个不符合要求的偶数:%d\n",i); 53 } 54 getch(); 55 return 0; 56 }