【问题标题】:Nested for loop in CC中的嵌套for循环
【发布时间】:2021-03-20 00:42:37
【问题描述】:

我正在尝试使用以下代码打印素数:

#include <stdio.h>
int prime_check(int number);

int main(){
    int x;
    printf("Number of choice\n");
    scanf("%d",&x);
    prime_check(x);
    return 0;
}

int prime_check(int number){
    int count = number;
    for (number>=0; count>=0; --number ){
        for (number>=0; count>=0; --count){
                if (number % count !=0){
                    printf("# %d\n ",&number);
                }
        }
    }

return number;
}

以下是无论输入我得到的输出:# 6422272

作为一名自学者,我希望能够获得任何您认为适合上述问题以及我在 C 方面所走的道路的相关指导。

提前谢谢你

【问题讨论】:

  • 欢迎来到 SO。循环的初始化部分没有意义。 number&gt;=0; 应该是什么意思?提示:它没有!
  • 你的函数应该如何工作?返回值的含义是什么?输出的意义是什么?此外,您应该在编译器中启用更多警告。对于 GCC,请使用 -Wall -Wextra。这应该会导致一些关于 printf("# %d\n ",&amp;number); 中参数类型不匹配的警告这可能应该是 printf("# %d\n ",number); 但整个打印与素数根本无关。
  • 您的内循环一直运行到count==0,这在if (number % count != 0) 中使用时会导致问题。
  • 附带说明:在不检查返回值的情况下使用scanf 是不安全的。有关详细信息,请参阅此页面:A beginners' guide away from scanf()
  • 您的意思是使用sieve of Eratosthenes?您需要分配更多内存。

标签: c loops for-loop primes function-definition


【解决方案1】:

您的代码中存在许多问题,但对您看到的数字最直接负责的是这一行:

printf("# %d\n ",&number);

通过将 & 放在 number 之前,您要求计算机打印存储变量 number 的内存地址,而不是该变量的实际值。

到目前为止,您似乎每次运行程序时,都会在同一地址创建此变量,这就是您在输出中看到的内容。

请记住 - printfscanf 相反,它需要值而不是地址(除非您尝试打印字符串,也就是以空字符结尾的字符数组)。

您的第二个问题是如何使用for 循环。

for (initialization; condition; change)

您将条件&gt;= 放在初始化部分,应在其中分配初始值。
如果您不想分配任何初始值,可以将该部分留空并放置分号;直接在括号 (.

然后,在更改部分,您减少一个与您在条件部分测试的变量不同的变量,因此您的循环可能永远不会结束。

for (number>=0; count>=0; --number )

您测试了count,但您减少了number,因此count 可能永远不会改变,您的程序将永远运行。

此外,您通过将原始数字用作循环索引,从而丢失了传递给函数的原始数字的值,但也许这就是您想要的?

这给我们带来了代码中最大的问题:
它不检查素数。

您的代码试图做的就是打印一堆余数(模数),然后返回一些将被忽略的值。

如果您想实际检查一个数字是否为素数,请先写下您作为人类将采取哪些步骤在纸上手动检查它。

一旦你有了这个伪代码,你应该能够创建正确的 C 代码。

【讨论】:

    【解决方案2】:

    对于初学者来说,for 循环中的第一个表达式

    for (number>=0; count>=0; --number ){
         ^^^^^^^^^
            for (number>=0; count>=0; --count){
                 ^^^^^^^^^
    

    没有效果。它们被丢弃。

    外循环只有一次迭代(前提是初始数字不是负数),因为在内循环之后变量count 的值为负数。

    另外这个if语句

    if (number % count !=0){
    

    可以在 count 等于 0 时调用未定义的行为。

    在这个 printf 调用中

    printf("# %d\n ",&number);
    

    您正在尝试使用转换说明符 d 为调用未定义行为的 int 类型的对象输出变量编号的地址。

    就算你写对了

    if (number % count !=0){
        printf("# %d\n ",number);
    }
    

    那么这并不意味着number中存储的当前值是质数。只是表示number的当前值不能被count的当前值整除。

    而且函数总是返回值

    number - 1
    

    其中 number 被认为是参数的初始值(前提是它不是负数),如果它是负数,则被认为是 number 本身的初始值。

    所以这个函数完全没有意义。

    你的意思好像是这样的

    #include <stdio.h>
    
    void prime_check( unsigned int n )
    {
        if ( n < 2 )
        {
            printf( "There are no prime numbers in the range 0 - %u\n", n );
        }
        else
        {
            printf( "Prime numbers in the range 0 - %u:", n );
    
            for ( unsigned int current = 2; current <= n; ++current )
            {
                int prime = current == 2 || current % 2 != 0;
                
                for ( unsigned int i = 3; prime && i <= current / i; i += 2 )
                {
                    prime = current % i != 0;
                }
                
                if ( prime )
                {
                    printf( " %u", current );
                }
            }
            
            putchar( '\n' );
        }
    }
    
    int main(void) 
    {
        unsigned int n;
    
        printf( "Number of choice: " );
        if ( scanf( "%u", &n ) == 1 )
        {
            prime_check( n );
        }
    }   
    

    程序输出可能看起来像

    Number of choice: 50
    Prime numbers in the range 0 - 50: 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-14
      • 2018-06-01
      • 2020-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多