c语言2的的大数次幂,大数阶乘和一个数的n次幂(c语言)

对于一个数的阶乘或者一个数的n(n比较小)次幂,一般情况下(不是竞赛),用一个for循环,就可以解决问题,对于这样的问题一般人都可以解决,但是如果遇到比较大的阶乘,比如1000的阶乘,或者是2的128次方,我们应该怎么让计算机替我们计算呢,用double?好像不行,这个时候,直接用现成的数据类型,是解决不了问题的,而是需要用我们的数组来存储各个位上的数字。

先把代码贴上:

#includeint main(void)

{

int num,i,j,temp,digit=1;

while(scanf("%d",&num)!=EOF)

{

int p[40000]={0};

p[0]=1;

digit=1; / / 刚开始的位数

for(i=2;i<=num;i++)// 从二一直乘到sum

{

int c=0;

for(j=1;j<=digit;j++)// 有几位就循环几次

{

temp=p[j-1]*i+c;// 每一位乘上i,加上余数后所得的数

p[j-1]=temp%10;//把最后一位给数组,其他的向前进

c=temp/10;// 把temp的最后一位数去掉

}

while(c!=0)//用while把c分配到各个高位

{

p[++digit-1]=c%10;//为什么是++digit-1而不是digit?因为每进一位需要digit(位数)加一

c=c/10;

}

}

for(j=digit-1;j>=0;j--)//输出

printf("%d",p[j]);

printf("\n");

}

return 0;

}

0be2364c82176fb6956027abfa5f3aaa.png

程序的总体思想就是,把数组中的每个数都当做一位,先让第一位p[0]为1,然后让每一位都乘上2,一直乘到要算的阶乘的那个数,期间如果结果大于十,就向前进一位,知把所有的数都乘完,把各个位数存到数组中,然后再从后向前输出。

如果是求一个数的次幂,应该怎么写程序呢?其实原理都是一样的,只需要把上面的程序作一个小小的改变就行!

#includeint main(void)

{

int num,i,j,temp,digit=1;

while(scanf("%d",&di,&num)!=EOF)//num为次幂数,di为底数

{

int p[40000]={0};

p[0]=1;

digit=1; / / 刚开始的位数

for(i=1;i<=num;i++)// 一共乘num次

{

int c=0;

for(j=1;j<=digit;j++)// 有几位就循环几次

{

temp=p[j-1]*di+c;// 每一位乘上i,加上余数后所得的数

p[j-1]=temp%10;//把最后一位给数组,其他的向前进

c=temp/10;// 把temp的最后一位数去掉

}

while(c!=0)//用while把c分配到各个高位

{

p[++digit-1]=c%10;//为什么是++digit-1而不是digit?因为每进一位需要digit(位数)加一

c=c/10;

}

}

for(j=digit-1;j>=0;j--)//输出

printf("%d",p[j]);

printf("\n");

}

return 0;

}

运行结果:2^32和2^64

31ddda20dcbe8c0940bcc727eb03f3cb.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值