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

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

先把代码贴上:


#include
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
int 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




你可能感兴趣的:(算法,编程基础,ACM)