You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++阿姆斯特朗数判断代码异常:非阿姆斯特朗数误判问题排查

阿姆斯特朗数判断程序错误排查与修复

错误分析

你的代码存在四个关键问题,导致逻辑失效:

  • 原始输入值被破坏:在main函数计算数字位数的for循环中,直接修改了输入变量n,循环结束后n的值变为0,后续调用ifarmstrong时传入的是0,必然导致错误判断。
  • while循环逻辑错误:ifarmstrong函数中,循环里直接将num赋值为num%10,没有移除已处理的个位数字,循环只会执行一次(甚至可能陷入死循环),无法遍历所有数位。
  • pow函数的精度陷阱:pow是浮点运算函数,计算整数次幂时可能出现精度误差(比如pow(5,3)可能返回124.9999999,强制转int后变成124),导致立方和计算错误。
  • 拼写错误:输出字符串中的armstorng应为armstrong。

修正后的代码

#include <iostream>
using namespace std;

// 自定义整数幂运算,避免浮点精度问题
int power(int base, int exp) {
    int result = 1;
    for (int i = 0; i < exp; i++) {
        result *= base;
    }
    return result;
}

bool ifarmstrong(int n, int p) {
    int sum = 0;
    int num = n;
    while (num > 0) {
        int digit = num % 10; // 提取个位数字
        sum += power(digit, p);
        num = num / 10; // 移除已处理的个位数字
    }
    return sum == n;
}

int main() {
    int n;
    cin >> n;
    int temp = n; // 保存原始输入值
    int digit_count = 0;
    // 用temp计算位数,不修改原始n
    for (; temp > 0; digit_count++) {
        temp = temp / 10;
    }
    cout << digit_count << endl;
    if (ifarmstrong(n, digit_count)) {
        cout << "Yes it is armstrong" << endl;
    } else {
        cout << "No it is not" << endl;
    }
    return 0;
}

关键修改说明

  1. 保存原始输入:新增temp变量存储输入的n,用temp计算数字位数,保留n的原始值用于后续阿姆斯特朗数判断。
  2. 修复循环逻辑:在ifarmstrong的while循环中,先提取个位数字digit,再将num除以10移除已处理的数位,确保能遍历所有数字。
  3. 替换pow函数:自定义power函数实现整数次幂运算,完全避免浮点精度带来的计算误差。
  4. 修正拼写错误:将输出中的armstorng改为正确的armstrong。

内容的提问来源于stack exchange,提问作者Pranay Malusare

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 04:35:52