素数

素数 (Prime Number) ,亦称质数,指在一个大于 1 的自然数中,除了 1 和此整数自身外,无法被其他自然数整除的数。换句话说,只有两个正因数( 1 和自己)的自然数即为素数。

1 大但不是素数的数称为合数。 1 0 既非素数也非合数。素数在数论中有着很重要的地位。

最小的素数是 2 ,也是素数中唯一的偶数(双数);其他素数都是奇数(单数)。素数有无限多个,所以不存在最大的素数。

围绕著素数存在很多数学问题、数学猜想和数学定理。著名的有孪生素数猜想和哥德巴赫猜想。

素数序列的开头是这样:

2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113

已经证明的定理

l  在一个数和它的 2 倍之间必存在一个素数。

l  存在任意长度的素数等差数列。(格林和陶哲轩, 2004 年)

l  一个偶数可以写成两个数字之和,其中每一个数字都最多祇有 9 个质因子。(挪威数学家布朗, 1920 年)

l  一个偶数必定可以写成一个素数加上一个合成数。(瑞尼, 1948 年)

l  一个偶数必定可以写成一个素数加上一个由 5 个因子所组成的合成数。后来,有人简称这结果为 (1 + 5) ( 中国潘承洞, 1968 )

未解之谜

l  哥德巴赫猜想:是否每个大于 2 的偶数都可写成两个素数之和?

l  孪生素数猜想:孪生素数就是差为 2 的素数对,例如 11 13 。是否存在无穷多的孪生素数?

l  斐波那契数列内是否存在无穷多的素数?

l  是否存在无穷多的梅森素数?

l  n2 (n + 1)2 之间是否每隔 n 就有一个素数?

l  是否存在无穷个形式如 n2 + 1 的素数?

l  黎曼猜想

素数的应用

素数近来被利用在密码学上,所谓的公钥就是将想要传递的信息在编码时加入素数,编码之后传送给收信人,任何人收到此信息后,若没有此收信人所拥有的密钥,则解密的过程中(实为寻找素数的过程),将会因为找素数的过程(分解质因数)过久,使即使取得信息也会无意义。

在汽车变速箱齿轮的设计上,相邻的两个大小齿轮齿数最好设计成素数,以增加两齿轮内两个相同的齿相遇啮合次数的最小公倍数,可增强耐用度减少故障。

在害虫的生物生长周期与杀虫剂使用之间的关系上,杀虫剂的素数次数的使用也得到了证明。实验表明,素数次数地使用杀虫剂是最合理的:都是使用在害虫繁殖的高潮期,而且害虫很难产生抗药性。

以素数形式无规律变化的导弹和鱼雷可以使敌人不易拦截。

100 200 间的全部素数

实现思路

判断一个数是否是素数只要从 2 开始到该数为止除该数,如果都没有余数,则表示该数是素数。而实质上只要从 2 开始到这个数开平方为止逐个除该数即可。

1.  2 开始到这个数开平方的整数为止,逐个除这该数。

2.  如果有余数则表示该数不是素数。

3.  如果全部都没有余数,则表示是素数,显示该数。

实现步骤

// PrimeNumber.cs

using System;

public class PrimeNumber{
    public static void Main(){
        int m,k,i,n = 0;
        for(m = 101; m <= 200; m = m + 2){
            k = Convert.ToInt32(Math.Sqrt(m +1));

            for(i = 2; i <= k; i++){
                if((m % i) == 0){
                    break;
                }
            }

            if(i >= k + 1){
                Console.Write(m + "/t");
                n = n+ 1;
            }

            if(m % 10 == 0)
                Console.WriteLine();
        }
    }
}

1000 以内素数和

实现思路

1.  定义一个整数用于保存素数和。

2.  分别判断 1000 以内那些数是素数。

3.  如果是素数则累加。

实现步骤

// PrimeSum.cs

using System;

class PrimeSum{
    public static bool Prime(int num){
        for(int i = 2; i <= (int)Math.Sqrt(num); i++){
            if((num  % i) == 0)
                return true;
        }
        return false;
    }

    public static void Main(){
        int nSumPrime = 0;
        for(int i = 2; i <= 1000; i++){
            if(Prime(i)){
                nSumPrime += i;
            }
        }

        Console.WriteLine("1000
之内的素数和为: {0}", nSumPrime);
    }
}

求一定范围的素数数目程序

实现思路

1.  获得一定范围。

2.  分别判断这个范围内的数是否是素数。

实现步骤

// PrimeNumberRange.cs

using System;

class PrimeNumber{
    public static bool Prime(int num){
        for(int i = 2; i <= (int)Math.Sqrt(num); i++){
            if((num  % i) == 0)
                return true;
        }
        return false;
    }
    public static void Main(){
        int number;

        Console.WriteLine("
请输入 number 的值 ");
        while(true){
            try{
                number = Convert.ToInt32(Console.ReadLine());
                break;
            }catch{
                Console.WriteLine("
输入数据不正确,请重新输入 ");
            }
        }

        int count = 0;
        for(int i = 2; i <= number; i++){
            if(!Prime(i)){
                Console.Write("{0}/t", i);
                count++;
            }
        }
        Console.WriteLine("/n
共有 {0} 个质数 ", count);
    }
}

显示前 500 个素数

实现思路

1.  定义一个统计变量统计素数的个数。

2.  判断数,如果是素数,则打印该数,并将统计变量 +1

3.  如果统计变量 >=500 ,则停止求素数。

实现步骤

// PrimeNumberSum500.cs

using System;

class PrimeNumber {
    public static bool Prime(int num) {
        for(int i = 2; i <= (int)Math.Sqrt(num); i++) {
            if((num % i) == 0)
                return true;
        }
        return false;
    }
    public static void Main(){
        int count = 0;
        for(int i = 2; i <= Int32.MaxValue; i++) {
            if(!Prime(i)) {
                count++;
                if(count % 20 == 0) {
                    Console.WriteLine("{0, -5}", i);
                } else {
                Console.Write("{0, -5}/t", i);
            }
        }
        if(count == 500) {
            break;
        }
        }
        Console.ReadLine();
    }
}

显示前 50 个平衡素数

平衡质数: 每一个质数都是它的前一个质数和后一质数相加后的平均值。

实现思路

1.  定义一个统计数统计平衡素数的个数。

2.  2 开始判断整数是否是素数,如果是素数将素数添加到列表中。

3.  判断集合中的素数是否等于它前一个素数和后一个素数的平均值。如果是的话显示该素数,并将统计变量 +1

4.  当统计变量 >=50 时停止计算。

实现步骤

// BalancedPrime.cs

/* 显示前 50 个平衡素数 */
using System;
using System.Collections.Generic;

class PrimeNumber {
    public static bool Prime(int num) {
        for(int i = 2; i <= (int)Math.Sqrt(num); i++) {
        if((num % i) == 0)
            return true;
        }
        return false;
    }
    public static void Main() {
        List<int> LPrimeNum = new List<int>();
        int count = 0;
        for(int i = 2; i <= Int32.MaxValue; i++) {
            if(!Prime(i)) {
                LPrimeNum.Add(i);
                if(LPrimeNum.Count > 2) {
                    if(LPrimeNum[LPrimeNum.Count - 3] +

                            LPrimeNum[LPrimeNum.Count - 1] ==
                            2 * LPrimeNum[LPrimeNum.Count - 2]) {
                        Console.Write("{0, 5}/t",

                                LPrimeNum[LPrimeNum.Count - 2]);
                        count++;
                    }
                }
            }
            if(count == 50) {
                break;
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜晚回家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值