其他分享
首页 > 其他分享> > 68 素数

68 素数

作者:互联网

问题描述 :

明明的爸爸是一位数学家,明明受他爸爸的影响从小就喜欢数学,经常向他爸爸学习或请教数学问题。一天,明明问他爸爸什么是素数,明明的爸爸回答说:“首先,素数都是大于1的自然数;其次,素数是只能被1和其本身整除的数。例如‘3’这个数,它只能被1和3这两个整数整除,因此‘3’就是素数;但是‘4’就不是素数,因为4除了能被1和4整除外,还能被2整除,因此‘4’就不是一个素数。”明明对于爸爸的回答很满意,也很快明白了素数的定义。于是明明的爸爸就问明明:“明明,你现在知道了什么是素数,那我现在给你一个整数区间,你能告诉我在这个区间里,一共有多少个素数吗?” 例如:一个区间为[1,10],则在这个区间里一共有2、3、5、7,总共4个素数。 明明想了想,觉得这很简单,就说:“没问题。”于是明明爸爸就给了明明一个很大的区间,这下明明有点犯难了,由于区间太大,一个一个算过了会很花时间。聪明的明明想到了你,你总是乐于助人。明明想让你帮他写一个程序,用来计算在某一个整数区间内一共有多少个素数。 明明的问题可以归结为:给你一个整数区间,求出在这个区间里共有多少个素数。

输入说明 :

你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据仅有一行,每组测试数据有两个正整数M,N(0 < M ≤ N ≤ 1000000),表示一个整数区间。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。

输出说明 :

对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将每组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。每组运算结果为一个整数,即区间[M, N]内一共有多少个素数。每组运算结果单独形成一行数据,其行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间没有任何空行,第一组运算结果前面以及最后一组运算结果后面也都没有任何空行。 注:通常,显示屏为标准输出设备。

输入范例 :

1 10
10 30

输出范例 :

4
6

 

思想:这题需要对判断素数的算法优化一下,不能完全遍历,判断的中点要设置在根号x处,大于这个目标的就是重复数字,不会出现新的因子,因此无需判断,同时从第一个单数开始判断,双数均跳过,必不是素数。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int isVegetableNum(int x){
    if (x==0){
        return 0;
    }
    for(int i = 2;i<=sqrt(x);i++){
        if(x%i==0){
            return 0;
        }
    }
    return 1;
    
}
int main()
{
    int start,end, i, j, k,count;
    while(scanf("%d %d",&start,&end)!=EOF){
        count =0;
        if(start%2==0){
            start++;
        }
        for(i=start;i<=end;i+=2){
            if(isVegetableNum(i)){
                count++;
            }
        }
        printf("%d\n",count);
    }
    
}

 

标签:运算,明明,每组,测试数据,区间,素数,68
来源: https://www.cnblogs.com/End1ess/p/15973679.html