鱼C论坛

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

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

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

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

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

x
下面是两个求素数的代码块,都是使用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

想知道为什么,谢谢大佬
最佳答案
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语句,使其与第一个代码块一样。这样,函数才能正确地检查所有可能的因数,并在循环结束后返回正确的结果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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在合适的位置,并确认其他的循环和条件语句是否正确。

可以尝试用不同的测试用例来验证你的代码是否正确。如果你能提供完整的代码,我将更好地帮助你解决问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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;
}

/* 你的代码将被嵌在这里 */
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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;
}

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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;
        }
    }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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语句,使其与第一个代码块一样。这样,函数才能正确地检查所有可能的因数,并在循环结束后返回正确的结果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-7 15:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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