永发信息网

c语言编程题目 整数n=p*q,p和q为质数,且p≠q,我们称n为D-Prime,请写个程序判断一个数是不是D_Prime。

答案:3  悬赏:60  手机版
解决时间 2021-03-23 16:30
c语言编程题目 整数n=p*q,p和q为质数,且p≠q,我们称n为D-Prime,请写个程序判断一个数是不是D_Prime。
最佳答案
您好,我把之前的code优化了下,加入了素数数组,保存之前,计算过程中,发现的素数,并且在查找时,用了二分查找。你试试看是否还会超时吧。
(在codeblock下测试过,没有问题)
#include
#include
#define N 100000  //sqrt(NMAX)
#define NMAX 100000000

int binary_search(int src[], int num,int tar){//二分查找
int head = 0;
int tail = num - 1;
int mid;
while(head < tail){
mid = (head + tail) / 2;
if(src[mid] == tar){
return 1;
}else if(src[mid] < tar){
head = mid + 1;
}else
tail = mid - 1;
}
if(src[head] == tar){
return 1;
}
return 0;
}
int is_prime(int tar, int *prime_lib, int *next_idx){//判断是否为素数
if(tar < prime_lib[*next_idx - 1]){
if(binary_search(prime_lib, *next_idx, tar) == 1)
return 1;
else
return 0;
}
    int i = 1;
int tmp_end = sqrt((float)tar);
    while(i < *next_idx && prime_lib[i]<= tmp_end){//只考虑素数数组里的
        if(tar % prime_lib[i] == 0)
            return 0;
        i++;
    }
if(i == *next_idx){//大于素数最大时,依次增加1
int cur_val = prime_lib[*next_idx - 1] + 1;
while(cur_val <= tmp_end){
if(is_prime(cur_val,prime_lib, next_idx)){
prime_lib[(*next_idx)++] = cur_val;
if(tar % cur_val == 0)
return 0;
}
cur_val++;
}
}
    
    return 1;
}
int main(){
int prime_lib[N]; //保存之前过程中找到的素数,按大小顺序保存
prime_lib[0] = 1;
prime_lib[1] = 2;
int next_value = 2;
int *next_idx = &next_value;
    int num, i, j;
    scanf("%d", &num);
    for(i = 0; i < num; i++){
        int cur_val;
        scanf("%d", &cur_val);
        int flag = 0; //标记
        for(j = 1; j<= sqrt((float)cur_val); j++){//这里也有优化
            if(cur_val % j ==0&&j!=cur_val/j&&is_prime(j,prime_lib, next_idx) && is_prime(cur_val / j, prime_lib, next_idx)){
            //这里的if条件就是判断当前的元素,是否满足条件
            //1.从左往右,依次判断cur_val是否能整除j
            //2.如果1.满足,则看j和cur_val/j是否相等,相等,不满足题意
            //3.如果2满足,则判断j是否是质数
            //4.如果3满足,则判断cur_val/j是否是质数
            //如果4满足则说明这个数,满足题意了。
                printf("YES
");
                flag = 1;
                break;
            }
        }
        if(!flag)
            printf("NO
");
    }
    return 0;
}追问太复杂了。表示有点看不懂啊!还有素数和1也是的,素数和1 不是不是的吗?望指教,尽量简洁好懂一点,谢谢,帮帮忙吧!来自:求助得到的回答
全部回答
#include 

int prime(int n)
{
    int i;

    for (i = 2; i * i <= n; i++)
        if (n % i == 0)
            return 0;
    return 1;
}

int foo(int n)
{
    int i;

    for (i = 2; i * i < n; i++)
        if (n % i == 0 && prime(i) && prime (n / i))
            return 1;
    return 0;
}

int main(void)
{
    int k, n;

    scanf("%d", &k);

    while (k--) {
        scanf("%d", &n);

        if (foo(n))
            printf("yes ");
        else
            printf("no ");

    }

    return 0;
}追问不好意思,错了。可不可以优化点啊!
Acceteped : 254 Submit : 1037Time Limit : 2000 MS
Memory Limit : 65536 KB
你的那个1,2,3,不能过啊!他们不是吧!望指教,谢谢
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
为什么新房有香味?
拉黑的人怎么让他不发加好友的消息呢?
韩国吕牌染发膏怎么用?
能令我一生记得的往事,最后也只不过平淡如此
单选题下列语句中,没有语病的一句是()A.山
在古代怎么称呼日月?有几种叫法
外地户口在郑州上小学都需要什么证件?
热血江湖 刀客 反湖升级 需要哪些药品?药品
龙江银行牡丹江阳明支行地址有知道的么?有点
包的五金磨损怎么处理,银镯子在地上磨损怎么
求药品/保健品发票,北京药房的,1500,谁知
如何将Matlab程序移植到Android平台上?
喝红酒,吃月饼影响长高吗,我刚16,175= =
为什么查不出来?
单选题下列句子中没有语病的一项是A.新加坡的
推荐资讯
急~简历中要求——请粘贴本人五寸近期全身彩
用津津有味,造句
狗狗患真菌医生说搽真泰舒有效,但狗患狗搽了
还珠格格第三部所有歌曲
关于屋子的诗句,描写房间很简陋的句子(要求
^ 符号在变量正上方数学上读什么
金海兰宾馆怎么去啊,有知道地址的么
麻烦简历照 p个西装上去 ,正装
2012年3月,财政部向十一届全国人大五次会议
和出轨过的女人复婚,是不是一种耻辱?而已一
地下城与勇士,剑圣装备雷剑、白书、精炼一套
王者荣耀阿呵1技能是普攻吗
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?