我正在try 制作一个程序,它接受两个用户输入(x和y),判断区间内的所有数字是否都是素数,然后只打印三个最大的素数(如果可用).到目前为止,我的代码以从最大到最小的间隔判断所有素数.

我的代码:

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

void inputXY(int *x, int *y) {
    printf("Enter value of x: ");
    scanf("%d", x);
    printf("Enter value of y: ");
    scanf("%d", y);
}

void swap(int*x, int*y){
    int temp;
    temp = *x;
    *x=*y;
    *y=temp;
}

int primechecker(int divisor,int dividend){ 
    if(dividend==divisor) return 1; 
    else if(dividend%divisor==0) return 0;
    else primeChecker(divisor+1,dividend);
    }

void largestonly(int*counter, int*largest1, int*largest2, int*largest3){
    int temp;
    temp=*counter;
    if (temp>*largest1&&*largest2) ///incomplete attempt
}

void printlargest(int *x, int *y, int*largest1, int*largest2, int*largest3){ ///I do not know if this would work, since I have not equated largest1, largest2, and largest3 to zeroes. My idea here is that, if any specific variables are empty, different specific lines  should be printed.
    if (*largest1==0&&(*largest2&&*largest3!=0)) {
        printf("There are two prime numbers: ");
        printf("%d, %d", *largest2, *largest3);
    }
    else if (*largest1&&*largest2==0&&*largest3!=0){
        printf("There is only one prime number: ");
        printf("%d", *largest3);
    }
    else if (*largest1&&*largest2&&largest3!=0){
        printf("The three largest prime numbers between %d and %d are: ", *x, *y);
        printf("%d, %d, %d", *largest1, *largest2, *largest3);
    }
    else if (*largest1&&*largest2&&largest3==0){
        printf("No prime numbers found!");
    } 

}
int main(){
    int x,y,largest1, largest2, largest3, counter, divisor, dividend, i;
    divisor=2;
    dividend=counter;
    inputXY(&x, &y);
    if ((x&&y==0),(x&&y==1)) printf("Invalid range!\n");
    if (x>y) swap(&x, &y);
    for (i=0; i<=3; i++){
        for(counter=y;counter>=x;counter--) {
            if (primechecker(divisor,counter)==1) largestonly(&counter, &largest1, &largest2, &largest3);
        }
    }
    printlargest(&x, &y, &largest1, &largest2, &largest3);
    return 0;
}

一个排序函数可以成功地写出main()个整数.如上图所示,这是largestonly()函数.与此相关,我的printlargest()函数无疑不起作用.我在这里的 idea 是,如果largest1不包含任何值(或等于0或其他我想不出的更合适的值),函数将只打印找到的两个最大素数.相对而言,如果largest1largest2都为空,则只打印最大的素数.如果所有变量都为空,则应打印"No prime numbers found!".目前我对如何处理我的代码感到非常困惑,因此任何类型的帮助都将不胜感激.非常感谢.

推荐答案

这里有几件事要做.

首先,注意第21行,你调用了一个不存在的primeChecker()函数.编译时会出现错误.

其次,你不必"分类"任何东西.你只需要在变量到达时将素数存储到变量中.我注意到你认为largest3是第一个必须被填满的(至少它是从printlargest()可以理解的),这给了我们如下:

void largestonly(int counter, int* largest1, int* largest2, int* largest3){
    if(*largest3 == 0) 
        *largest3 = counter;
    else if(*largest2 == 0)
        *largest2 = counter;
    else if(*largest1 == 0)
        *largest1 = counter;
}

此外,不需要首先传递计数器的地址,因为您不需要修改它.

最后,在main()函数中,不需要双循环.这样想吧.如果你在心理上做这个练习,你会记下这些数字,判断它们是否是素数,并记下它们是否满足以下条件:作为素数和作为第一、第二或第三.你不需要做三次.因此:

int main(){
    int x,y;
    inputXY(&x, &y);
    int largest1 = 0;
    int largest2 = 0;
    int largest3 = 0;
    int divisor = 2;
    if ((x&&y==0),(x&&y==1)) printf("Invalid range!\n");
    if (x>y) swap(&x, &y);
    for(int counter=y;counter>=x;counter--) {
        if (primechecker(divisor,counter)==1) 
            largestonly(counter, &largest1, &largest2, &largest3);
    }
    printlargest(&x, &y, &largest1, &largest2, &largest3);
    return 0;
}

此外,在不初始化变量的情况下声明变量的方式有时可能很危险.在本例中,由于largest1largest2largest3没有设置为0,因此您没有机会触发printlargest()个 case 中的任何一个.这可能是因为你被困在你的程序的一部分,你认为也可以处理,但我仍然想指出,以防万一.

编辑:您还可以在for循环中添加一个条件,如果largest1不等于0,它将退出循环.当你已经拥有了你所需要的一切时,它会阻止程序循环(可能)大量的数字.它看起来是这样的(对于上下文,使用现有的for循环):

for(int counter=y;counter>=x;counter--) {
    if (primechecker(divisor,counter)==1) 
        largestonly(counter, &largest1, &largest2, &largest3);
    if(largest1 != 0)
        break;
}

希望这能澄清你的问题,如果有必要,请随时提问,或者指出我在你的问题中误解的地方.

以下是完整的代码:

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

void inputXY(int *x, int *y) {
    printf("Enter value of x: ");
    scanf("%d", x);
    printf("Enter value of y: ");
    scanf("%d", y);
}

void swap(int*x, int*y){
    int temp;
    temp = *x;
    *x=*y;
    *y=temp;
}

int primechecker(int divisor,int dividend){ 
    if(dividend==divisor) return 1; 
    else if(dividend%divisor==0) return 0;
    else primechecker(divisor+1,dividend);
    }

void largestonly(int counter, int* largest1, int* largest2, int* largest3){
    if(*largest3 == 0) 
        *largest3 = counter;
    else if(*largest2 == 0)
        *largest2 = counter;
    else if(*largest1 == 0)
        *largest1 = counter;
}

void printlargest(int *x, int *y, int*largest1, int*largest2, int*largest3){ ///I do not know if this would work, since I have not equated largest1, largest2, and largest3 to zeroes. My idea here is that, if any specific variables are empty, different specific lines  should be printed.
    if (*largest1==0&&(*largest2&&*largest3!=0)) {
        printf("There are two prime numbers: ");
        printf("%d, %d", *largest2, *largest3);
    }
    else if (*largest1&&*largest2==0&&*largest3!=0){
        printf("There is only one prime number: ");
        printf("%d", *largest3);
    }
    else if (*largest1&&*largest2&&largest3!=0){
        printf("The three largest prime numbers between %d and %d are: ", *x, *y);
        printf("%d, %d, %d", *largest1, *largest2, *largest3);
    }
    else if (*largest1&&*largest2&&largest3==0){
        printf("No prime numbers found!");
    } 

}
int main(){
    int x,y;
    inputXY(&x, &y);
    int largest1 = 0;
    int largest2 = 0;
    int largest3 = 0;
    int divisor = 2;
    if ((x&&y==0),(x&&y==1)) printf("Invalid range!\n");
    if (x>y) swap(&x, &y);
    for(int counter=y;counter>=x;counter--) {
        if (primechecker(divisor,counter)==1) 
            largestonly(counter, &largest1, &largest2, &largest3);
    }
    printlargest(&x, &y, &largest1, &largest2, &largest3);
    return 0;
}

C++相关问答推荐

如何正确地索引C中的 struct 指针数组?

手动矢量化性能差异较大

在没有动态内存分配的情况下,用C语言最快地将各种数组复制到单个较大的数组中

识别和处理c中整数溢出的最佳方法?

Win32API Wizzard97 PropSheet_SetWizButton不工作

VS代码';S C/C++扩展称C23真关键字和假关键字未定义

如何在C中打印包含扫描字符和整数的语句?

如何有效地编写代码来判断两个元素数量相同的数组即使在不同的位置也具有相同的元素?

什么是.c.h文件?

C11/C17标准允许编译器清除复合文字内存吗?

`预期说明符-限定符-列表在‘(三元运算符中的’token`‘之前

try 查找带有指针的数组的最小值和最大值

当用C打印过多的';\n';时输出不正确

分支预测和UB(未定义的行为)

多行表达式:C 编译器如何处理换行符?

当循环变量在溢出时未定义时,可以进行哪些优化?

将字节/字符序列写入标准输出的最简单形式

如何根据当前舍入方向将float转换为int?

c 函数指针,另一种语法

如何使 clangd 启用仅标头库实现