【问题标题】:how to calculate Primes如何计算素数
【发布时间】:2017-04-25 12:38:36
【问题描述】:

我想要所有 Prime 并且程序可以运行,但我收到了警告:

warning: control reaches end of non-void function [-Wreturn-type] }

我知道我需要在 bool isprim 中添加最后一个 return,但我不明白。

bool isPrim(int prim, int tester) {
    if (prim <= 1) {
        return 0;   
    } else if (tester == 1) {
        return 1;   
    } else if (tester >= 1 && (prim % tester) != 0) {
        isPrim(prim, tester - 1);
    } else if ((prim % tester) == 0) {
        return 0;   
    }
}   
    
int main() {
    int eingabe;
    int zaehler = 1;
    printf("Bitte Zahl zum testen eingeben\n");
    scanf("%i", &eingabe);

    if (isPrim(eingabe, eingabe - 1)) {
        printf("Ihre Zahl ist eine Primzahl\n");
    } else {
        printf("Ihre Zahl ist keine Primzahl\n");
    }
    //show me all Primes <1000
    printf("Nun werden alle Primzahlen bis 10000 ausgegeben\n\n");
    while (zaehler <= 10000) {
        if (isPrim(zaehler, zaehler - 1)) {
            printf("%i\t", zaehler);    
        }   

        zaehler++;  
    }

    return 0;
}

【问题讨论】:

  • 我认为您缺少退货声明 return isPrim(prim,tester-1);
  • 不,我收到警告
  • 您应该标记您正在使用的语言,以使相关人员可以看到问题。您的语言可能不会将整数隐式转换为布尔值,因此您应该将 1s 更改为 trues 并将 0s 更改为 falses。
  • 对不起,它的“C”你的解决方案不起作用我收到警告
  • 请删除您的答案并编辑问题。您应该阅读一些有关如何参与本网站的说明,或看看其他人的做法。

标签: c function recursion primes


【解决方案1】:

你不能有任何可能不返回布尔值的分支,即使它们永远不会被执行:

// This will throw a warning.
bool func(){
  if( true ){
    return 0;
  }
}

要么将最后一个 else if 更改为 else,要么在最后添加一个额外的 else(或直接返回)。

【讨论】:

    【解决方案2】:

    编译器发出警告是因为在某些执行路径中函数没有return 语句。

    • 例如,当函数递归调用自身时,不会返回isPrim(prim, tester - 1)的值,也不会遇到return语句。
    • 该函数有多余的测试,但不能处理所有情况:例如如果prim = 2tester = -3,函数中的所有测试都将评估为假,控制将结束没有return 语句的函数体。

    这是修改后的版本:

    bool isPrim(int prim, int tester) {
        if (prim <= 1 || tester < 1) {
            return 0;   
        } else if (tester == 1) {
            return 1;   
        } else if (prim % tester != 0) {
            return isPrim(prim, tester - 1);
        } else {
            return 0;   
        }
    }   
    

    它可以被简化为1,具有与以下相同的低效语义:

    bool isPrim(int prim, int tester) {
        return (prim <= 1 || tester < 1) ? 0 : (tester == 1) ? 1 :
               (prim % tester != 0) ? isPrim(prim, tester - 1) : 0;
    }   
    

    1)这个简化的替代方案只有一个语句,但不一定更容易阅读:)

    【讨论】:

      【解决方案3】:
      
      package main
      
      import (
          "fmt"
          "math"
      )
      
      func main() {
          primeTester1(600851475143)
      }
      
      func primeTester1(x int64) {
          cn := true
          var i int64
          for i = 2; i <= int64(math.Sqrt(float64(x))); i++ {
              if x%i == 0 {
                  cn = false
                  fmt.Printf("%v is not a Prime number as, it is a multiple of %v", x, i)
                  break
              }
          }
          if cn {
              fmt.Printf("%v is a Prime number", x)
          }
      }
      

      【讨论】:

      • 我的眼睛可能不像以前那样了,但这看起来不像 C,也没有解决警告问题。
      • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
      猜你喜欢
      • 1970-01-01
      • 2010-12-19
      • 1970-01-01
      • 2016-08-31
      • 1970-01-01
      • 2014-03-26
      • 2011-03-09
      • 2014-04-28
      • 1970-01-01
      相关资源
      最近更新 更多