加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-14 02:58:12 所属栏目:大数据 来源:网络整理
导读:对于一个数的阶乘或者一个数的n(n比较小)次幂,一般情况下(不是竞赛),用一个for循环,就可以解决问题,对于这样的问题一般人都可以解决,但是如果遇到比较大的阶乘,比如1000的阶乘,或者是2的128次方,我们应该怎么让计算机替我们计算呢,用double?好

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

先把代码贴上:


#include<stdio.h>
int 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;
}


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


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

#include<stdio.h>
int main(void)
{
int num,&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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读