6.2 素数

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 }

 

转载于:https://www.cnblogs.com/wozixiaoyao/p/5683190.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值