首页 > 试题广场 >

任意一个大于2的偶数,都可以分解为两个质数之和。编写一个程序

[问答题]

  任意一个大于2的偶数,都可以分解为两个质数之和。编写一个程序,验证上述结论。

例如:输入16,  输出16=13+3

#include<iostream>
#include<cmath>
using namespace std;
bool isPrime( int num )
{
    //两个较小数另外处理
    if(num ==2|| num==3 )
        return 1 ;
    //不在6的倍数两侧的一定不是质数
    if(num %6!= 1&&num %6!= 5)
        return 0 ;
    int tmp =sqrt( num);
    //在6的倍数两侧的也可能不是质数
    for(int i= 5; i <=tmp; i+=6 )
        if(num %i== 0||num %(i+ 2)==0 )
            return 0 ;
    //排除所有,剩余的是质数
    return 1 ;
}
int main()
{
    int x;
    cin>>x;
    int i=2,j=x-i;
    if(x%2==0){
        while(i<=j){
            if(isPrime(i)&&isPrime(j)){
                cout<<x<<"="<<i<<"+"<<j<<endl;
                return 0;
            }
            i++;j--;
        }
        cout<<"Can't do it."<<endl;
    }else{
        cout<<"The number is not even."<<endl;
    }
    return 1;
}
学习一个判断质数的算法,减少一些不必要的判断。

发表于 2017-09-19 22:33:52 回复(1)
看了各位的思路比我简单很多
import random
def zhi_number(k):#判断是否是质数
    flag=True
    beichushu=2
    while beichushu<=k/2:
        if k%beichushu==0:
            flag=False
            break
        else:
            beichushu+=1
    return flag
def qiuzhishu(n):#求某个数的质数集合列表
    zhishu_list=list()
    chushu=2
    while chushu<n:
        if zhi_number(chushu)==True:
            zhishu_list.append(chushu)
        chushu+=1
    return zhishu_list
def yanzheng():
    name=random.randint(1,2**32)
    while name%2!=0:
        name=random.randint(1,2**32)
    # 随机生成一个偶数,范围很大,2的32次方
    zhishuset=qiuzhishu(name)
    falg=False
    for name1 in zhishuset:#在质数集合里找第一个加数
        for name2 in zhishuset:#找第二个加数
            if name==name1+name2:#判断想加是否等于随机生成的偶数
                falg=True
                break
    return falg
print(yanzheng())

发表于 2022-06-01 08:37:48 回复(0)
#include <stdio.h>
#include<iostream>
#pragma warning(disable : 4996)
int issprime(int x)
{
    if (x % 9 == 0)
        return 0;
    for (int i = 2; i <= x / 2; i++)
        if (x % i == 0)
            return 0;
        else
            return 1;
}
void main()
{
    int num;
    scanf("%d", &num);
    for (int x = num - 2; x >= num / 2; x--)
        if (issprime(x) == 1 && issprime(num - x) == 1)
        {
            printf("%d,%d", x, num - x);
            printf("\n");
        }
    
}
发表于 2022-02-27 10:21:43 回复(0)
#include<math.h>
#include<stdio.h>

int isprime(int x)
{//判断一个数是否是质数
    int start=2;
    while(start*start<=x)
    {//只需要试探到根号x就已经足够
        if(x%start==0)
            return 0;
        else
            start++;
    }
    return 1;
}

int main()
{
    int num,explore = 2,sub_explore;//explore从最小的质数开始试探
    printf("input an even number:");
    scanf("%d",&num);
    while(num%2)//如果输入的不是偶数就请求一个偶数
    {
        printf("erro!need an even number:\n");
        scanf("%d",&num);
    }
    sub_explore = num-explore;
    while(isprime(explore) && isprime(sub_explore))
        //用while循环寻找两个质数之和
    {
        explore++;
        sub_explore--;
        if(sub_explore>explore)//定理被推翻!!!
            printf("niubi!!!");
    }
    printf("%d can be broken down into %d and %d: ",num,explore,sub_explore);
    return 1;
}

编辑于 2021-11-29 21:09:38 回复(0)
不知道所需验证的“任意”偶数范围,所以这里为了通用采用概率方式做prime验证(基本可认为可任意大):
def primality(n):
    if n <= 102:
        for a in range(2, n):
            if pow(a, n - 1, n) != 1:
                return False
    else:
        import random
        for i in range(100):
            a = random.randint(2, n - 1)
            if pow(a, n - 1, n) != 1:
                return False
    return True

while True:
    try:
        A = int(input('Please input an even number:').strip())
        if A=='':
            break
        elif A%2!=0:
            print('Not even, please retry!')
            continue
        if A==4:
            print('4 = 2 + 2')
            continue
        halfA,flag = int(A/2),False
        # just need to check odd numbers, >=3
        for S in range(3,halfA+1,2):
            B = A - S
            if primality(S) and primality(B):
                flag = True
                print('%d = %d + %d' %(A,S,B))
        if not flag:
            print('%d cannot be divided!' %A)
    except:
        break
会逐行打印出所有可能的结果(若仅统计数目,可自行参考修改)        ——python 3.5
发表于 2019-07-16 16:10:30 回复(0)
//任意大于2的偶数,都可以分解成两个质数之和
#include<stdio.h>
int Su(int n){
int answer=1;
for(int temp=2;temp*temp<n;temp++){
if(n%temp==0)
answer=0;
}
return answer;
}
int main(void){
int a;
printf("Please Input a Number:\n");
scanf("%d",&a);
while(a%2!=0||a<=2){
printf("Wrong Input! Repeat:");
scanf("%d",&a);
}
for(int temp=1;temp<a;temp++){
if(Su(temp)&&Su(a-temp)){
printf("Answer:%d %d\n",temp,a-temp);
break;
}
}
return 0;
}

发表于 2019-07-13 22:01:17 回复(0)
//CodeBlocks
//第一次写这样的代码,感觉下面的算法已经足够应对考场的考试了。

#include<stdio.h>
#include<math.h>
int judge(long long number){
    long long i=2,k=0;
    k=(long long)sqrt(number);
    for(;i<=k;i++){
        if(number%i==0)
            break;
    }
    if(i>k)
        return 1;//yes
    else
        return 0;//no
}
int main(){
    long long inputNumber=0,i=0,k=0;
    while(scanf("%lld",&inputNumber)!=EOF){
        if(inputNumber<=2){
            printf("error!");
        }else if(inputNumber==3){
            printf("3\n");
        }else{//inputNumber>=4;
            if(inputNumber%2==0){//大于4的偶数
                for(long long j=2;j<inputNumber;j++){
                    if(judge(j)==1&&judge(inputNumber-j)==1){
                        printf("%lld=%lld+%lld\n",inputNumber,(inputNumber-j),j);
                        break;
                    }
                }
            }else{
                printf("error!\n");
            }
        }
    }
    return 0;
}


发表于 2017-05-13 21:18:14 回复(0)