计算偶数乘积的C语言代码运行结果始终为0问题咨询
问题成因
- 核心原因为整型溢出:绝大多数系统中
int为32位有符号整型,取值范围仅为-2147483648 ~ 2147483647。50到2区间所有偶数的乘积数值远超该上限,溢出后触发C语言未定义行为,最终输出结果为0。 - 附加非致命问题:
void main()不属于C语言标准主函数写法,标准写法为int main(),执行结束后需返回整型返回值,部分编译器下该写法会触发编译警告。
解决方案
- 方案1:若允许结果截断或乘积数值未超过64位整型上限,可将存储乘积的变量替换为64位
long long类型,修改后代码如下:
#include<stdio.h> int main(){ int i; long long mul = 1; for(i = 50; i > 1; i--){ if(i % 2 == 0){ mul = mul * i; } } printf("\n Multiplication is %lld",mul); return 0; }
注意:50到2所有偶数的乘积已超过64位
long long的存储上限,本方案仅能解决小范围乘积计算的溢出问题,无法得到本次计算的精确结果。
- 方案2:若需要获取完整精确的超大乘积结果,可通过数组模拟大数乘法实现,示例代码如下:
#include<stdio.h> // 预留足够空间存储结果每一位 #define MAX_LEN 1000 int main() { int res[MAX_LEN] = {1}; // 初始乘积为1 int len = 1; // 当前结果的位数 // 从小到大遍历偶数计算,逻辑等价于从50到2遍历 for (int i = 2; i <= 50; i += 2) { int carry = 0; // 逐位相乘处理进位 for (int j = 0; j < len; j++) { int product = res[j] * i + carry; res[j] = product % 10; carry = product / 10; } // 处理剩余进位 while (carry) { res[len++] = carry % 10; carry /= 10; } } printf("\n Multiplication is "); // 数组低位存储结果低位,需倒序输出 for (int k = len - 1; k >= 0; k--) { printf("%d", res[k]); } return 0; }
内容的提问来源于stack exchange,提问作者Mrunali Adhal
相关产品推荐
相关产品推荐

