c语言求阶乘按位存储数组?c语言如何求一个数的阶乘

经验攻略 bvnghjyi7692 2024-04-14 09:12 2 0

一、利用C语言求阶乘 例如求20! 用循环和函数两种方法……

由于要求的整数可能大大超出一般整数的位数,程序用一维数组存储长整数,存储长整数数组的每个元素只存储长整数的一位数字。如有m位成整数N用数组a[]存储:

N=a[m]×10^(m-1)+a[m-1]×10^(m-2)+…+a[2]×10^1+a[1]×10^0

并用a[0]存储长整数N的位数m,即a[0]=m。按上述约定,数组的每个元素存储k的阶乘k!的一位数字,并从低位到高位依次存于数组的第二个元素、第三个元素……。例如,5!=120,在数组中的存储形式为:

3 0 2 1……

对应:a[0] a[1] a[2] a[3]

首元素3表示长整数是一个3位数,接着是低位到高位依次是0、2、1,表示成整数120。

计算阶乘k!可采用对已求得的阶乘(k-1)!连续累加k-1次(即k个(k-1)!相加)后求得。例如,已知4!=24,计算5!,可对原来的24累加4次24后得到120。对应程序如下:

#include<stdio.h>

#include<malloc.h>

#define MAXN 1000

/*factorial:求k的阶乘:连续加(k-1)次(k-1)!,便得到了k!

结果保存在数组a中。a[0]为结果的位数,其后

下标从小到大表示阶乘的低位到高位

*/

void factorial(int a[],int k)

{

int*b,m=a[0],i,j,r,carry;

b=(int*) calloc(m+1, sizeof(int));

for( i=1;i<=m;i++)//保存a原来的值,用来加。a保存累加的结果

b[i]=a[i];

for( j=1;j<k;j++)//上一次阶乘的值加(k-1)次

{

for( carry=0,i=1;i<=m;i++)//从第一位开始,到最后一位止,依次加(k-1)!中对应数字

{//如果累加得到的位数m大于原来的位数a[0],多出来的位应不断加上进位的值

r=(i<=a[0]?a[i]+b[i]:a[i])+carry;

a[i]=r%10;//求余位

carry=r/10;//求进位的值

}

if(carry) a[++m]=carry;//最后一次处理

}

a[0]=m;//用新的位数值m来更新a[0],以防m有增加。

free(b);

}

/*printFactorial:打印数组a中保存的k的阶乘的结果*/

void printFactorial(int*a,int k)

{

int i;

printf("%4d!=",k);

for(i=a[0];i>0;i--)//从高位到低位打印阶乘的结果

printf("%d",a[i]);

printf("\n");

}

//主函数

int main()

{

int a[MAXN]={0},n,k;

printf("====用递推法求阶乘====\n");

printf("请输入正整数n:");//输入n,求n!

scanf("%d",&n);

a[0]=1;//初始化,1的阶乘是1位

a[1]=1;//1!的值为1

printFactorial(a,1);//打印它的结果

for(k=2;k<=n;k++)

{

factorial(a,k);//利用上次的结果来求k!

printFactorial(a,k);//每次都打印k!

}

return 0;

}

二、C语言:编写程序,求20的阶乘.

给你个通用的。运行后输入20

记得多加点分

#define M 20000/*最大结果位数,DOS能访问的内存有限,最好不要超过 30000位*/

#define N(M+5)

main()

{

int Num;

register int i,j,k,flag;

register unsigned int n,m,pc;

unsigned char str_n[5],result_0[N],result_1[N];

void fun_print_result(char*result,int flag);

int fun_mul(char*a,char*b,char*c,int flag);

printf("输入计算其阶乘的数:Num=");

scanf("%d",&Num);

if(Num>= 100)

{

printf("\n正在进行阶乘运算...\n");

printf("已完成 00000的阶乘,请等待...");

}

for(j=0;j<N;j++)

{

result_1[j]= 0; result_0[j]= 0;

}

result_1[N-1]= 1;

for(i=0;i<5;i++)

{

str_n[i]= 0;

}

n= 1;

pc= 0; flag= N-1;

while(n<= Num)

{

m= n;

k= 4;

while(m> 0)

{

str_n[k]= m%10; m/= 10; k--;

}

if(pc%2== 0)

{

if(fun_mul(str_n,result_1,result_0,flag)!= 1)

{

printf("\n\n结果溢出!当前所设置的最大结果为%d位已完成%d的阶乘",M,pc);

exit(0);

}

}

else

{

if(fun_mul(str_n,result_0,result_1,flag)!= 1)

{

printf("\n\n结果溢出!当前所设置的最大结果为%d位已完成%d的阶乘",M,pc);

exit(0);

}

}

flag= flag-(4-k);/* flag标记相乘后“可能的”第一个有效数字的标号*/

if(pc%2== 0)/*再处理一次使 flag正好标记第一个有效数字的标号*/

{

if(result_0[flag]== 0) flag++;

}

else

{

if(result_1[flag]== 0) flag++;

}

n++; pc++;

if((pc)%25== 0&& Num>= 100&& pc>= 100)

{

printf("\r已完成%5d",pc);

}

}

if(Num>= 100) printf("\n");

if((pc-1)%2== 0)

{

fun_print_result(result_0,flag);

}

else

{

fun_print_result(result_1,flag);

}

}

int fun_mul(char*a,char*b,char*c,int flag)/*相乘函数*/

{

register int i,j;

for(j=flag;j<N;j++) c[j]=0;

for(i=4;i>=0;i--)

{

if(a)

{

for(j=N-1;j>=flag;j--)

{

if(b[j])

{

c[i+j-4]+= a[i]*b[j];

}

if(c[i+j-4]> 9)

{

c[i+j-5]+= c[i+j-4]/10; c[i+j-4]%= 10;

}

}

}

}

if(flag< 10)

{

if(c[0]|| c[1]|| c[2]|| c[3]|| c[4])/***结果溢出判断***/

{

return 0;

}

}

return 1;

}

void fun_print_result(char*result,int flag)/*输出结果函数*/

{

int p;

printf("\n本次计算结果共有%d位,如下:\n\n",N-flag);

for(p=flag;p<N-1;p++)

{

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

if((p+1-flag)%(21*80)== 0)

{

printf("\n计算结果太长,请按任一键看下一屏,Esc退出");

if(getch()== 27)

{

clrscr(); exit(0);

}

clrscr();

}

}

printf("%d",result[N-1]);

printf("\n\n[OK]");

}

三、c语言如何求一个数的阶乘

n的阶乘就是从1到的累积,所以可以通过一个for循环,从1到n依次求积即可。

参考代码:

#include"stdio.h"

int main(){

int n,i,s=1;

scanf("%d",&n);

for(i=1;i<=n;i++)//for循环求累积

s=s*i;

printf("%d\n",s);

return 0;

}

/*

运行结果:(例如求5的阶乘)

5

120

*/

扩展资料:

return用法:

return返回一个数值的意思就是把return<表达式>后面表达式的值返回给调用他的函数。举个例子:

int sum(int i,int j)

{

return i+j;

printf("这个语句不会被执行,因为该子函数执行到上面的return语句就无条件结束了");

}

main()

{

int a=10,b=11,c;

c=sum(a,b);

printf("%d",c);

}