使用遞回從用戶列印給定范圍內的 2 個最大素數的程式。我想獲得用戶給出的范圍內的 2 個最大素數,但不知何故,它只是列印了該范圍內的連續數字。當我構建一個詢問用戶結束數字的程式時,我的代碼中的素數檢查器正在作業,檢查它是否是素數并列印從 1 到 n 的所有素數。但是當我將它插入這段代碼時,它不能正常作業。我嘗試研究其他代碼作為我的參考,但我找不到任何列印 2 個最大素數的東西。用戶輸入的是否是素數并不重要,代碼只會檢查兩個最大的素數。如果是素數,也可以列印結束數字或 y。一世'
在這段代碼中,我試圖獲取 2 個最大的素數并列印它。您可以看到 num1 和 num2 未使用,它們應該是給定范圍內 2 個最大素數的變數。
#include <stdio.h>
void usersInput(int *x, int *y);
void swapping(int *x, int *y);
int primeCheck(int i, int j);
int main() {
int x, y, i, j, num1, num2;
usersInput(&x, &y);
if (x > y) {
swapping(&x, &y);
}
printf("The value of x is %d, and the value of y is %d.\n", x, y);
printf("\nThe two largest prime numbers from %d to %d are : ", x, y);
for (i = x; i <= y; i )
if (primeCheck(i, y) == 0)
printf("%d ", i);
return 0;
}
void usersInput(int *x, int *y) {
printf("Enter the value of x: ");
scanf("%d", x);
printf("Enter the value of y: ");
scanf("%d", y);
}
void swapping(int *x, int *y) {
int temp;
temp = *x;
*x = *y;
*y = temp;
}
int primeCheck(int i, int j) {
if (j == i) {
return 0;
} else if (j % i == 0) {
return 1;
} else {
return primeCheck(i 1, j);
}
}
正如你所看到的,我還沒有任何函式來獲取 2 個最大的素數。我真的不知道如何做,所以請幫助我
這是實際的輸出:
Enter the value of x: 10
Enter the value of y: 3
The value of x is 3, and the value of y is 10.
The two largest prime numbers from 3 to 10 are: 6 7 8 9 10
這是預期的輸出
Enter the value of x: 10
Enter the value of y: 3
The value of x is 3, and the value of y is 10.
The two largest prime numbers from 3 to 10 are: 5 7
uj5u.com熱心網友回復:
此 if 陳述句的子陳述句是呼叫printf
if (primeCheck(i,y)==1)
printf("%d ", i);
當函式primeCheck回傳時獲得控制權1。
但是根據函式定義,當它可以被范圍內的任何數字整除1時回傳,并且這個數字不一定是..y[i, y]i
} else if (j%i==0) {
return 1;
在所有其他情況下,該函式回傳 0。
當函式遞回呼叫自身時,當至少對于范圍 [x, y] 中的一個數字 y 可以被該數字整除時,它回傳 1。
例如,對于您的輸入,如果范圍為 [3, 5],則函式始終為每個數字回傳 1,因為 10 可以被 5 整除。
實際上,您的功能沒有意義,并且與素數沒有任何共同之處。
還要注意要在一個范圍內找到兩個最大的素數,您應該從該范圍的最大數字開始回圈到最小的數字。
我認為您對作業的理解不正確。似乎您需要撰寫非遞回函式來確定給定數字是否為素數,并撰寫遞回函式而不是回傳兩個最大素數的 for 回圈。
這是遞回地找到兩個最大素數的函式,看起來像下面的演示程式所示
#include <stdio.h>
struct TwoPrimes
{
unsigned int first_prime;
unsigned int second_prime;
};
int is_prime( unsigned int n );
struct TwoPrimes find_two_primes( unsigned int first, unsigned int last )
{
if (first == last)
{
struct TwoPrimes two_primes = { ( is_prime( first ) ? last : 0 ), 0 };
return two_primes;
}
else
{
struct TwoPrimes two_primes = find_two_primes( first 1, last );
if (two_primes.first_prime == 0 || two_primes.second_prime == 0)
{
if (is_prime( first ))
{
if (two_primes.first_prime == 0)
{
two_primes.first_prime = first;
}
else
{
two_primes.second_prime = first;
}
}
}
return two_primes;
}
}
int main( void )
{
struct TwoPrimes two_primes = find_two_primes( 3, 10 );
if (two_primes.first_prime != 0)
{
printf( "%u\n", two_primes.first_prime );
if (two_primes.second_prime != 0)
{
printf( "%u\n", two_primes.second_prime );
}
}
}
您需要自己做的是定義函式is_prime。
uj5u.com熱心網友回復:
您的代碼中有多個問題:
- 素數測驗
if (primeCheck(i, y) == 0)不正確:您應該2作為第一個引數和i第二個引數通過。 - 回圈應該從 while 開始
i = y并運行i >= x,遞減i以首先找到范圍內的最大素數。 - 您應該存盤素數并在找到 2 時停止。
- 應修改素性測驗函式以回傳
1ifi > j以防止對某些輸入進行無限遞回,例如primeCheck(2, 1). - 在
primeCheck(). 您可以在 時停止遞回j < i * i,可以在沒有潛在溢位的情況下進行測驗j / i < i。
這是您的代碼的修改版本:
#include <stdio.h>
int usersInput(int *x, int *y);
void swapping(int *x, int *y);
int primeCheck(int i, int j);
int main() {
int x, y, i, num1, num2;
if (!usersInput(&x, &y)) {
return 1;
}
if (x > y) {
swapping(&x, &y);
}
printf("The value of x is %d, and the value of y is %d.\n", x, y);
for (i = y, num1 = num2 = 0; i >= x; i--) {
if (primeCheck(2, i) == 0) {
if (num2 == 0) {
num2 = i;
} else {
num1 = i;
break;
}
}
}
printf("The two largest prime numbers from %d to %d are: %.0d %.0d\n",
x, y, num1, num2);
return 0;
}
// read user input return zero on failure
int usersInput(int *x, int *y) {
printf("Enter the value of x: ");
if (scanf("%d", x) != 1)
return 0;
printf("Enter the value of y: ");
return scanf("%d", y) == 1;
}
void swapping(int *x, int *y) {
int temp = *x;
*x = *y;
*y = temp;
}
int primeCheck(int i, int j) {
if (j < 2) {
return 1; // negative, 0 or 1: not prime
} else if (j / i < i) {
return 0; // all factors tested up to sqrt(j): j is prime
} else if (j % i == 0) {
return 1; // composite, not prime
} else {
return primeCheck(i 1, j);
}
}
輸出:
Enter the value of x: 10
Enter the value of y: 3
The value of x is 3, and the value of y is 10.
The two largest prime numbers from 3 to 10 are: 5 7
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/455699.html
下一篇:無法理解遞回模式及其函式呼叫
