陈落轩 发表于 2023-4-10 15:04:02

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

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


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

想知道为什么,谢谢大佬

isdkz 发表于 2023-4-10 15:06:38

首先,你贴的代码块里没有显示完整的代码,所以我不能直接分析出原因。

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

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

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

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

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

int is_prime(int n) {
    if (n <= 1) {
      return 0;
    }
    if (n <= 3) {
      return 1;
    }
    if (n % 2 == 0 || n % 3 == 0) {
      return 0;
    }
    int i = 5;
    while (i * i <= n) {
      if (n % i == 0 || n % (i + 2) == 0) {
            return 0;
      }
      i += 6;
    }
    return 1;
}

int main() {
    int sum = 0;
    for (int i = -1; i <= 10; ++i) {
      if (is_prime(i)) {
            printf("%d ", i);
            sum += i;
      }
    }
    printf("Sum = %d\n", sum);
    return 0;
}

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

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

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

可以尝试用不同的测试用例来验证你的代码是否正确。如果你能提供完整的代码,我将更好地帮助你解决问题。

陈落轩 发表于 2023-4-10 15:07:06

本帖最后由 陈落轩 于 2023-4-10 15:10 编辑

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

int prime( int p );
int PrimeSum( int m, int n );
   
int main()
{
    int m, n, p;

    scanf("%d %d", &m, &n);
    printf("Sum of ( ");
    for( p=m; p<=n; p++ ) {
      if( prime(p) != 0 )
            printf("%d ", p);
    }
    printf(") = %d\n", PrimeSum(m, n));

    return 0;
}

/* 你的代码将被嵌在这里 */

陈落轩 发表于 2023-4-10 15:09:18

#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;
}

陈落轩 发表于 2023-4-10 15:16:23

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

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

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

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;
      }
    }
    return 1;
   
}

这是第二种:
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;
      }
    }
}

isdkz 发表于 2023-4-10 15:19:59

陈落轩 发表于 2023-4-10 15:16
啊啊大佬好,原本的代码好像pta网站直接拷贝会没办法显示,我重新放下
这是第一种:



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

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;
      }
    }
    return 1;
}

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

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

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

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;
      }
    }
}

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

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

为了修复第二个代码块,你需要删除else语句,使其与第一个代码块一样。这样,函数才能正确地检查所有可能的因数,并在循环结束后返回正确的结果。
页: [1]
查看完整版本: 关于return 1 代码块放置不同,求得素数结果不同的疑问