c语言编程题目 整数n=p*q,p和q为质数,且p≠q,我们称n为D-Prime,请写个程序判断一个数是不是D_Prime.输入第一行是一个整数K,表示样例的个数.以后每行是一个整数x,(1 ≤ x ≤ 100,000,000);输出每行输

来源:学生作业帮助网 编辑:作业帮 时间:2024/04/29 12:21:42
c语言编程题目 整数n=p*q,p和q为质数,且p≠q,我们称n为D-Prime,请写个程序判断一个数是不是D_Prime.输入第一行是一个整数K,表示样例的个数.以后每行是一个整数x,(1 ≤ x ≤ 100,000,000);输出每行输

c语言编程题目 整数n=p*q,p和q为质数,且p≠q,我们称n为D-Prime,请写个程序判断一个数是不是D_Prime.输入第一行是一个整数K,表示样例的个数.以后每行是一个整数x,(1 ≤ x ≤ 100,000,000);输出每行输
c语言编程题目 整数n=p*q,p和q为质数,且p≠q,我们称n为D-Prime,请写个程序判断一个数是不是D_Prime.
输入
第一行是一个整数K,表示样例的个数.以后每行是一个整数x,(1 ≤ x ≤ 100,000,000);
输出
每行输出一个样例的结果,如果是输出“Yes”,否则输出“No”.
样例输入
4 30 121 21 12
样例输出
No No Yes No不好意思,那个超时啦!在优化一点吧!

c语言编程题目 整数n=p*q,p和q为质数,且p≠q,我们称n为D-Prime,请写个程序判断一个数是不是D_Prime.输入第一行是一个整数K,表示样例的个数.以后每行是一个整数x,(1 ≤ x ≤ 100,000,000);输出每行输

您好,我把之前的code优化了下,加入了素数数组,保存之前,计算过程中,发现的素数,并且在查找时,用了二分查找.你试试看是否还会超时吧.

(在codeblock下测试过,没有问题)

#include<stdio.h>
#include<math.h>
#define N 100000  //sqrt(NMAX)
#define NMAX 100000000

int binary_search(int src[], int num,int tar){//二分查找
\x09int head = 0;
\x09int tail = num - 1;
\x09int mid;
\x09while(head < tail){
\x09\x09mid = (head + tail) / 2;
\x09\x09if(src[mid] == tar){
\x09\x09\x09return 1;
\x09\x09}else if(src[mid] < tar){
\x09\x09\x09head = mid + 1;
\x09\x09}else
\x09\x09\x09tail = mid - 1;
\x09}
\x09if(src[head] == tar){
\x09\x09return 1;
\x09}
\x09return 0;
}
int is_prime(int tar, int *prime_lib, int *next_idx){//判断是否为素数
\x09if(tar < prime_lib[*next_idx - 1]){
\x09\x09if(binary_search(prime_lib, *next_idx, tar) == 1)
\x09\x09\x09return 1;
\x09\x09else
\x09\x09\x09return 0;
\x09}
    int i = 1;
\x09int tmp_end = sqrt((float)tar);
    while(i < *next_idx && prime_lib[i]<= tmp_end){//只考虑素数数组里的
        if(tar % prime_lib[i] == 0)
            return 0;
        i++;
    }
\x09if(i == *next_idx){//大于素数最大时,依次增加1
\x09\x09int cur_val = prime_lib[*next_idx - 1] + 1;
\x09\x09while(cur_val <= tmp_end){
\x09\x09\x09if(is_prime(cur_val,prime_lib, next_idx)){
\x09\x09\x09\x09prime_lib[(*next_idx)++] = cur_val;
\x09\x09\x09\x09if(tar % cur_val == 0)
\x09\x09\x09\x09\x09return 0;
\x09\x09\x09}
\x09\x09\x09cur_val++;
\x09\x09}
\x09}
    
    return 1;
}
int main(){
\x09int prime_lib[N]; //保存之前过程中找到的素数,按大小顺序保存
\x09prime_lib[0] = 1;
\x09prime_lib[1] = 2;
\x09int next_value = 2;
\x09int *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\n");
                flag = 1;
                break;
            }
        }
        if(!flag)
            printf("NO\n");
    }
    return 0;
}

c语言编程题目 整数n=p*q,p和q为质数,且p≠q,我们称n为D-Prime,请写个程序判断一个数是不是D_Prime.输入第一行是一个整数K,表示样例的个数.以后每行是一个整数x,(1 ≤ x ≤ 100,000,000);输出每行输 c语言编程题目 整数n=p*q,p和q为质数,且p≠q,我们称n为D-Prime,请写个程序判断一个数是不是D_Prime.输入第一行是一个整数K,表示样例的个数.以后每行是一个整数x,(1 ≤ x ≤ 100,000,000);输出每行输 c语言中*p++和(*p)++有什么区别?#include void main(){int x=3;int *p,*q;p=&x,q=&x;printf(%d ,*p++);printf(%d ,(*q)++);printf(%d ,x);}输出结果为:3,3,4;我看书中解释:*p++:是先取出*p的值,再使p加1(*p)++:是使*p 在高数上有理数的定义:Q={p/q|p∈Z,q∈N*且p与q互质},如果pq互质不可约分,那p/q不能为整数但有理数是包括整数和分数的, 在C语言中,*P=*Q,*P=&Q,*P=Q有什么区别? 用欧几里得算法(辗转相除法)求最大公约数,C语言编程#include #include int main(){int m,n,a,p,q,r;printf(输入两个正整数);scanf(%d,%d,&m,&n);p=m;q=n;if(m Pascal语言编程告诉进问题描述给出N个整数X1、X2、X3,…,Xn,将这N个数从小到大排序为A1,A2,A3,…,An,记数列A1,A2,A3,…,An的基数项之和为P,偶数项之和为Q,令T=|P-Q|,求出T的值.输入格式(输入文件 若m,n,p,q为互不相等的整数.且mnpq=49,则m+n+p+q=? 若M,N,P,Q,为互不相等的整数,且MNPQ=49,则M+N+P+Q=? 数列最值问题的研究数列{An}为等差数列,Sn为其前n项和,若Ap=q,Aq=p(p、q属自然数,且p≠q),则使Sn取最大值的自然数n的值为?A、p+q-1B、p+q-2和p+q-1C、p+q-1和p+qD、p+q请详述理由 设p是大于1的正整数,p^-1+q^-1=1.证明,对任意正整数,有1/p × x^p + 1/q≥xp^-1表示p的倒数咋一看我愣住了,P和Q还能解出来?1楼你看错了一点q没说是整数啊,那么q=1+1/n怎么会必为整数呢 若p^n-q^n=(p+q)(p+q)(p-q),则n=多少? 100分求助一道数学证明题(高中+小学内容)假设N是一个自然数,我们提出组合(p;q)(p和q都是整数)满足1/p+1/q=1/n1.)证明组合(p;q)满足p大于等于n,q大于等于n2.)证明组合(p;q)是方程式(p-n)(q-n)=n 已知mn=pq,下列格式正确的是 A. m+n/n=p+q/q B.m+n/p=n+q/q C.m-q/q=n-p/p D.m-p/p=q-n/n已知mn=pq,下列格式正确的是 A. m+n/n=p+q/q B.m+n/p=n+q/q C.m-q/q=n-p/p D.m-p/p=q-n/n 已知m为奇数,n是偶数,方程组x-2000y=n 1999x+3y=m的解x=p y=q是整数,那么 A p q都是偶数 B p q都是奇数C p偶 q奇 D p奇 q偶 C语言链表中q->next=p;表示什么意思?while (q) {r=q->next; q->next=p; p=q; q=r; } 一道编程题 C语言的例2:求解两个正整数p和q的最大公约数g的欧几里德算法:(分组完成)步骤1:如果p C语言中if(scanf(%d %d/n,&p,&q)) ==