for
exmaple
:123456789*123=123*(123*10^5+56789)=123*123*10^5+123*56789;
如果我们用一个数组result[0]=56789,result[1]=123,那么123456789*123就是123*result[0]%10^6和result[1]*123+result[0]/10^6构成的一个数,另result[0]=123*result[0]%10^6,result[1]=result[1]*123+result[0]/10^6,则这个数就是result[1]result[0]
#include<stdio.h>
int
main()
{
int
n,j,i,t,p
int
result[16000]
while(scanf("%d",&n)!=EOF){
t=p=0result[0]=1
//t记录result中所存数的个数
for(j=1j<配缓=nj++){
//n!=1*2*3*4...*n
for(i=0i<=ti++){
result[i]=result[i]*j+p
//如果sum>99999不成立,则不需进位,进位为0
p=result[i]/100000
//进位
result[i]%=100000
//数组sum中每位存5位做中数字
}
if(p){
//t在最高位有进位的情况下++,最高位存进位
,并让进位为0
t++
result[t]=p
p=0
}
//
如果进位不为0,
则下一次乘的时候将加上该进位,显然不合理
}
printf("%d",result[t])//先把最高位输出,因为最高位没有前导0
for(i=t-1i>=0i--)
printf("%05d",result[i])//s[i]不足5位,说明需补0
也说明result[i]在对100000取余的时候去掉了前导0,所以这里要加上
printf("\n")
}
return
0
}
C语言利用数组计算超大整数的阶乘代码
#include <stdio.h>
int main()
{
int n
int a[9000] //确保保存最终运算结果的数组足够大
int digit = 1 //位数
int temp //阶乘的任一元素与临时结果的某位的乘积结果
int i, j, carry //carry:进位
printf("please in put n:\n")
scanf("%d",&n)
a[0] = 1 //将结果先初始化为1
for ( i=2i<=ni++ ) //开始阶乘,阶乘元素从2开始依次"登场"
{ //按最基本的乘法运算思想来考虑,将临时结果含迹的每位与阶乘元素相乘
for( j=1, carry=0 j<=digitj++ )
{
temp = a[j-1] * i + carry //相应阶乘中的一项与当前所得临时结果的某位相乘(加上进位)
a[j-1] = temp % 10 //更新临时结果的位上信息
carry = temp / 10 //看是否有进位
}
while(carry)
{ //如果有进位
a[++digit-1] = carry % 10 //新加一位,添加信息。位数增1
carry = carry / 10 //看还能不能进位
}
}
printf("n ! = ") //显示结果
for(j = digitj >=1j--)
{
printf("%d",a[j-1])
}
printf("\n")
return 0
}
#include <stdio.h>int main()
{
int n
int a[9000] //确保保存最终运算结果的数组足够大
int digit = 1 //位数
int temp //阶乘的任一元素与临时结果的某位的乘积结果 谈森并
int i, j, carry //carry:进位
printf("please in put n:\n")
scanf("%d",&n)
a[0] = 1 //将结果先初始化为1
for ( i=2 i<=n i++ ) //开始阶乘,阶乘元素从2开始依次"登场"
{ //按最基本的乘法运算思想来考虑,将临时结果的每位与阶乘元素相乘
for( j=1, carry=0 j<=digit j++ )
{
temp = a[j-1] * i + carry //相应阶乘中的一项与当前所得临时结果的某位相乘(加上进位)
a[j-1] = temp % 10 //更新临时结果的位上信息
carry = temp / 10 //看是否有进位
春燃 }
while(carry)
{ //如果有进位
a[++digit-1] = carry % 10 //新加一位,添加信息。位数增1
carry = carry / 10 //看还能不能进位
}
}
printf("n ! = ") //显示结果
for(j = digit j >=1j--)
{
printf("%d",a[j-1])
}
printf("\n")
return 0
}
#include <cstdio>#include <cmath>伏配
#define pi 3.14159265
#define e 2.718281828
int main()
{
int n,num//所求为n!的位数,num为位数
scanf("%d",&n)
if(n==0)
{
num=1
}
else
{
num=(int)((0.5*log(2*pi*n)+n*log(n)-n)/log(10))+1
}
printf("%d",num)
}
使用斯特林公式,n!约等于sqrt(2*pi*n)*(n/e)^n,如不理解需更多信答信息或者有使用高精缺坦指度(long long不够)的需求继续追问
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)