哥德巴赫猜想验证

前言

NWAFU 阶段2考试题目2 Content1102 BI


一、题目描述

题目描述

编写程序,在[m,n]范围内验证“任意大于2的偶数可以分解为2个素数之和”。其中,n、m在主函数中从键盘输入,分解偶数用函数resolve()实现,并在分解函数中嵌套判断素数的函数isprime()。主函数main()及程序主体已经完成,请根据给出下面的函数原型,写出分解函数和判断素数函数。
函数原型:
int isprime(int n);                        /* 判断整数n是否素数,是返回1,否则返回0 */
int resolve(int n);                        /* 分解偶数n,返回值为分解结果中最小的素数 */

二、设计步骤

偶数分解函数可以用循环实现:当循环变量 i 和 n-i 都为素数时,结束循环并将i作为返回值。

由于操作对象是一个连续的区间,每对区间中的数调用一次函数,循环都要从0开始,耗费内存资源。因此我们定义一个用来存储素数的数组,当进入循环时,只需在该数组中查找即可。

函数代码如下:

#include
#include
#define _CRT_SECURE_NO_WORNINGS
#define lenP 1001

int isprime(int n);                        /* 判断整数n是否素数,是返回1,否则返回0 */
int resolve(int n);                        /* 分解偶数n,返回值为分解结果中最小的素数 */

int isprime(int n)                         //素数判断函数
{
    int i,ret = 1;
    for(i = 2;i <= (n/i);i++){
        if(n % i == 0){
            ret = 0;
            break;
        }
    }
    return ret;
}

int resolve(int n)                         //偶数分解函数
{
    int i = 0,j = 2,ret;
    int Prime[lenP] = {0};                 //存有从2开始前1001个素数的工具数组

    while(i < lenP){                       //遍历赋值
        if(isprime(j)){
            Prime[i] = j;
            i++;
        }
        j++;
    }

    if(n < 2*Prime[lenP-1]){               //若n是一个较小的数,直接使用工具数组
        for(i = 0;i < lenP;i++){
            if(isprime(n - Prime[i])){
                ret = Prime[i];
                break;
            }
        }
    }
    else{
        for(i = Prime[lenP-i];;i++){      //否则从工具数组的最后一个数开始遍历
            if(isprime(i)){
                if(isprime(n - i)){
                    ret = i;
                    break;
                }
            }
        }
    }
    return ret;
}

主函数(用于测试)如下: 

int main(void)
{
    int m,n;
    int *rlt;
    int i;

    scanf("%d%d",&m,&n);
    rlt = (int *)malloc((n - m + 2)*sizeof(int));

    for(i = m;i <= n;i += 2){                 //测试对象为偶数,每次循环变量应当+2
        if(i-m)
            printf(" ");
        *(rlt+ i-m) = resolve(i);
        printf("%d",rlt[i-m]);
    }
    printf("\n");

    free(rlt);

    return 0;
}

总结

EOF

你可能感兴趣的:(c语言,学习方法)