nyoj 28 大数阶乘问题

常用数据类型对应字节数 
可用如sizeof(char),sizeof(char*)等得出
32位编译器:
char :1个字节 
char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节。同理64位编译器) 
short int : 2个字节                    范围:-2^15 ~2^15-1
int: 4个字节                            范围:-2^31 ~2^31-1
unsigned int : 4个字节             范围:0 ~2^32-1
float: 4个字节                          
double: 8个字节 
long: 4个字节                           范围:-2^31 ~2^31-1
long long: 8个字节                  范围:-2^63 ~2^63-1
unsigned long: 4个字节        范围:0~2^32-1
64位编译器:
char :1个字节 
char*(即指针变量): 8个字节 
short int : 2个字节 
int: 4个字节 
unsigned int : 4个字节 
float: 4个字节 
double: 8个字节 
long: 8个字节 
long long: 8个字节 
unsigned long: 8个字节 

由于每种数据类型存放的数据都有限制,故一些大数的存放要用到数组,大数阶乘的算法由此应运而生。

算法代码如下:
# include <stdio.h>
# include <string.h>

# define MAX 20000

int main(void)
{
	int arr[MAX]; 
	memset(arr, 0, sizeof(arr)); //把数组arr的所有元素初始化为0
	arr[0] = 1;
	int i, j, m, s;
	scanf("%d", &m);
	for(i = 2; i <= m; i++)
	{
		int t = 0;
		for(j = 0; j < MAX; j++)
		{
			s = arr[j] * i + t;//存储计算的结果 
			arr[j] = s % 10;//把最低为存到数组前面 
			t = s / 10;//进位 
		}
	}
	for(i = MAX - 1; i >= 0; i--)//把0都筛掉 
	{
		if(arr[i]) break;
	}
	for(j = i; j >= 0; j--)//进行输出 
	{
		printf("%d", arr[j]);
	}
	printf("\n");
	return 0;
}


此代码用于计算阶乘,可以存放0~10000以内阶乘的结果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值