鱼C论坛

 找回密码
 立即注册
查看: 1730|回复: 2

[已解决]浮点数例外(吐核)

[复制链接]
发表于 2023-10-28 14:40:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include <stdio.h>

  2. int main ()
  3. {
  4.         int i,j;//i代表数,j用来判断是否为素数
  5.         long int sum;
  6.         for (i = 0; i < 10000 ;i++ )
  7.         {
  8.                 for (j = 0 ; j <= (int)(i/2) ; j++)
  9.                 {
  10.                         if (i % j == 0)
  11.                         {
  12.                                 sum++; break;
  13.                         }
  14.                 }
  15.         }
  16.         printf ("1-10000共有%ld个素数",sum);

  17.         return 0;
  18. }
  19. ~                                                                                       
  20. ~                 
复制代码



错在哪里
最佳答案
2023-10-28 14:40:24
这段代码有几个问题:

1. 在循环中, j  的取值范围应该是从 2 开始到  i  的一半,而不是从 0 开始到  i  的一半。因为除数不能为 0,也不能为 1,所以应该从 2 开始判断。

2. 在判断素数时,应该判断  i  能否被  j  整除,而不是判断  i  除以  j  的余数是否为 0。所以判断条件应该是  i % j == 0 ,而不是  i % j != 0 。

3. 在每次找到一个非素数时,应该立即跳出内层循环,而不是继续判断后面的数。所以应该使用  break  语句来跳出内层循环。

修正后的代码如下:

  1. #include <stdio.h>

  2. int main ()
  3. {
  4.     int i, j;
  5.     long int sum = 0;
  6.    
  7.     for (i = 2; i <= 10000; i++)
  8.     {
  9.         for (j = 2; j <= i/2; j++)
  10.         {
  11.             if (i % j == 0)
  12.             {
  13.                 sum++;
  14.                 break;
  15.             }
  16.         }
  17.     }
  18.    
  19.     printf("1-10000共有%ld个素数\n", sum);
  20.    
  21.     return 0;
  22. }
复制代码


这段代码用于统计 1 到 10000 之间的素数个数。修正后的代码会正确地判断素数,并将非素数的个数累加到  sum  变量中,最后打印出结果。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-10-28 14:40:24 | 显示全部楼层    本楼为最佳答案   
这段代码有几个问题:

1. 在循环中, j  的取值范围应该是从 2 开始到  i  的一半,而不是从 0 开始到  i  的一半。因为除数不能为 0,也不能为 1,所以应该从 2 开始判断。

2. 在判断素数时,应该判断  i  能否被  j  整除,而不是判断  i  除以  j  的余数是否为 0。所以判断条件应该是  i % j == 0 ,而不是  i % j != 0 。

3. 在每次找到一个非素数时,应该立即跳出内层循环,而不是继续判断后面的数。所以应该使用  break  语句来跳出内层循环。

修正后的代码如下:

  1. #include <stdio.h>

  2. int main ()
  3. {
  4.     int i, j;
  5.     long int sum = 0;
  6.    
  7.     for (i = 2; i <= 10000; i++)
  8.     {
  9.         for (j = 2; j <= i/2; j++)
  10.         {
  11.             if (i % j == 0)
  12.             {
  13.                 sum++;
  14.                 break;
  15.             }
  16.         }
  17.     }
  18.    
  19.     printf("1-10000共有%ld个素数\n", sum);
  20.    
  21.     return 0;
  22. }
复制代码


这段代码用于统计 1 到 10000 之间的素数个数。修正后的代码会正确地判断素数,并将非素数的个数累加到  sum  变量中,最后打印出结果。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-28 14:40:55 | 显示全部楼层
你的代码中存在几个问题:

1. 你在循环中的 j 的初始值是 0,然后你在 if 语句中使用了 i % j,当 j 为 0 时,这将导致除以零的错误。你应该将 j 的初始值设为 2。

2. 你的素数判断逻辑是错误的。你的代码是只要找到一个能被 i 整除的数就认为 i 不是素数,这是错误的。正确的素数判断逻辑应该是:只有当一个数只有 1 和它自身能够整除,那么这个数就是素数。

3. 你没有初始化 sum,这可能导致未定义的行为。你应该在使用之前将 sum 初始化为 0。

以下是修正后的代码:

  1. #include <stdio.h>

  2. int main () {
  3.     int i, j;
  4.     long int sum = 0;

  5.     for (i = 2; i < 10000; i++) {
  6.         for (j = 2; j * j <= i; j++) {
  7.             if (i % j == 0) {
  8.                 break;
  9.             }
  10.         }
  11.         if (j * j > i) {
  12.             sum++;
  13.         }
  14.     }

  15.     printf("1-10000共有%ld个素数\
  16. ", sum);

  17.     return 0;
  18. }
复制代码


这个代码首先将 i 从 2 开始遍历到 10000,然后对于每一个 i,都从 2 遍历到 sqrt(i),如果在这个过程中发现有任何一个 j 能够整除 i,那么就跳出内层的循环。如果没有找到这样的 j,那么就说明 i 是一个素数,将 sum 加一。最后,输出 sum 的值,即 1 到 10000 之间的素数的个数。
请注意,本回答来自GPT-4
如果问题已经解决,请设置最佳答案
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-22 04:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表