C语言最小纸币张数计算程序大数值运行异常的原因及解决方案
错误原因
- 核心问题是
int类型的存储范围不足:32位有符号int的最大可存储值为2^31-1(即2147483647),你输入的超大数值1234554875687远超过这个上限,调用scanf("%d", &money)时会发生整数溢出,存入money的是被截断后的错误值,后续计算自然输出错误结果。
解决方案
- 将存储金额的变量
money替换为取值范围更大的64位整数类型long long,其余计数变量除100元面额计数外,其余最大值不会超过50,可保留int类型,也可同步替换为long long。
- 将存储金额的变量
- 将
scanf的输入格式符从%d替换为%lld匹配long long类型,对应100元面额计数的printf输出格式符也同步修改为%lld。
- 将
修改后可运行代码
#include<stdio.h> int main (void) { long long money, _100; int r100, _50, r50, _10, r10, _5, r5, _2, r2, _1; printf("Enter the amount of money you wanna have but will never get : "); scanf("%lld", &money); _100 = money/100; r100 = money % 100; _50 = r100/50; r50 = r100 % 50; _10 = r50/10; r10 = r50 % 10; _5 = r10/5; r5 = r10 % 5; _2 = r5/2; r2 = r5 % 2; _1 = r2/1; printf("No of notes required of 100 are %lld\n", _100); printf("No of notes required of 50 are %d\n", _50); printf("No of notes required of 10 are %d\n", _10); printf("No of notes required of 5 are %d\n", _5); printf("No of notes required of 2 are %d\n", _2); printf("No of notes required of 1 are %d\n", _1); return 0; }
内容的提问来源于stack exchange,提问作者Mudit Sharma
相关产品推荐
相关产品推荐

