C - 如果声明不起作用

时间:2017-05-13 10:57:54

标签: c arrays if-statement

我正在创建一个程序来打印数组中的所有素数。 所以,一切正常,除了if语句跳过小于2的数字,显然不是素数。 这是代码:

int main()
{
int a[10], i, prime = 0, c = 0;

printf("Enter 10 numbers:\n");

for( i = 0; i < 10; i++)
{
    scanf(" %d", &a[i]);
}

printf("Prime numbers are:");
for(i = 0; i < 10; i++)
{
    prime = 1;
for(c = 2; c < a[i]; c++)
{
    if(a[i] < 2)
    {
    prime = 0;
    break;
    }


    if(a[i] % c == 0)
    {
    prime = 0;
    break;
    }


}
if(prime == 1)
printf("%d, ",a[i]);
}

}

这里,声明:

if(a[i] < 2)
{
prime = 0;
break;
}

不起作用。

我还在if块中添加了一个printf语句,但它没有被执行。 问题的原因是什么以及如何解决?

4 个答案:

答案 0 :(得分:3)

对于根据C标准的初学者,没有参数的函数main应声明为

int main( void )

使用命名常量而不是幻数更好。因此,至少需要引入像

这样的常数
#define N 10

并在任何地方使用它而不是数字10。

数组应该有unsigned int类型,因为素数属于自然数。

由于for循环中的条件

for(c = 2; c < a[i]; c++)
           ^^^^^^^^
循环体a[i]内部的

总是大于2.所以这个if语句

if(a[i] < 2)

没有意义。

您可以减少内循环的迭代次数。

程序可以按以下方式查看

#include <stdio.h>

#define N 10

int main( void )
{
    unsigned int a[N];

    printf("Enter %zu numbers: ", ( size_t )N);

    for (size_t i = 0; i < N; i++)
    {
        scanf("%u", &a[i]);
    }

    printf("Prime numbers are: ");

    for (size_t i = 0; i < N; i++)
    {
        int prime = a[i] == 2 || a[i] % 2 == 1 && a[i] != 1;

        for (unsigned int j = 3; prime && j <= a[i] / j; j += 2)
        {
            prime = a[i] % j != 0;
        }

        if (prime) printf("%u, ", a[i]);
    }

    putchar('\n');

    return 0;
}

它的输出可能看起来像

Enter 10 numbers: 0 1 2 3 4 5 6 7 8 9
Prime numbers are: 2, 3, 5, 7,

答案 1 :(得分:2)

你永远不会进入for循环

for(c = 2; c < a[i]; c++) 

如果a [i] = 1和[i] = 2的值和你的内部if循环

if(a[i] < 2)

正在检查小于2的值,因此您无法进入if循环

答案 2 :(得分:1)

经过一些更改后的代码 -

  • 在进入内循环之前检查数字是否小于2.
  • 要检查素数,您无需前往a[i] -1。您可以检查截至平方根a[i]的任何数字是否可以整除。这是为了提高效率,否则你的方法也是正确的。

     int main()
     {
        int a[10], i, prime = 0, c = 0;
        printf("Enter 10 numbers:\n");
    
        for( i = 0; i < 10; i++)
        {
           scanf(" %d", &a[i]);
        } 
    
         printf("Prime numbers are:");
         for(i = 0; i < 10; i++) 
         {
            if(a[i]<2)
                continue;
    
            prime = 1;
    
            for(c = 2; c*c <= a[i]; c++)
            {
                if(a[i] % c == 0)
                {
                   prime = 0;
                   break;
                }
             }
             if(prime == 1)
               printf("%d, ",a[i]);
         }
    
     }
    

有关检查素性的其他方法,您可以访问以下链接 -

答案 3 :(得分:1)

主要问题是当内循环退出时输出打印,因为该值小于2.

以下是代码的一个版本:

  1. 执行所需的操作
  2. 输出正确的值
  3. 正确检查错误
  4. 干净地编译
  5. 现在是代码

    #include <stdio.h>   // printf(), scanf(), perror()
    #include <stdlib.h>  // exit(), EXIT_FAILURE
    
    #define ARRAY_LEN 10
    
    int main( void )
    {
        int a[ ARRAY_LEN ];
    
        int prime = 0;
    
    
        printf("Enter 10 numbers:\n");
    
        for( int i = 0; i < ARRAY_LEN; i++)
        {
            if( 1 != scanf(" %d", &a[i]) )
            {
                perror( "scanf failed" );
                exit ( EXIT_FAILURE );
            }
        }
    
        printf("Prime numbers are: ");
    
        for( int i = 0; i < ARRAY_LEN; i++)
        {
            prime = 1;
    
            if(a[i] < 2)
            {
                prime = 0;
    
            }
    
            else
            {
    
                for( int c = 2; c < a[i]; c++)
                {
    
    
    
                    if(a[i] % c == 0)
                    {
                        prime = 0;
                        break;
                    }
                }
            }
    
            if(prime == 1)
                printf("%d, ",a[i]);
        }
        puts( "" );
    } // end function: main
    

    以下是我使用的输入和代码运行的输出:

    Enter 10 numbers:
    0 1 2 3 4 5 6 7 8 9
    Prime numbers are: 2, 3, 5, 7,