鱼C论坛

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

[已解决]代码为什么没有输出啊 错在哪了啊

[复制链接]
发表于 2023-10-18 20:10:31 | 显示全部楼层 |阅读模式

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

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

x
题目描述
输入整数a
和b
,试验证a∼b
区间内的所有正偶数都能够分解为两个素数之和(即验证哥德巴赫猜想对a∼b
以内的正偶数成立)。

输入描述
两个整数a,b
(2<a<b≤500000
,b-a<200000
)。

输出描述
输出a∼b
区间内的正偶数的素数之和,每个占一行,例如4=2+2
,如果有多种可能,只输出一种,即第一个素数最小的。
  1. #include<stdio.h>
  2. #include<math.h>
  3. long long is_prime(long long x)
  4. {
  5.     if(x<2) return 1;
  6.     for(long long i=2;i<sqrt(x);i++)
  7.     {
  8.         if(x%i==0) return 0;
  9.     }
  10.     return 1;
  11. }
  12. int main()
  13. {
  14.     long long a,b,i,j,k;
  15.     scanf("%lld%llf",&a,&b);
  16.     for(i=a;i<=b;i++)
  17.     {
  18.         if(i%2==0)
  19.         {
  20.             for (j=2;j<=i/2;j++)
  21.             {
  22.                 if(is_prime(j))
  23.                 {
  24.                     k=i-j;
  25.                     if(is_prime(k)) printf("%d=%d+%d",i,j,k);
  26.                 }
  27.             }
  28.         }
  29.     }
  30. }
复制代码
最佳答案
2023-10-18 20:11:20
你的代码中存在一些问题,我将帮你一一指出并提供修正的建议。

1. 在你的 is_prime 函数中,你的循环条件应该是 i <= sqrt(x) 而不是 i < sqrt(x)。因为如果 x 是一个完全平方数,那么它的平方根也应该被考虑在内。

2. 在 scanf 函数中,你应该使用 %lld 来读取 b,而不是 %llf%llf 是用来读取双精度浮点数的,而你的 b 是一个长整型。

3. 在你的 printf 函数中,你应该使用 %lld 来打印 ijk,而不是 %d%d 是用来打印整型的,而你的 ijk 是长整型。

修正后的代码如下:

  1. #include<stdio.h>
  2. #include<math.h>

  3. long long is_prime(long long x) {
  4.     if(x<2) return 0;
  5.     for(long long i=2;i<=sqrt(x);i++)
  6.     {
  7.         if(x%i==0) return 0;
  8.     }
  9.     return 1;
  10. }

  11. int main() {
  12.     long long a,b,i,j,k;
  13.     scanf("%lld%lld",&a,&b);
  14.     for(i=a;i<=b;i++)
  15.     {
  16.         if(i%2==0)
  17.         {
  18.             for (j=2;j<=i/2;j++)
  19.             {
  20.                 if(is_prime(j))
  21.                 {
  22.                     k=i-j;
  23.                     if(is_prime(k)) {
  24.                         printf("%lld=%lld+%lld\
  25. ",i,j,k);
  26.                         break;
  27.                     }
  28.                 }
  29.             }
  30.         }
  31.     }
  32.     return 0;
  33. }
复制代码


这段代码应该能够正确地验证在给定区间内的所有正偶数是否都能够分解为两个素数之和。
请注意,本回答来自GPT-4
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-10-18 20:11:10 | 显示全部楼层
问题出在 is_prime() 函数的判断条件上。在 for 循环中,应该将判断条件改为 i <= sqrt(x) ,而不是 i < sqrt(x) 。因为 sqrt(x) 返回的是一个浮点数,而 i 是一个整数,所以需要使用 <= 来进行比较。此外,还需要将 printf 语句中的格式化字符串改为 %lld ,因为 i 、 j 和 k 都是 long long 类型的整数。

下面是修改后的代码:

  1. #include <stdio.h>
  2. #include <math.h>

  3. long long is_prime(long long x)
  4. {
  5.     if (x < 2) return 0;
  6.     for (long long i = 2; i <= sqrt(x); i++)
  7.     {
  8.         if (x % i == 0) return 0;
  9.     }
  10.     return 1;
  11. }

  12. int main()
  13. {
  14.     long long a, b, i, j, k;
  15.     scanf("%lld%lld", &a, &b);
  16.     for (i = a; i <= b; i++)
  17.     {
  18.         if (i % 2 == 0)
  19.         {
  20.             for (j = 2; j <= i / 2; j++)
  21.             {
  22.                 if (is_prime(j))
  23.                 {
  24.                     k = i - j;
  25.                     if (is_prime(k)) printf("%lld=%lld+%lld\n", i, j, k);
  26.                 }
  27.             }
  28.         }
  29.     }
  30.     return 0;
  31. }
复制代码


这样修改后的代码应该能够正确输出结果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-18 20:11:20 | 显示全部楼层    本楼为最佳答案   
你的代码中存在一些问题,我将帮你一一指出并提供修正的建议。

1. 在你的 is_prime 函数中,你的循环条件应该是 i <= sqrt(x) 而不是 i < sqrt(x)。因为如果 x 是一个完全平方数,那么它的平方根也应该被考虑在内。

2. 在 scanf 函数中,你应该使用 %lld 来读取 b,而不是 %llf%llf 是用来读取双精度浮点数的,而你的 b 是一个长整型。

3. 在你的 printf 函数中,你应该使用 %lld 来打印 ijk,而不是 %d%d 是用来打印整型的,而你的 ijk 是长整型。

修正后的代码如下:

  1. #include<stdio.h>
  2. #include<math.h>

  3. long long is_prime(long long x) {
  4.     if(x<2) return 0;
  5.     for(long long i=2;i<=sqrt(x);i++)
  6.     {
  7.         if(x%i==0) return 0;
  8.     }
  9.     return 1;
  10. }

  11. int main() {
  12.     long long a,b,i,j,k;
  13.     scanf("%lld%lld",&a,&b);
  14.     for(i=a;i<=b;i++)
  15.     {
  16.         if(i%2==0)
  17.         {
  18.             for (j=2;j<=i/2;j++)
  19.             {
  20.                 if(is_prime(j))
  21.                 {
  22.                     k=i-j;
  23.                     if(is_prime(k)) {
  24.                         printf("%lld=%lld+%lld\
  25. ",i,j,k);
  26.                         break;
  27.                     }
  28.                 }
  29.             }
  30.         }
  31.     }
  32.     return 0;
  33. }
复制代码


这段代码应该能够正确地验证在给定区间内的所有正偶数是否都能够分解为两个素数之和。
请注意,本回答来自GPT-4
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 01:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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