我正在嘗試制作一個程式,該程式需要兩個用戶輸入(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;
}
我還沒有成功撰寫一個可以對 for 回圈產生的所有整數進行排序的作業函式main()。就是largestonly()上面看到的函式。與此相關,我的printlargest()功能無疑不起作用。我在這里的想法是,如果largest1不包含任何值(或等于0或其他我想不到的更合適的值),則該函式將僅列印找到的兩個最大素數。相對而言,如果兩者largest1都largest2為空,則僅列印最大的素數。如果所有變數都是空的,它應該列印"No prime numbers found!". 目前我對如何處理我的代碼感到非常迷茫,因此任何型別的幫助都將不勝感激。謝謝你。
uj5u.com熱心網友回復:
這里有幾件事要做。
首先,注意第 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()函式中,您不需要雙回圈。這樣想吧。如果你要在心理上做這個練習,你會記下這些數字,檢查它們是否是素數,如果它們滿足條件,請寫下來:是素數,是第一個、第二個或第三個。你不需要做3次。因此:
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;
}
此外,在不初始化變數的情況下宣告變數的方式有時可能很危險。在這種情況下,由于largest1和largest2沒有largest3設定為 0,您將沒有機會觸發任何printlargest()情況。這可能是因為您被困在您認為也可以處理的程式的一部分上,但我仍然想指出它,以防萬一。
編輯:您還可以在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;
}
uj5u.com熱心網友回復:
首先,定義如何檢查素數:
bool is_prime(int num)
{
if (num < 2)
return false;
for (int i = 2; i <= num / i; i)
if (num % i == 0)
return false;
return true;
}
然后,定義一個函式,回傳給定區間內的 3 個最大素數:
void get_max_3_in_range(int lo, int hi, int *max1, int *max2, int *max3)
{
*max1 = 0; // smallest
*max2 = 0;
*max3 = 0; // largest
int round = 0;
for (int i = lo; i <= hi; i) {
if (is_prime(i)) {
if (round % 3 == 0) *max1 = i;
if (round % 3 == 1) *max2 = i;
if (round % 3 == 2) *max3 = i;
round;
}
}
if (*max1 > *max2) swap_int(max1, max2);
if (*max2 > *max3) swap_int(max2, max3);
}
這是你的swap():
void swap_int(int *v1, int *v2)
{
int tmp = *v1;
*v1 = *v2;
*v2 = tmp;
}
驅動程式:
int main(void)
{
int x, y;
inputXY(&x, &y);
int max1, max2, max3;
get_max_3_in_range(x, y, &max1, &max2, &max3);
printf("x = %d\ty = %d\n", x, y);
printf("max1 = %d\tmax2 = %d\tmax3 = %d\n", max1, max2, max3);
}
輸出:
Enter value of x: 0
Enter value of y: 100
x = 0 y = 100
max1 = 83 max2 = 89 max3 = 97
您可以選擇在一個或多個最大值為零的情況下輸出什么。在這里,我選擇將它們全部列印出來。
旁注:你inputXY()很容易出錯。因為如果用戶輸入一個字串,你的代碼就會中斷。scanf()回傳一個您必須檢查的值。
以下是更好的版本:
void inputXY(int *x, int *y)
{
for(;;) {
printf("Enter value of x: ");
if (scanf("%d", x) != 1)
flush_stdin();
else
break;
}
flush_stdin();
for(;;) {
printf("Enter value of y: ");
if (scanf("%d", y) != 1)
flush_stdin();
else
break;
}
}
并且flush_stdin()(從不!fflush(stdin))將清除緩沖區中剩余的內容,以防用戶沒有輸入(僅)一個數字:
void flush_stdin(void)
{
scanf("%*[^\n]");
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/462116.html
標籤:C
上一篇:分段錯誤C陣列和Malloc
