问题描述:
int:表示整数,通常占用4个字节(32位),取值范围为-2147483648到2147483647之间。
long:表示长整数,通常占用4个字节(32位)或8个字节(64位),取值范围至少为-2147483647到2147483647之间,具体取决于编译器和系统的实现。
long long:表示长长整数,通常占用8个字节(64位),取值范围为-9223372036854775808到9223372036854775807之间。
求1000!,这个数值非常大,超过了任何一个给定的数据类型的存储范围,所以无法直接使用给定的数据类型进行存储。
思路:
1000的阶乘是1x2x3x…x1000,
1000^1000=10的3000次方,那么1000的阶乘的位数一定少于3000位。所以开辟一个长度为3000的数组来存储最终的结果。
然后就像我们手算一样,逐位与结果数组相乘,产生了进位,就进到下一位,个位数更新即可。
完成从1x2x3x…xn的计算!
1.使用静态数组
代码:
#include <stdio.h>
#include <stdlib.h>
#define N 3000
//求1000以内的阶乘
int main()
{
int n = 0;
printf("输入要求的阶乘数n\n");
scanf("%d", &n);
//开辟存储结果的数组
int a[N]={0};
//应该初始化第0位为1,因为最小的,n!=1
a[0] = 1;
//遍历1~n的乘数因子
for(int i=2; i<=n; i++)
{
//临时计算值
int term = 0;
//进位值
int c = 0;
//每个i与当前结果数组a[N]相乘
for(int j=0;j<N;j++)
{
term = i*a[j]+c;
//新的个位
a[j] = term % 10;
//给下一位的进位
c = term / 10;
}
}
//第一个不为0的数,对应的索引
int index = 0;
//从前往后找第一个不为0的数
for(int i=N-1;i>=0;i--)
{
if(a[i]!=0)
{
index = i;
break;
}
}
//输出阶乘的结果
for(int j=index;j>=0;j--)
{
printf("%d", a[j]);
}
return 0;
}
运行结果:
2.使用动态数组
代码:
#include <stdio.h>
#include <stdlib.h>
#define N 3000
//求1000以内的阶乘
int main()
{
int n = 0;
printf("输入要求的阶乘数n\n");
scanf("%d", &n);
//开辟动态数组
int* a = (int*)malloc(N*sizeof(int));
//应该初始化第0位为1,因为最小的,n!=1
a[0] = 1;
//初始化其他位置中的值
for(int i=1; i<N;i++)
{
a[i] = 0;
}
//遍历1~n的乘数因子
for(int i=2; i<=n; i++)
{
//临时计算值
int term = 0;
//进位值
int c = 0;
//每个i与当前结果数组a[N]相乘
for(int j=0;j<N;j++)
{
term = i*a[j]+c;
//新的个位
a[j] = term % 10;
//给下一位的进位
c = term / 10;
}
}
//第一个不为0的数,对应的索引
int index = 0;
//从前往后找第一个不为0的数
for(int i=N-1;i>=0;i--)
{
if(a[i]!=0)
{
index = i;
break;
}
}
//输出阶乘的结果
for(int j=index;j>=0;j--)
{
printf("%d", a[j]);
}
//释放资源
free(a);
return 0;
}