【编程例题】详解经典例题:用C语言实现100的阶乘!

  

        很多刚学编程的小伙伴们一拿到这道题是都觉得很简单,心想:这不就是循环嘛,goto跳转也能做嘛,很简单的嘛。当程序写出来跑测试的时候,大多数小伙伴都傻掉了,为什么结果会是0呢?

 

        其实,这是大家忽略了一个重要的问题,计算机中数据是如何存储的?

        我们都知道,为了方便存储与运算,C语言中将数据类型分为整型char,short,int,long ,long long ,浮点类型的float,double 和long double。他们各自的字节数,不多说,直接放图对比。

 

        我们能很清楚的看到,即使最长的long long 型变量,也只能存储20位数,而100的阶乘早已远远超过了20位数,这便是出现答案等于0的罪魁祸首。

        我们的解决方法是,采用数组来存储每一位数,再逐次相乘,产生进位时用变量carrylai记录进位数。

代码如下:

#include <stdio.h>

int main()
{
	char rets[256] = {1};
	int cnt = 1;
	for(int i = 2;i<=100; i++)
	{
		char carry = 0;
		for(int j=0; j<cnt; j++)
		{
			short num = rets[j] * i +carry;
			rets[j] = num%10;
			carry = num/10;
		}
		while(carry)
		{
			rets[cnt++] = carry%10;
			carry /=10;
		}
 	}
		while(cnt--)
		{
			printf("%hhd",rets[cnt]);
		}

}

最终得出的100的阶乘结果是:

93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000

 

 

 

  • 9
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值