鱼C论坛

 找回密码
 立即注册
查看: 1966|回复: 5

[已解决]关于return 1 代码块放置不同,求得素数结果不同的疑问

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

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

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

x
下面是两个求素数的代码块,都是使用sqrt函数,用for循环配对,测试用例为(-1 10),但是由于return 1 放置的位置不同,导致求得结果不一样,想知道为什么,谢谢大佬。
  1. <blockquote>#include <stdio.h>
复制代码
这份代码结果是正常的,输出结果为Sum of ( 2 3 5 7 ) = 17
但下面这串代码结果就不一样了
  1. <blockquote>#include <stdio.h>
复制代码



这份代码的结果为Sum of ( 2 3 5 7 9 ) = 26

想知道为什么,谢谢大佬
最佳答案
2023-4-10 15:19:59
陈落轩 发表于 2023-4-10 15:16
啊啊大佬好,原本的代码好像pta网站直接拷贝会没办法显示,我重新放下
这是第一种:

第一个代码块(正确的):

  1. int prime(int p) {
  2.     int i;
  3.     if (p < 2) {
  4.         return 0;
  5.     }
  6.     if (p == 2) {
  7.         return 1;
  8.     }
  9.     for (i = 2; i <= sqrt(p); i++) {
  10.         if (p % i == 0) {
  11.             return 0;
  12.         }
  13.     }
  14.     return 1;
  15. }
复制代码


在这个代码块中,for循环会遍历从2到sqrt(p)的所有整数。如果p可以被i整除(即p % i == 0),则说明p不是素数,函数返回0。

如果循环结束后没有发现可以整除p的整数,说明p是素数,函数返回1。

第二个代码块(错误的):

  1. int prime(int p) {
  2.     int i;
  3.     if (p < 2) {
  4.         return 0;
  5.     }
  6.     if (p == 2) {
  7.         return 1;
  8.     }
  9.     for (i = 2; i <= sqrt(p); i++) {
  10.         if (p % i == 0) {
  11.             return 0;
  12.         } else {
  13.             return 1;
  14.         }
  15.     }
  16. }
复制代码


在这个代码块中,问题出在for循环内的else语句。在第一次迭代时,如果p不能被i整除,函数就会立即返回1,而不是继续检查其他可能的因数。

这导致了一些合数(如9)被错误地判断为素数,因为在第一次迭代(i=2)时,p % i != 0,函数就返回了1。

为了修复第二个代码块,你需要删除else语句,使其与第一个代码块一样。这样,函数才能正确地检查所有可能的因数,并在循环结束后返回正确的结果。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-4-10 15:06:38 | 显示全部楼层
首先,你贴的代码块里没有显示完整的代码,所以我不能直接分析出原因。

但是,我可以给你一些建议来找出问题所在。

首先,两个代码块的主要区别是return 1的位置。如果return 1放置在不同的地方,

可能会导致函数在循环或条件语句中返回不同的结果。这将影响到求素数的结果。

下面是一个简单的素数检测函数的示例:

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

  3. int is_prime(int n) {
  4.     if (n <= 1) {
  5.         return 0;
  6.     }
  7.     if (n <= 3) {
  8.         return 1;
  9.     }
  10.     if (n % 2 == 0 || n % 3 == 0) {
  11.         return 0;
  12.     }
  13.     int i = 5;
  14.     while (i * i <= n) {
  15.         if (n % i == 0 || n % (i + 2) == 0) {
  16.             return 0;
  17.         }
  18.         i += 6;
  19.     }
  20.     return 1;
  21. }

  22. int main() {
  23.     int sum = 0;
  24.     for (int i = -1; i <= 10; ++i) {
  25.         if (is_prime(i)) {
  26.             printf("%d ", i);
  27.             sum += i;
  28.         }
  29.     }
  30.     printf("Sum = %d\n", sum);
  31.     return 0;
  32. }
复制代码


在这个示例中,is_prime函数用于检查一个整数是否为素数。

如果你在这个函数中改变return 1的位置,可能会导致错误的结果。

建议你检查一下你的代码,确保return 1在合适的位置,并确认其他的循环和条件语句是否正确。

可以尝试用不同的测试用例来验证你的代码是否正确。如果你能提供完整的代码,我将更好地帮助你解决问题。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-10 15:07:06 | 显示全部楼层
本帖最后由 陈落轩 于 2023-4-10 15:10 编辑

哎代码怎么没了...
重发一次,这是第一条
  1. #include <stdio.h>
  2. #include <math.h>

  3. int prime( int p );
  4. int PrimeSum( int m, int n );
  5.    
  6. int main()
  7. {
  8.     int m, n, p;

  9.     scanf("%d %d", &m, &n);
  10.     printf("Sum of ( ");
  11.     for( p=m; p<=n; p++ ) {
  12.         if( prime(p) != 0 )
  13.             printf("%d ", p);
  14.     }
  15.     printf(") = %d\n", PrimeSum(m, n));

  16.     return 0;
  17. }

  18. /* 你的代码将被嵌在这里 */
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-10 15:09:18 | 显示全部楼层
  1. #include <stdio.h>
复制代码


int prime( int p ){
    int i ;
    if (p < 2){
        return 0;
    }
    if(p == 2){
        return 1;
    }
    for(i = 2; i <= sqrt(p); i++){
        if(p % i == 0){
            return 0;
        }else{
            return 1;
        }
    }
   
}
int PrimeSum( int m, int n ){
    int sum = 0;
    for(; m <= n; m++){
        if(prime(m)){
            sum += m;
        }
    }
    return sum;
}

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-10 15:16:23 | 显示全部楼层
isdkz 发表于 2023-4-10 15:06
首先,你贴的代码块里没有显示完整的代码,所以我不能直接分析出原因。

但是,我可以给你一些建议来找出 ...

啊啊大佬好,原本的代码好像pta网站直接拷贝会没办法显示,我重新放下
这是第一种:

  1. int prime( int p ){
  2.     int i ;
  3.     if (p < 2){
  4.         return 0;
  5.     }
  6.     if(p == 2){
  7.         return 1;
  8.     }
  9.     for(i = 2; i <= sqrt(p); i++){
  10.         if(p % i == 0){
  11.             return 0;
  12.         }
  13.     }
  14.     return 1;
  15.    
  16. }
复制代码


这是第二种:
  1. int prime( int p ){
  2.     int i ;
  3.     if (p < 2){
  4.         return 0;
  5.     }
  6.     if(p == 2){
  7.         return 1;
  8.     }
  9.     for(i = 2; i <= sqrt(p); i++){
  10.         if(p % i == 0){
  11.             return 0;
  12.         }else{
  13.             return 1;
  14.         }
  15.     }
  16. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-10 15:19:59 | 显示全部楼层    本楼为最佳答案   
陈落轩 发表于 2023-4-10 15:16
啊啊大佬好,原本的代码好像pta网站直接拷贝会没办法显示,我重新放下
这是第一种:

第一个代码块(正确的):

  1. int prime(int p) {
  2.     int i;
  3.     if (p < 2) {
  4.         return 0;
  5.     }
  6.     if (p == 2) {
  7.         return 1;
  8.     }
  9.     for (i = 2; i <= sqrt(p); i++) {
  10.         if (p % i == 0) {
  11.             return 0;
  12.         }
  13.     }
  14.     return 1;
  15. }
复制代码


在这个代码块中,for循环会遍历从2到sqrt(p)的所有整数。如果p可以被i整除(即p % i == 0),则说明p不是素数,函数返回0。

如果循环结束后没有发现可以整除p的整数,说明p是素数,函数返回1。

第二个代码块(错误的):

  1. int prime(int p) {
  2.     int i;
  3.     if (p < 2) {
  4.         return 0;
  5.     }
  6.     if (p == 2) {
  7.         return 1;
  8.     }
  9.     for (i = 2; i <= sqrt(p); i++) {
  10.         if (p % i == 0) {
  11.             return 0;
  12.         } else {
  13.             return 1;
  14.         }
  15.     }
  16. }
复制代码


在这个代码块中,问题出在for循环内的else语句。在第一次迭代时,如果p不能被i整除,函数就会立即返回1,而不是继续检查其他可能的因数。

这导致了一些合数(如9)被错误地判断为素数,因为在第一次迭代(i=2)时,p % i != 0,函数就返回了1。

为了修复第二个代码块,你需要删除else语句,使其与第一个代码块一样。这样,函数才能正确地检查所有可能的因数,并在循环结束后返回正确的结果。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-22 19:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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