获取乘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; }
修复说明
- 变量类型优化:改用
long long存储循环变量i,能容纳更大的数值,避免溢出和截断问题。 - 整数运算替代浮点数:利用
1.05 = 21/20的数学关系,当i是20的倍数时,i*21/20必然是整数,彻底规避浮点数精度误差。 - 效率提升:直接遍历20的倍数,跳过不必要的循环判断,大幅减少计算量。
内容的提问来源于stack exchange,提问作者Kube
相关产品推荐
相关产品推荐

