素数
素数百度百科:
质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数。
引入
本题要求实现一个判断素数的简单函数、以及利用该函数计算给定区间内素数和的函数。素数就是只能被1和自身整除的正整数。注意:1不是素数,2是素数。
计素数并求和:输入 2 个正整数 m 和 n(1≤m≤n≤500),统计 并输出 m 和 n 之间素数的个数以及这些素数的和。 素数就是只能被 1 和自身整 除的正整数,1 不是素数,2 是素数
分析
第一题没有规定区间,我们需要考虑当m、n的区间
什么素数(上面很清楚),我们可以写一个函数判断它是否是质数判断素数分三个区间 <=1、==2、>2
第二题有区间
思考怎么减少循环次数sqrt(m)
c(该区间素数之和1)
#include <stdio.h>#include <math.h>int prime( int p );int PrimeSum( int m, int n );int main(){int m, n, p;scanf("%d %d", &m, &n);printf("Sum of ( ");for( p=m; p<=n; p++ ) {if( prime(p) != 0 )printf("%d ", p);}printf(") = %d\n", PrimeSum(m, n));return 0;}/**写了这么多,也看懂套路,我们写的声明函数的封装,主函数调用封装函数就ok了*///传入一个数判断是否是素数,为素数时返回1,否则返回0int prime( int p ){//如何判断是否是素数,素数是除了1和它本身之外能够被其他数整除,在数学中1不是素数,2是素数//与三个区间 <=1 =2 >2//小于等于1的数都不是素数,2是素数if(p <= 1){return 0;} else if(p == 2){return 1;}else{//判断2以上的数是否是素数int i;for(i = 2; i < p; i++){if(p%i == 0){return 0;}}return 1;}}//统计该区间素数之和,函数PrimeSum返回区间[m, n]内所有素数的和。题目保证用户传入的参数m≤nint PrimeSum( int m, int n ){//自定义m≤nint t =0;if(m > n){t = m;m = n;n = t;}//定义变量接收m的值,定义变量统计素数之和int sum=0;for(; m <= n; m++){if(prime(m)){sum+=m;}}//返回素数之和return sum;}
c(该区间素数之和2)
#include <stdio.h>#include <math.h>int main (){/**计素数并求和:输入 2 个正整数 m 和 n(1≤m≤n≤500),统计 并输出 m 和 n 之间素数的个数以及这些素数的和。素数就是只能被 1 和自身整 除的正整数,1 不是素数,2 是素数。试编写相应程序。 */int m,n;scanf("%d%d",&m,&n);int i,j,count=0;double sum;for(;m <= n; m++){/**因为素数只能被1和它本身整除,但是网上很多人把那个数开平方 来看看开平方有什么好处,举个例子 3 - 16的素数: 3 ,5,7,11,13 判断结果变成了 i < 417 - 36的素数:17,19,23,31 判断结果变成了 i < 6 将 < n 变为 <= sqrt(n) 并不是随意写的,这样写是总结出来的,能够减少循环的次数 */ j = sqrt(m);for(i = 2; i <= j; i++){if(m % i == 0)break;}//执行完内层循环之后 i>j,同时1不是素数 if(i > j && m != 1){sum += m;count++;}}printf("m-n区间内有%d个素数\n",count);printf("m-n区间内素数的和是%.2lf",sum);return 0; }
java
public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int a = scanner.nextInt();Scanner scanner1 = new Scanner(System.in);int b = scanner1.nextInt();//定义变量count统计质数个数,计算质数之和int count = 0, sum = 0;//自定义a<ba = a>b?b:a;b = a<b?b:a;if(a == b) {System.out.println("你输入的区间有问题");}//在数学中1不是素数、2是素数比较特殊,我们单独处理if(a == 1 && b == 2){count = 1;System.out.println("该区间有1个质数");System.out.println("该区间质数之和:2");}else if(a == 1) {//循环传入两数的区间for(; a <= b; a++) {//如果是质数进行加1操作if(isprime(a)){count++;sum+=a;}}System.out.println("该区间有"+--count+"个质数");System.out.println("该区间质数之和:"+(sum-1));}else {//循环传入两数的区间for(; a <= b; a++) {//如果是质数进行加1操作if(isprime(a)){count++;sum+=a;}}System.out.println("该区间有"+count+"个质数");System.out.println("该区间质数之和:"+sum);}}//验证改数是否是质数public static boolean isprime(int a){//如何判断是否是质数,素数就是质数,一个大于1的数,除了它本身和 1之外,不能被其他自然数整除for(int i = 2; i < a; i++) {if (a%i==0) {return false;}}return true;}