赞
踩
素数,指的是大于1的整数中,只能被1和这个数本身整除的数
注意:1不是素数
假设这个数是n,我们就拿这个数和从2到n-1的每个数去和这个数做取余操作,如果有一个数可以使得余数为0,则这个数不是素数,反之则这个数为素数。
- //判断一个数是不是素数
- #include <stdio.h>
- int main()
- {
- int a;
- printf("请输入一个数:\n");
- scanf("%d", &a);
- int t=1;
- for (int i = 2; i < a; i++)
- {
- if (a % i == 0)
- {
- t = 0;
- break;
- }
- }
- if (t == 0)
- {
- printf("%d 不是素数!\n", a);
- }
- else
- {
- printf("%d是素数!\n", a);
- }
- return 0;
- }

每个数的因数中,其中一个不会超过本身的1/2;
比如:因为1*12=12 2*6=12 3*4=12 所以12的因数有1和12,2和6,3和4,每组因数中都有一个不会超过12这个数的1/2;
这样我们就可以对方法一优化一下
- #include <stdio.h>
- int main()
- {
- int a;
- printf("请输入一个数:\n");
- scanf("%d", &a);
- int t=1;
- for (int i = 2; i < a/2; i++)
- {
- if (a % i == 0)
- {
- t = 0;
- break;
- }
- }
- if (t == 0)
- {
- printf("%d 不是素数!\n", a);
- }
- else
- {
- printf("%d是素数!\n", a);
- }
- return 0;
- }

每个数的因数中,其中一个不会超过本身的开方;
比如:因为1*16=16 2*8=16 4*4=16 所以16的因数有1和16,2和8,4和4,每组因数中都有一个不会超过16这个数的开方;
这样我们就可以对方法二优化一下
- #include <stdio.h>
- #include <math.h>
- int main()
- {
- int a;
- printf("请输入一个数:\n");
- scanf("%d", &a);
- int t = 1;
- for (int i = 2; i <= sqrt(a); i++) //sqrt()是开方的意思,这个函数在math.h文件里
- {
- if (a % i == 0)
- {
- t = 0;
- break;
- }
- }
- if (t == 0)
- {
- printf("%d 不是素数!\n", a);
- }
- else
- {
- printf("%d是素数!\n", a);
- }
- return 0;
- }
-

- // 本题要求统计给定整数M和N区间内素数的个数并对它们求和.
-
- //1不是素数,单独考虑1
-
- #include <stdio.h>
- int main()
- {
- int m, n, flag = 0, sum = 0, t = 0;
- printf("请输入M和N的值(1<=m<=n<=500):\n");
- scanf("%d%d", &m, &n);
- for (int i = m; i <= n; i++)
- {
- if(i==1)
- i = 2;
- for (int j = 2; j < i; j++)
- {
- if (i % j == 0)
- {
- flag = 1;//不是素数,flag=1
- break;
- }
- }
-
- if (flag == 0) //flag==o,是素数的情况
- {
- t++;
- sum += i;
- // printf("%d为素数\n", i);//这句话可以用来输出素数
- }
- else //flag==0,不是素数的情况
- flag = 0;
- }
- printf("%d与%d之间有%d个素数\n", m, n, t);
- printf("它们的和为%d\n", sum);
- }

在判断一个数是不是素数的基础上加一个循环
- #include <stdio.h>
- #include <math.h>
- int main()
- {
- int number, isPrime = 1, x;
- printf("请输入一个数:\n");
- scanf("%d", &number);
- printf("%d里的素数有:", number);
- for (int y = 1; y <= number; y++)
- {
- for (int i = 2; i < sqrt(y); i++) // 判断y是不是素数//如果y不是素数,则isPrime = 0;
- {
- if (y % i == 0)
- {
- isPrime = 0;
- break;
- }
- }
-
- if (isPrime != 0)
- {
- printf("%d ", y);
- }
- else
- {
- isPrime = 1;
- }
- }
- return 0;
- }

1.令x为2
2.将2x、3x、4x直至ax (ax< n)的数标记为非素数
3.令x为下一个没有被标记为非素数的数,重复2
4.直到所有的数都已经尝试完毕
- //将n以内所有的数的isPrime值为1(真)——数组
-
- //将所有的2(3,4...)的倍数的数的isPrime值为0(假)——循环
-
- //输出剩下isPrime值为1(真)的数——循环
-
-
- #include <stdio.h>
- int main()
- {
- int i;
- int x;
- int maxNumber;
- printf("请输入一个数:\n");
- scanf("%d", &maxNumber);
- int isPrime[maxNumber+1];
- for (i = 1; i < maxNumber+1; i++)
- {
- isPrime[i] = 1; // 让所有的isPrime[i]值为1,即先将所有数标记为素数
- }
- for (x = 2; x < maxNumber; x++) // 让x从2开始,往后,x为下一个标记为素数的数,(因为for循环只有一个if语句,x如果是标记为非素数(isPrime[x]=0)的数,那么x无法进入if,那便继续x++,直到x为下一个没有标记为非素数的数即可进去if)
- {
- if (isPrime[x]) // isPrime为真(即为1)的话进入if
- {
- for (i = 2; i * x < maxNumber+1; i++) // i*x为 2(3,4...)倍的x
- {
- isPrime[i * x] = 0; // 令x的2(3,4...)倍数的数isPrime值为0
- }
- }
- }
- for (i = 2; i <= maxNumber; i++)
- {
- if (isPrime[i]) // isPrime为真(即为1)的话进入if
- {
- printf("%d ", i);
- }
- }
- printf("\n");
-
- return 0;
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。