Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C程序,打印用户接收范围内的Germain素数_C - Fatal编程技术网

C程序,打印用户接收范围内的Germain素数

C程序,打印用户接收范围内的Germain素数,c,C,对于从用户收到的整数X和Y(假设X2){ y=strtol(argv[2],NULL,0); } }否则{ printf(“输入X和Y:”); 如果(扫描频率(“%d%d”、&x和&y)!=2) 返回1; } int max=2*y+1; 无符号字符*composite=calloc(最大值+1,1); if(composite==NULL){ printf(“内存不足\n”); 返回1; } 复合[0]=1; 复合[1]=1; 对于(int p=2;p*p而言,“问题”是您从未重置counte

对于从用户收到的整数
X
Y
(假设
X
),编写程序,将
X
Y
范围内的所有Germain素数添加到数组中,并在屏幕上打印该数组中的元素。日尔曼素数是素数,因此2p+1也是素数。此问题中将不使用附加字符串。否则,它将被评估为0

样本:

Enter X and Y: 2 15
Germain Prime Numbers in the Range: 2-3-5-11
我有一个这样的问题。我写了一个程序,但它也打印了一些错误的数字。但是,它现在不打印任何内容

这是我的密码:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int x, y, i, j, k, counter = 0, counter2 = 0;

    printf("Please enter x and y values:\n\a");
    scanf("%d %d", &x, &y);

    for (i = x; i <= y; i++) {
        for (j = 1; j <= i; j++) {
            if (i % j == 0) {
                counter++;
            }
        }                        
        if (counter == 2) {                                               
            for (k = 1; k <= 2 * i + 1; k++) {
                if ((2 * i + 1) % k == 0) {
                    counter2++;
                } 
                if (counter2 == 2) {
                    printf("%d is a germain prime number", i);
                }
            }
        }
        counter = 0;
    }
    return 0;   
}
#包括
#包括
int main(){
int x,y,i,j,k,计数器=0,计数器2=0;
printf(“请输入x和y值:\n\a”);
scanf(“%d%d”,&x,&y);

对于(i=x;i您的代码太复杂了。主循环应该简化。此外,输出不是示例所示的

以下是问题:

  • (j=1;j 1)的循环
    {
    x=y=strtol(argv[1],NULL,0);
    如果(argc>2){
    y=strtol(argv[2],NULL,0);
    }
    }否则{
    printf(“输入X和Y:”);
    如果(扫描频率(“%d%d”、&x和&y)!=2)
    返回1;
    }
    int max=2*y+1;
    无符号字符*composite=calloc(最大值+1,1);
    if(composite==NULL){
    printf(“内存不足\n”);
    返回1;
    }
    复合[0]=1;
    复合[1]=1;
    
    对于(int p=2;p*p而言,“问题”是您从未重置
    counter2
    变量和
    if(2*i+1%k==0)
    需要括号。真正的问题是您已经实现了
    iPrime
    功能三次,而不是只实现一次,调用两次,这会导致您陷入不必要的复杂程度中。

    没有太多时间调试代码。但您可以运行以下操作:

    #include <stdio.h>
    #include <stdbool.h>
    
    bool isPrime(int n)
    {
        // Corner case
        if (n <= 1)
            return false; // Check from 2 to n-1
        for (int i = 2; i < n; i++)
            if (n % i == 0)
                return false;
        return true;
    }
    
    bool isGermanPrime(int n)
    {
        return isPrime(n) && isPrime(n*2+1);
    }
    
    int main()
    {
        int x, y;
        // printf("Please enter x and y values:\n\a");
        // scanf("%d %d", &x, &y);
        x = 2;
        y = 15;
    
        for (int i = x; i <= y; i++)
        {
            if (isGermanPrime(i))
                printf("%d ", i);
        }
        return 0;
    }
    
    //OUTPUT
    2 3 5 11 
    
    #包括
    #包括
    bool isPrime(int n)
    {
    //角盒
    如果(n
    #包括
    #包括
    #包括
    bool isPrime(int n){
    //角盒
    如果(n“编写一个程序,将X到Y范围内的所有Germain素数添加到一个数组中,并在屏幕上打印该数组中的元素。”以及“我不应该使用用户创建的函数”。如下所示

    #include <stdio.h>
    
    #define SIZE 100
    
    int main() {
    
        int x, y, germ, prime, gPrime;
        int n[SIZE], count = 0, i, j;
    
        scanf("%d%d", &x, &y);
    
        if( x < 3 ) {
    
            n[0] = 2;
            ++count;
            x = 3;
        }
        else if( !(x % 2) ) {
            
            ++x;
        }
    
        for(i = x; i <= y; i += 2) {
    
            prime = 1;
            gPrime = 1;
        
            for(j = 3; j < i; y += 2) {
            
                if( !(i % j) ) {
                
                    prime = 0;
                    break;
                }
            }
        
            if( prime ) {
        
                germ = 2 * i + 1;
            
                for(j = 3; j < germ; j += 2) {
                
                    if( !(germ % j) ) {
                    
                        gPrime = 0;
                        break;
                    }
                }
            
                if( gPrime ) {
                
                    n[count] = i;
                    ++count;
                }
            } // end outer if
        }
    
        for(i = 0; i < count; i++) {
        
            printf("%d ", n[i]);
        }
    
        return 0;
    }
    
    #包括
    #定义大小100
    int main(){
    int x,y,芽,素数,gPrime;
    int n[SIZE],计数=0,i,j;
    scanf(“%d%d”,&x,&y);
    if(x<3){
    n[0]=2;
    ++计数;
    x=3;
    }
    否则如果(!(x%2)){
    ++x;
    }
    

    对于(i=x;i)你的代码包括一个
    isPrime()
    函数。你为什么不使用它呢?编辑:另外,
    if(2*i+1%k==0)
    如果你想得到合理的结果,可能应该是
    if((2*i+1)%k==0)
    ,允许的
    X,Y
    范围是多少,整个
    int
    范围?较大的
    int
    值可能溢出
    2*i+1
    ,因此需要不同的处理。alpermakaveli您需要“将所有Germain素数……添加到一个数组中”,但代码中没有数组,只是输出。这是真正的要求吗?还提示
    if(2*i+1%k==0)
    应该使用括号。是的,我添加了那个偏执词,但我不应该使用用户创建的函数。我共享代码的网站上的其他人添加了iPrime。任何人告诉你不要为此定义函数都是完全错误的,这会教你坏习惯。检查germain素数肯定有比algori更好的方法每个数字的thm检查n是否为素数,检查2n+1是否为素数(例如,首先查找某个范围内的所有素数,然后检查2n+1条件),但没有一种更好的方法可以避免定义函数。我们在讲座中没有看到函数,这就是为什么它被禁止的原因。我试图先找到素数,然后检查2p+1的素数。但是,作为一个beginner@alpermakaveli“我们在讲座中没有看到函数”-->注意
    intmain()
    是您正在编写的一个函数。所以您至少看到了一个,一个特殊的函数。实际上我不应该使用像iPrime这样的函数。我想有人将它从codeshare中更改了。最后我修复了我的程序,但无法将这些germain素数添加到数组中。我不知道如何创建这样的循环,因为我不知道有多少germain素数的程序am将获得。对于N以下的Sophie Germain素数,可以使用近似上界10+1.6*N/log(N)²。我有一个很好的证明,但这个注释太少,无法包含:)我不应该使用用户创建的函数。iPrime是由我共享代码的网站上的其他人添加的。你必须编写自己的iPrime版本,如果我要为你编写一个,那也是不可接受的。是的,那肯定是不可捕获的。我只是来找出我的错误所在并修复它。我不应该使用函数由用户创建。iPrime是由其他人从我共享代码的网站添加的。好吧,抱歉,我不知道。我以为是你做的功能。这是我的错,忘了删除它。有可能没有它吗?没有输出,但它给了我灵感,谢谢。我认为这是因为时间限制。无论如何,非常欢迎你
    #include <math.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[]) {
        int x, y, counter = 0;
    
        if (argc > 1) {
            x = y = strtol(argv[1], NULL, 0);
            if (argc > 2) {
                y = strtol(argv[2], NULL, 0);
            }
        } else {
            printf("Enter X and Y: ");
            if (scanf("%d %d", &x, &y) != 2)
                return 1;
        }
        int max = 2 * y + 1;
        unsigned char *composite = calloc(max + 1, 1);
        if (composite == NULL) {
            printf("out of memory\n");
            return 1;
        }
        composite[0] = 1;
        composite[1] = 1;
        for (int p = 2; p * p <= max; p++) {
            if (composite[p])
                continue;
            for (int i = p * p; i <= max; i += p)
                composite[i] = 1;
        }
        for (int p = x; p <= y; p++) {
            if (composite[p] || composite[2 * p + 1])
                continue;
            counter++;
            //printf("%d\n", p);
        }
        free(composite);
        printf("Count of Germain primes between %d and %d: %d\n", x, y, counter);
        printf("approximation for count to %d: 10+1.6*N/log(N)²=%.2f\n",
               y, 10 + 1.6 * y / (log(y) * log(y)));
        return 0;
    }
    
    #include <stdio.h>
    #include <stdbool.h>
    
    bool isPrime(int n)
    {
        // Corner case
        if (n <= 1)
            return false; // Check from 2 to n-1
        for (int i = 2; i < n; i++)
            if (n % i == 0)
                return false;
        return true;
    }
    
    bool isGermanPrime(int n)
    {
        return isPrime(n) && isPrime(n*2+1);
    }
    
    int main()
    {
        int x, y;
        // printf("Please enter x and y values:\n\a");
        // scanf("%d %d", &x, &y);
        x = 2;
        y = 15;
    
        for (int i = x; i <= y; i++)
        {
            if (isGermanPrime(i))
                printf("%d ", i);
        }
        return 0;
    }
    
    //OUTPUT
    2 3 5 11 
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <stdbool.h>
    
    bool isPrime(int n) {
        // Corner case
        if (n <= 1)
            return false;
     
        // Check from 2 to n-1
        for (int i = 2; i < n; i++)
            if (n % i == 0)
                return false;
     
        return true;
    }
    
    int main() {
        int x, y;
    
        printf("Please enter x and y values:\n\a");
        scanf("%d %d", &x, &y);
    
        for (int p = x; p < y; p++) {
            if (isPrime(p) && isPrime(2 * p + 1)) {
                printf("%d is a germain prime number\n", p);
            }
        }
    
        return 0;
    }
    
    #include <stdio.h>
    
    #define SIZE 100
    
    int main() {
    
        int x, y, germ, prime, gPrime;
        int n[SIZE], count = 0, i, j;
    
        scanf("%d%d", &x, &y);
    
        if( x < 3 ) {
    
            n[0] = 2;
            ++count;
            x = 3;
        }
        else if( !(x % 2) ) {
            
            ++x;
        }
    
        for(i = x; i <= y; i += 2) {
    
            prime = 1;
            gPrime = 1;
        
            for(j = 3; j < i; y += 2) {
            
                if( !(i % j) ) {
                
                    prime = 0;
                    break;
                }
            }
        
            if( prime ) {
        
                germ = 2 * i + 1;
            
                for(j = 3; j < germ; j += 2) {
                
                    if( !(germ % j) ) {
                    
                        gPrime = 0;
                        break;
                    }
                }
            
                if( gPrime ) {
                
                    n[count] = i;
                    ++count;
                }
            } // end outer if
        }
    
        for(i = 0; i < count; i++) {
        
            printf("%d ", n[i]);
        }
    
        return 0;
    }