二分之根号五减一442 2023-10-06 15:37 采纳率: 90%
浏览 9
已结题

C语言程序中忽略特殊值出现的错误

#include<stdio.h>
int main() {
    int m;
    int t;
    scanf_s("%d" ,&m);
    if (panduan(m) == 0)
        printf("yes");
    else
    {
        t = 0.5 * panduan(m) + 1;
        if (m == t)
            printf("yes");
        else
            printf("no");
    }
    return 0;
}
int panduan(int m) {
    if (m == 1||m==0)
        return m;
    int i = 2;
    int sum = 0;
    int k = m;
        for (i = 2; i < m; i++)
        {
            if (m % i == 0 && m != i)
            {
                m /= i;
                sum += i + m;
                m = k;
            }
        }
    return sum;
}

这个程序为什么不能满足这个问题:所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身?

  • 写回答

3条回答 默认 最新

  • AICodeThunder 2023-10-06 15:49
    关注

    下面的回答是我的智能DEBUG机器答复:
    (1)没有声明函数panduan
    如果你要用一个函数,必须在程序开始部分进行声明,或者在同一个文件中定义这个函数。
    (2)panduan函数逻辑不对
    for循环中,i从2到m-1,然而在检查m是否可以被i整除,以及m是否不等于i。这实际上是在寻找m的所有正因子,而不是只查找从2到m-1的因子。
    (3)您描述的忽略特殊值错误来自于: 循环错误
    在循环中,执行m/=i,表示将m除以i。然后在下一次循环中,i增加1,这可能导致m变为0或负数。当m为0或负数时,m%i==0的判断将导致错误。
    下面是修复这些问题后的代码:

    #include <stdio.h>
    
    int panduan(int m); // 声明函数
    
    int main() {
        int m;
        scanf_s("%d" ,&m);
        if (panduan(m) == 0)
            printf("yes");
        else
        {
            int t = panduan(m) / 2 + 1; // 这里不需要浮点数
            if (m == t)
                printf("yes");
            else
                printf("no");
        }
        return 0;
    }
    
    int panduan(int m) {
        if (m == 1||m==0)
            return m;
        int i = 2;
        int sum = 0;
        while (i <= m) // 这里应该从2开始找到m的因子,而不是到m-1
        {
            if (m % i == 0 && m != i)
            {
                sum += i; // 这里只需要加因子i,不需要加 m/i
                i++; // 在每次循环后,i应该增加,以便找到下一个因子
            }
            else
                i++; // 如果i是m的一个因子并且i不等于m,那么i会被加到sum中,然后i会增加以查找下一个可能的因子。如果i是m的一个因子并且i等于m,那么i会被加到sum中,并且循环结束。因此这里i的增加应该放在if语句的外部。
        }
        return sum; // 在所有可能的因子都被考虑后返回sum
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 10月15日
  • 已采纳回答 10月7日
  • 创建了问题 10月6日

悬赏问题

  • ¥15 matlab数据降噪处理,提高数据的可信度,确保峰值信号的不损失?
  • ¥15 怎么看我在bios每次修改的日志
  • ¥15 python+mysql图书管理系统
  • ¥15 Questasim Error: (vcom-13)
  • ¥15 船舶旋回实验matlab
  • ¥30 SQL 数组,游标,递归覆盖原值
  • ¥15 为什么我的数据接收的那么慢呀有没有完整的 hal 库并 代码呀有的话能不能发我一份并且我用 printf 函数显示处理之后的数据,用 debug 就不能运行了呢
  • ¥20 gitlab 中文路径,无法下载
  • ¥15 用动态规划算法均分纸牌
  • ¥30 udp socket,bind 0.0.0.0 ,如何自动选取用户访问的服务器IP来回复数据