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

获取乘1.05后无小数的整数,程序仅输出提示后终止求助

问题分析与修复方案

核心问题点

  • 变量类型与循环上限不匹配:
    int类型的取值范围通常是-2147483648到2147483647,而你设置的循环上限5000000000000000远超出这个范围,编译器会将该大整数截断为负数,导致初始条件i=1 <= 负数不成立,循环直接跳过,没有任何输出。

  • 循环增量错误:
    for循环的增量部分写的是i+1,这只是一个计算表达式,不会修改i的实际值。就算循环条件合法,程序也会陷入死循环,永远停在i=1。正确写法应为i++或i += 1。

  • 浮点数精度误差:
    1.05无法被float精确表示(二进制浮点数的固有局限性),用float计算i*1.05会产生精度偏差,导致(int)result == result的判断失效——本该是整数的结果可能因精度问题被误判为非整数。


修复后的代码

#include <stdio.h>

int main() {
    // 用整数运算规避浮点数精度问题:1.05 = 21/20
    const int numerator = 21;
    const int denominator = 20;
    // 用long long存储大数值,避免溢出
    long long i;

    printf("Numbers multipliable by 1.05 without a decimal point:\n");

    // 数学推导:i必须是20的倍数,直接遍历倍数提升效率
    for (i = 20; i <= 5000000000000000LL; i += 20) {
        long long result = i / denominator * numerator;
        printf("%lld\n", result);
    }

    return 0;
}

修复说明

  1. 变量类型优化:改用long long存储循环变量i,能容纳更大的数值,避免溢出和截断问题。
  2. 整数运算替代浮点数:利用1.05 = 21/20的数学关系,当i是20的倍数时,i*21/20必然是整数,彻底规避浮点数精度误差。
  3. 效率提升:直接遍历20的倍数,跳过不必要的循环判断,大幅减少计算量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 22:11:11