C语言实现统计100以内所有素数的个数

目录
  • 题目描述
  • 分析
  • 代码实现
  • 运行结果
  • 后期完善
  • 网上参考

本人C语言萌新,最近工作中频频出现C语言小错误,遂决定使用笨方法提高我的C语言水平,坚持每天一个C语言小练习,养成C语言手感,从此让编程成为习惯。

题目描述

统计100以内所有素数的个数

分析

素数(prime number)又称质数,在大于1的自然数中,除了1和它本身以外不再有其他因数的数称为质数,2是最小的素数。

代码实现

#include <stdio.h>

#define INTEGER_RANGE 100  //数字范围

int if_prime(int num);

int main()
{
    int sum = 0;
    /* 2是最小的素数,for循环范围为2-100 */
    for(int i = 2; i <= INTEGER_RANGE; i++)
    {
        if(if_prime(i))
            sum++;
    }
    printf("%d以内的素数个数为:%d\n", INTEGER_RANGE, sum);
    return 0;
}

/*
 * 判断是否为素数,是则返回1,否返回0
 * */
int if_prime(int num)
{
    int i = 0;
    for(i = 2; i < num; i++)
    {
        /* 如果该数有存在1以外的其他正因数,则不是素数 */
        if(num % i == 0)
            return 0;
    }
    return 1;
}

运行结果

后期完善

这里只对if_prime(num)函数进行完善:

  1. 增加非法数字的判断,num小于2直接返回0
  2. 将循环范围由2~num-1改成2~sqrt(num)

至于为什么用sqrt,这里借用下别人的解释(比较通俗易懂)

当一个数不是素数的时候,那这数肯定是除了它本身和1外的两个数之积( a*b = m ),如果设 a是小于或者等于 b的数,那 a肯定是小于等于 m的开根,即 a <= sqrt( m ) 。——百度贴吧(C语言吧)

还有一种用法是把num改成num/2,但是当num大于4时,sqrt(num)num/2小,所以用sqrt(num)的效率比用num/2高。
至于为什么可以用num/2,这里也借用别人的解释(有点难懂)

其实这是数学知识,n不除以2也行,只是运算量更大,其实最少运算量的方法是n开根号。
我证明一下合理性吧。用反证法。
如果一个数是合数,则一定能分解成两个不是1的数相乘,所以能被分解成一个大于等于2的数和一个小于等于n/2相乘。
如果这个数没有一个小于等于n/2的因数,那它一定不是合数,所以它一定是素数,不用再检查后面的数了。这里是小于n/2,是因为如果这个数能被n/2整除,那2一定是它的因数,很容易知道2小于等于n/2,所以在检查n/2之前一定检查过2。证明完成!
n开根号也差不多这样证明。——https://fishc.com.cn/thread-181309-1-1.html

如果你对上面的两种用法都不理解,那记住它们就行了。。。

#include <math.h>
/*
 * 判断是否为素数,是则返回1,否返回0(改进版)
 * */
int if_prime(int num)
{
    if(num < 2)
        return 0; //最小的素数为2
    int i = 0;
    //sqrt():开方函数(一定要写小于等于)
    for(i = 2; i <= sqrt(num); i++)
    {
        /* 如果该数有存在1以外的其他正因数,则不是素数 */
        if(num % i == 0)
            return 0;
    }
    return 1;
}

网上参考

原文链接:https://www.runoob.com/cprogramming/c-exercise-example36.html
sqrt()为开方函数,需要加math.h头文件

//  Created by www.runoob.com on 15/11/9.
//  Copyright  2015年 菜鸟教程. All rights reserved.
//

#include<stdio.h>
#include<math.h>
int main()
{
    int i,j,k,n=0;
    for(i=2;i<=100;i++)
    {
        k=(int)sqrt(i);
        for(j=2;j<=k;j++)
            if(i%j==0) break;
        if(j>k)
        {
            printf("%d ",i);
            n++;
            if(n%5==0)
                printf("\n");
        }
    }
    return 0;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C语言练习之数组中素数交换

    目录 题目要求 总结 题目要求 (1)在主函数中创建数组num,使用测试数据{108 4 19 7 23 66 49 13 33 35}对其初始化: (2)定义change函数,将num数组中的素数首尾交换,即第一个素数与最后一个素数交换,第二个素数与倒数第二个素数交换-,非素数保持位置不变: (3)定义prime函数,用于素数的判断. #include <stdio.h> #include <math.h> int prime(int num) { int i,k; if(num

  • C语言判断数是否为素数与素数输出

    目录 1.判断单个数是否为素数(多组输入) 2.输入范围输出范围内的素数 3.总结 素数的概念:素数也叫质数,是一种只能被自己本身和1整除的数并且大于1,当然0与1不是素数. 1.判断单个数是否为素数(多组输入) 我的思路是,首先输入一个数,利用素数的概念来判断是非为素数,是的话输出素数:否则不输出. 关于素数的判断首先我们吧输入的数当初被除数,我选择用一个for循环来实现,从2开始当除数,每轮加1,一直循环去除被除数,一直除到被除数减一那个数,要是期间能被一个数整除则跳出循环不为素数,要是一直

  • C语言判断一个数是否为素数方法解析

    一.概念介绍 素数又称为质数.一个大于1的自然数(从2开始),除了1和它本身外,不能被其他自然数整除的叫做素数,否则称为合数. 0和1既不是素数也不是合数,最小的素数是2. 二.代码 方法一: bool is_Prime(int num){ int i; for(i = 2;i <= sqrt(num);i++){ if(num % i == 0)//一旦发现有因子,则返回false return false; } return true; } 注意:在for循环判断时不能忘记 i <= sq

  • C语言实现求梅森素数的代码与解析

    问题描述 梅森数(Mersenne Prime)指的是形如2n-1的正整数,其中指数n是素数,即为Mn.如果一个梅森数是素数,则称其为梅森素数.例如22-1=3.23-1=7都是梅森素数. 当n=2,3,5,7时,Mn 都是素数,但n=11时,Mn=M11=211-1=2047=23X89,显然不是梅森素数. 1722年,瑞士数学大师欧拉证明了231-1=2147483647是一个素数,它共有10位数,成为当时世界上已知的最大素数. 迄今为止,人类仅发现了47个梅森素数.梅森素数历来都是数论研究

  • C语言实现统计100以内所有素数的个数

    目录 题目描述 分析 代码实现 运行结果 后期完善 网上参考 本人C语言萌新,最近工作中频频出现C语言小错误,遂决定使用笨方法提高我的C语言水平,坚持每天一个C语言小练习,养成C语言手感,从此让编程成为习惯. 题目描述 统计100以内所有素数的个数 分析 素数(prime number)又称质数,在大于1的自然数中,除了1和它本身以外不再有其他因数的数称为质数,2是最小的素数. 代码实现 #include <stdio.h> #define INTEGER_RANGE 100 //数字范围 i

  • C#实现统计100以内所有素数的个数

    简要介绍 统计100以内所有素数的个数 分析 素数(prime number)又称质数,在大于1的自然数中,除了1和它本身以外不再有其他因数的数称为质数,2是最小的素数. 代码实现 //最大范围内数字 int MaxNum = 100; //所有素数和,初始0 int sum = 0; //2是最小的素数,for循环范围为2-100 for (int i = 2; i <= MaxNum; i++) { if (if_prime(i)) { //统计所有素数之和 sum++; } } //判断数

  • GO语言求100以内的素数

    本文实例讲述了GO语言筛选法求100以内的素数.分享给大家供大家参考.具体实现方法如下: 思路:找出一个非素数就把它挖掉,最后剩下就是素数. 下面就来欣赏一下go简洁的代码吧 目前不支持GO的代码插入,使用xml的代替一下. 复制代码 代码如下: package main import (     "fmt"     "math" ) func main() {     var i, j, n int     var a [101]int     for i = 1

  • python如何求100以内的素数

    方法一,用for循环来实现 num=[]; i=2 for i in range(2,100): j=2 for j in range(2,i): if(i%j==0): break else: num.append(i) print(num) 方法二,用函数来实现 import math def func_get_prime(n): return filter(lambda x: not [x%i for i in range(2, int(math.sqrt(x))+1) if x%i ==

  • java求100以内的素数示例分享

    题目:求100之内的素数 方法一: package airthmatic; public class demo8 { /** * 素数是指因数只有1和本身的数字 * @param arg */ public static void main(String arg[]) { for(int i=1;i<=100;i++) { if(find(i)) System.out.print(i+" "); } } /** * 1-n个自然数中的素数 * @param n * @return

  • 使用c语言判断100以内素数的示例(c语言求素数)

    从console输入一个数,判断这个数是否为素数(质数). 复制代码 代码如下: #include <stdio.h> /**判断100以内的素数*/ //定义函数判断是否是素数int isPrime(int num ){    int i;    //从2开始循环,一直到i的平方小于等于给定的数.    for (i = 2; i*i <= num; i++) {        if ( ( num % i ) == 0 ) {            return 0;       

  • Python求出0~100以内的所有素数

    质数又称素数.一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数:否则称为合数. 一.判断一个数是否为素数: 基于定义 def is_prime(num): if num <= 1: return '%d是一个合数' % num for i in range(2, num): if not num % i: return '%d是一个合数' % num else: return '%d是一个素数' % num 考虑合数的性质 def is_prime(num): if num

  • java使用筛选法求n以内的素数示例(java求素数)

    复制代码 代码如下: /** * @author jxqlovedn * 埃拉托斯特尼素数筛选法,请参考:http://zh.wikipedia.org/zh-cn/埃拉托斯特尼筛法 */public class AratosternyAlgorithm { public static void getPrimes(int n) {  if(n < 2 || n > 1000000)   // 之所以限制最大值为100万,是因为JVM内存限制,当然有其他灵活方案可以绕过(比如位图法)   th

  • java求100之内的素数(质数)简单示例

    质数又称素数.一个大于1的自然数,如果除了1和它自身外,不能被其他自然数整除的数:否则称为合数.根据算术基本定理,每一个比1大的整数,要么本身是一个质数,要么可以写成一系列质数的乘积:而且如果不考虑这些质数在乘积中的顺序,那么写出来的形式是唯一的.下面是一个java求100之内的素数简单示例 复制代码 代码如下: public class test { public static void main(String[] args) {  int i,n,k=0;     for (n = 3; n

  • C语言经典例程100例(经典c程序100例)

    我们小编注:以下代码因为编辑器等原因,需要将原来空白区域用tab或空格替换即可运营. [程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去掉不满足条件的排列. 2.程序源代码 main() { int i,j,k; printf("\n"); for(i=1;i<5;i++) /*以下为三重循环*/ for(j=1;j<5;j++) for (k=1

随机推荐