我用 C 写了一段代码,但它不起作用?
I have written a code in C but it is not working?
问题:用 C 编写一个程序,从数组中找出质数。
我写了一个代码,但它不起作用。你能帮我看看问题出在哪里吗?
我的代码:
#include <stdio.h>
int main()
{
int n, count = 0, x = 0;
scanf("%d", &n);
int numbers[n], prime[n];
for (int i = 0; i < n; i++)
{
scanf("%d", &numbers[i]);
}
for (int i = 0; i < n; i++)
{
for (int j = 2; j < n; j++)
{
if (numbers[i] % j == 0)
{
x++;
break;
}
}
if (x > 0)
{
}
else
{
prime[count] = numbers[i];
count++;
}
}
for (int i = 0; i < count; i++)
{
printf("%d ", prime[i]);
}
return 0;
}
请帮我找到解决办法。
提前致谢。
如果你想检查一个质数,你应该对 2,(value-1)
范围内的所有值进行检查,为此你应该按如下方式更正你的第二个循环:
x = 0; // reset the counter
for (int j = 2; j < numbers[i]; j++) { // corrected loop
/* do your checks */
}
/* EDIT: previous code was wrong as suggested in the comments */
if (x==0 && numbers[i]!=1 && numbers[i]!=0) { // added to avoid 0 and 1 as prime nums
/* store value */
}
你的程序没有什么意义。
对于初学者来说,声明的数组应该具有元素类型 unsigned int
而不是 int
.
因为用户可以在数组中输入任意数字然后这个循环
for (int j = 2; j < n; j++)
没有意义。
例如,如果 numbers[0]
等于 2
,那么尽管 2
是一个质数,但您的程序不会将此数字视为质数。
此外,您忘记在内部 for 循环之前重新初始化变量 x
。
无需再定义第二个数组输出第一个数组中的质数
程序可以如下所示。
#include <stdio.h>
int main(void)
{
size_t n;
if ( scanf( "%zu", &n ) == 1 && n != 0 )
{
unsigned int numbers[n];
for ( size_t i = 0; i < n; i++ )
{
scanf( "%u", numbers + i );
}
for ( size_t i = 0; i < n; i++ )
{
int prime = numbers[i] % 2 == 0 ? numbers[i] == 2 : numbers[i] != 1;
for ( unsigned int j = 3; prime && j <= numbers[i] / j; j +=2 )
{
prime = numbers[i] % j != 0;
}
if ( prime ) printf( "%u ", numbers[i] );
}
putchar( '\n' );
}
return 0;
}
如果输入是
25
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
那么输出将是
2 3 5 7 11 13 17 19 23
我使用布尔函数来检查数字是否为素数
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
bool Prime(int);
int main()
{
int N;
do
{
printf("Give me the number of numbers :");
scanf("%d",&N);
}while(N<1);//in your array must be minimum 1 element
int prime[N];
int arr[N];
int j=0;
for(int i=0;i<N;i++)
{
do
{
printf("Enter a number %d:",i+1);
scanf("%d", &arr[i]);
}while(arr[i]<0);
if(arr[i]!=1&&arr[i]!=0&&Prime(arr[i])==true)
{
prime[j]=arr[i];
j++;
}
}
printf("\nListe of prime number :\n\n");
for(int p=0;p<j;p++)
{
printf("[%d]",prime[p]);
}
printf("\n\n");
return 0;
}
bool Prime(int n)
{
for(int i=2;i<=(n/2);i++)
{
if(n%i==0)
{
return false;
}
}
return true;
}
在我们深入研究这个问题之前,您需要做一些笔记:
而不是键入
if (x>0) {
}
else
//your code
这个可以直接
if (x<=0)
//your code
如果 for 循环包含 1 条指令,则无需打开 {}
所以而不是
for (int i = 0; i < n; i++)
{
scanf("%d", &numbers[i]);
}
可以直接输入
for (int i = 0; i < n; i++)
scanf("%d", &numbers[i]);
我还注意到您声明了一个变量 n,然后用它来声明数组的大小。那是错误的。
您需要使用 malloc 来拥有一个动态数组来执行您要求的相同功能。否则,使用静态数组并将 n 限制在其边界内。
阅读有关指针的更多信息。
关于你代码的问题,上面的回答已经解决了问题。
问题:用 C 编写一个程序,从数组中找出质数。
我写了一个代码,但它不起作用。你能帮我看看问题出在哪里吗?
我的代码:
#include <stdio.h>
int main()
{
int n, count = 0, x = 0;
scanf("%d", &n);
int numbers[n], prime[n];
for (int i = 0; i < n; i++)
{
scanf("%d", &numbers[i]);
}
for (int i = 0; i < n; i++)
{
for (int j = 2; j < n; j++)
{
if (numbers[i] % j == 0)
{
x++;
break;
}
}
if (x > 0)
{
}
else
{
prime[count] = numbers[i];
count++;
}
}
for (int i = 0; i < count; i++)
{
printf("%d ", prime[i]);
}
return 0;
}
请帮我找到解决办法。
提前致谢。
如果你想检查一个质数,你应该对 2,(value-1)
范围内的所有值进行检查,为此你应该按如下方式更正你的第二个循环:
x = 0; // reset the counter
for (int j = 2; j < numbers[i]; j++) { // corrected loop
/* do your checks */
}
/* EDIT: previous code was wrong as suggested in the comments */
if (x==0 && numbers[i]!=1 && numbers[i]!=0) { // added to avoid 0 and 1 as prime nums
/* store value */
}
你的程序没有什么意义。
对于初学者来说,声明的数组应该具有元素类型 unsigned int
而不是 int
.
因为用户可以在数组中输入任意数字然后这个循环
for (int j = 2; j < n; j++)
没有意义。
例如,如果 numbers[0]
等于 2
,那么尽管 2
是一个质数,但您的程序不会将此数字视为质数。
此外,您忘记在内部 for 循环之前重新初始化变量 x
。
无需再定义第二个数组输出第一个数组中的质数
程序可以如下所示。
#include <stdio.h>
int main(void)
{
size_t n;
if ( scanf( "%zu", &n ) == 1 && n != 0 )
{
unsigned int numbers[n];
for ( size_t i = 0; i < n; i++ )
{
scanf( "%u", numbers + i );
}
for ( size_t i = 0; i < n; i++ )
{
int prime = numbers[i] % 2 == 0 ? numbers[i] == 2 : numbers[i] != 1;
for ( unsigned int j = 3; prime && j <= numbers[i] / j; j +=2 )
{
prime = numbers[i] % j != 0;
}
if ( prime ) printf( "%u ", numbers[i] );
}
putchar( '\n' );
}
return 0;
}
如果输入是
25
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
那么输出将是
2 3 5 7 11 13 17 19 23
我使用布尔函数来检查数字是否为素数
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
bool Prime(int);
int main()
{
int N;
do
{
printf("Give me the number of numbers :");
scanf("%d",&N);
}while(N<1);//in your array must be minimum 1 element
int prime[N];
int arr[N];
int j=0;
for(int i=0;i<N;i++)
{
do
{
printf("Enter a number %d:",i+1);
scanf("%d", &arr[i]);
}while(arr[i]<0);
if(arr[i]!=1&&arr[i]!=0&&Prime(arr[i])==true)
{
prime[j]=arr[i];
j++;
}
}
printf("\nListe of prime number :\n\n");
for(int p=0;p<j;p++)
{
printf("[%d]",prime[p]);
}
printf("\n\n");
return 0;
}
bool Prime(int n)
{
for(int i=2;i<=(n/2);i++)
{
if(n%i==0)
{
return false;
}
}
return true;
}
在我们深入研究这个问题之前,您需要做一些笔记: 而不是键入
if (x>0) {
}
else
//your code
这个可以直接
if (x<=0)
//your code
如果 for 循环包含 1 条指令,则无需打开 {} 所以而不是
for (int i = 0; i < n; i++)
{
scanf("%d", &numbers[i]);
}
可以直接输入
for (int i = 0; i < n; i++)
scanf("%d", &numbers[i]);
我还注意到您声明了一个变量 n,然后用它来声明数组的大小。那是错误的。 您需要使用 malloc 来拥有一个动态数组来执行您要求的相同功能。否则,使用静态数组并将 n 限制在其边界内。 阅读有关指针的更多信息。 关于你代码的问题,上面的回答已经解决了问题。