c语言计算阶乘,计算20的阶乘,结果要用什么数据类型?

【C语言】 计算int型数值n的阶乘
当int型数值n比较大时,比如n=200,则算出来的阶乘时非常大的,显然,一般的数据类型并不能存放,此时就要用到前面的有关于大数的处理运算了,要用到大数加法和大数乘法。注意,此程序仅通过初步测试,不保证完全正确性!仅供参考,谢谢#include &stdio.h&#include &stdlib.h&#include &memory.h&char *getNum();char *reverse(char *cBegin);char *mulOneNum(char *n, char NUM);char *addBit(char *num1, int b);char *numAdd(char *a, char *b);&& &&& &char *mulNum(char *num1, char *num2);int lenNum(int n);char *factorial(int n);int main(){&& &&& &char *fac=NULL;&& &scanf(&%d&, &n);&& &fac = factorial(n);&& &printf(&The factorial of %d is:& %s.&, n, fac);&& &return 0;}char *getNum()&& &&& &/* 把输入的数字看成是字符,存入字符数组 */{&& &char *num1=NULL, *num2=NULL;&& &&& &int len=0;&& &while(1)&& &{&& &&& &c = getchar();&& &&& &if(c&'0' || c&'9')&& &&& &/* 如果不是数字,则退出循环 */&& &&& &&& &&& &&& &len++;&& &&& &&& &num2 = (char *)malloc(sizeof(char) * (len+1));&& &&& &&& &&& &/* 动态分配一片新的空间,长度比前一次的空间长度多1,用于存放新输入的数字字符 */&& &&& &if(num1 != NULL)&& &&& &{&& &&& &&& &memcpy(num2, num1, sizeof(char) * len);&& &&& &/* 把前一次分配到的字符数组空间的前len个内存复制给新的空间 */&& &&& &&& &free(num1);&& &&& &/* 把前一次分配到的内存释放掉 */&& &&& &}&& &&& &*(num2+len-1) =&& &&& &/* 数组元素从0开始 */&& &&& &*(num2+len) = '\0';&& &&& &num1 = num2;&& &&& &}&& &return num1;}char *reverse(char *cBegin)&& &&& &/* 把一个字符数组cBegin里的元素按相反顺序放置得到新的字符数组cLast */{&& &char *cLast=NULL;&& &&& &/* 指向新字符数组的指针变量 */&& &int lenC=strlen(cBegin),&& &&& &/* strlen(字符数组名)得到的是这个字符数组确确的字符个数,不包括结束标志'\0' */&& &cLast = (char *)malloc(sizeof(char) * (lenC+1));&& &&& &/* 因为新数组cLast要包括'\0',故要分配(lenC+1)长度的空间 */&& &for(i=0; i&lenC; i++)&& &&& &*(cLast+lenC-1-i) = *(cBegin+i);&& &&& &/* 交换字符顺序 */&& &*(cLast+lenC) = '\0';&& &return cL&& &&& &/* 返回新字符数组的地址 */}char *mulOneNum(char *num, char NUM)&& &//用一个数字字符和一个数字字符串做乘法,例如用num=&986&, NUM='9'{&& &char *c=NULL, *nc=reverse(num), *pc=NULL;&& &//乘法是从低位开始做的,所以要把num的字符顺序反转&& &int len=strlen(num);&& &int i, s=0;&& &pc = c = (char *)malloc(sizeof(char) * (len+2));&& &while(*nc)&& &{&& &&& &*pc = (s+(*(nc)-'0')*(NUM-'0'))%10 + '0';&& &&& &s = ((*(nc)-'0')*(NUM-'0')+s)/10;&& &&& &// 确定进位&& &&& &nc++;&& &&& &pc++;&& &}&& &if(s)&& &{&& &&& &*pc = s + '0';&& &&& &pc++;&& &}&& &*pc = '\0';&& &return(reverse(c));&& &&& &//因为前面做乘法时是从低位开始的,所以输出结果时要把结果的数字字符再反转回来才是正确的结果}char *addBit(char *num1, int b)&& &&& &//在字符串后面添加b个0,比如num1=&284&,b=4,则返回的结果是num2=&2840000&{&& &char *num2=NULL;&& &int len=strlen(num1);&& &int i=0;&& &num2 = (char *)malloc(sizeof(char) * (len+b+1));&& &memcpy(num2, num1, sizeof(char) * len);&& &&& &i=&& &while(i&len+b)&& &{&& &&& &*(num2+i) = '0';&& &&& &i++;&& &}&& &*(num2+len+b) = '\0';&& &return num2;}char *numAdd(char *a, char *b)&& &&& &/* 两个字符数组的元素逐一相加 */{&& &char *sum=NULL, *aRev=NULL, *bRev=NULL;&& &char *pa=NULL, *pb=NULL, *ps=NULL;&& &int s=0;&& &int lena = strlen(a);&& &int lenb = strlen(b);&& &int lenMax = lena & lenb ? lena :&& &ps = sum = (char *)malloc(sizeof(char) * (lenMax+2));&& &&& &&& &/* 比lenMax多分配两个长度,一个用于保存最高位相加时产生的进位,另一个用于保存结束标志'\0' */&& &pa = aRev = reverse(a);&& &pb = bRev = reverse(b);&& &while(*pa || *pb)&& &&& &/* 循环结束标志是字符数组aRev到了结束标志,或bRev到了结束标志, '\0'的值就为0 */&& &{&& &&& &if(*pa)&& &&& &{&& &&& &&& &s += *pa-'0';&& &&& &/* 把该位的字符转化成数字,并相加 */&& &&& &&& &pa++;&& &&& &&& &/* 指针指向下一位 */&& &&& &}&& &&& &if(*pb)&& &&& &{&& &&& &&& &s += *pb-'0';&& &&& &&& &pb++;&& &&& &}&& &&& &*ps = s%10+'0';&& &&& &/* 确定sum在在该位上的值,并把数字转换成字符 */&& &&& &ps++;&& &&& &s /= 10;&& &&& &/* 确定进位 */&& &}&& &if(s)&& &&& &/* 最高位是否有进位 */&& &{&& &&& &*ps = s+'0';&& &&& &ps++;&& &}&& &*ps= '\0';&& &return reverse(sum);}int lenNum(int n)&& &&& &//确定一个数字有多少位,比如134共有3位{&& &int len=0, bNum=1;&& &while(n/bNum != 0)&& &{&& &&& &bNum *= 10;&& &&& &len++;&& &}&& &}char *mulNum(char *num1, char *num2)&& &&& &//两个多位的数字相乘,例如&134& * &45&{&& &int len2=0, i=0;&& &char *mul=NULL, *sum=NULL, *mulBit=NULL;&& &len2 = strlen(num2);&& &sum = &0&;&& &while(i&len2)&& &{&& &&& &mul = mulOneNum(num1, *num2);&& &&& &//num2中的每个数字字符和num1逐一相乘&& &&& &mulBit = addBit(mul, i);&& &&& &//把乘得的结果后面添加i个0&& &&& &sum = numAdd(sum, mulBit);&& &&& &//把num2中每位与num1相乘得到的乘积,并且添加了i个0后的结果相加&& &&& &i++;&& &&& &num2++;&& &}&& &&& &&& &//这里返回的实际结果是&134& * &54&,注意调用时要把num2反转,才能得到想要的结果}char *factorial(int n)&& &&& &//确定int型数值n的阶乘{&& &int len=0,&& &char *fac=NULL, *num=NULL;&& &fac = &1&;&& &for(i=1; i&=n; i++)&& &{&& &&& &len = lenNum(i);&& &&& &//动态分配一个(len+1)长度的存储空间,因为字符串有结束标志'\0'&& &&& &num = (char *)malloc(sizeof(char) * (len+1));&& &&& &&& &&& &itoa(i, num, 10);&& &&& &//把n转化成字符型数组,比如int型的n=46,则num=&46&, 参数10表示整型i是十进制数值&& &&& &fac = mulNum(fac, reverse(num));&& &&& &//用num=895和fac相乘时,是从低位开始,所以要把num的字符顺序反转过来&& &&& &free(num);&& &}&& &}
请各位遵纪守法并注意语言文明C语言程序设计(何欣铭、颜晖 第2版)课后习题答案_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
安徽理工大学物联网工程专业319244.2浏览总量总评分
评价文档:
4页1下载券77页2下载券4页7下载券46页2下载券6页2下载券 3页免费53页1下载券46页1下载券46页免费53页2下载券
喜欢此文档的还喜欢6页免费13页免费11页免费10页免费5页免费
C语言程序设计(何欣铭、颜晖 第2版)课后习题答案|C​语​言​程​序​设​计​(​何​欣​铭​、​颜​晖​ ​第版​)​课​后​习​题​答​案
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢来 自:盐城
等 级:侠之大者
帖 子:176
专家分:454
&&得分:15&
#include &stdio.h&
#include &string.h&
#define max 3000
int f[max];
int main()
&&& int i, j, n, c,&&&
&&& scanf(&%d&, &n);&&&
&&& f[0] = 1;&&&
&&& for(i = 2; i &= i++)
&&& {&&&&&&&&
&&&&&&&&c = 0;&&&&&&&&
&&&&&&&&for(j = 0; j & j++)
&&&&&&&&{&&&&&&&&&&&&
&&&&&&&&&&&&s = f[j] * i +&&&&&&&&&&&&
&&&&&&&&&&&&f[j] = s % 10;&&&&&&&&&&&
&&&&&&&&&&&&c = s / 10;&&&&&&&&
&&&&&&&&}&&&
&&& for(j = max - 1; j &= 0; j--)
&&&&&&&&if(f[j])&&&
&&& for(i = i &= 0; i--)
&&&&&&&&printf(&%d&, f[i]);&&&
&&& printf(&\n&);&&&
等 级:侠之大者
帖 子:214
专家分:408
回复 2楼 yctchxf
谢谢,你的程序是正确的,你能够告诉我我的程序哪里有问题吗,我的思想和你是类似的,可是不知道错误原因,求指教
来 自:江西财经大学
等 级:版主
威 望:57
帖 子:2916
专家分:10489
N! 一定不超过 N位么?
[fly]存在即是合理[/fly]
等 级:侠之大者
帖 子:214
专家分:408
问题已找到,贴出正确代码,原来考虑有两点小错误,终于发现了,哎。。。1.首先2000位对于1000!精度不够,1000!有2568位。然后,我原来代码里最后一个循环i&n不对.。
程序代码:/* 大整数的阶乘计算 */
#include &stdio.h&
void caculate(int n);
int num[<font color=#0]={<font color=#};&&&&&&&&&&&&//计算结果不超过5000位,用数组存储每一位数字
void main()
&&& printf(&Please input n:\n&);
&&& scanf(&%d&,&n);
&&& caculate(n);&&&&&&
void caculate(int n)
&&& int total=<font color=#,remainder=<font color=#,i,j,
&&& j=<font color=#9;&&&&&&&&&&&&&&&&&&&&& //从数组最后一位开始存储
&&& num[<font color=#9]=<font color=#;
&&& for(i=<font color=#;i&=n;i++)
&&&&&&&&while(j&<font color=#)
&&&&&&&&&&&&total=i*num[j]+
&&&&&&&&&&&&remainder=<font color=#;
&&&&&&&&&&&&if(total&=<font color=#)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&& num[j]=total%<font color=#;
&&&&&&&&&&&&&&& remainder=total/<font color=#;
&&&&&&&&&&&&}
&&&&&&&&&&&&else
&&&&&&&&&&&&&&& num[j]=
&&&&&&&&&&&&j--;
&&&&&&&&j=n-<font color=#;
&&&&&&&&remainder=<font color=#;
&&&&&&&&total=<font color=#;
&&& for(i=<font color=#;i&<font color=#0;i++)
&&&&&&&&if(num[i]!=<font color=#||flag==<font color=#)
&&&&&&&&&&&&printf(&%d&,num[i]);
&&&&&&&&&&&&flag=<font color=#;
&&& printf(&\n&);
等 级:侠之大者
帖 子:214
专家分:408
回复 4楼 azzbcc
恩,我发现了,谢谢,还想请问一个问题,怎么计算程序的运行时间,比如说对于我这个程序,n越大,我想看看它运行时间是多少,这该怎么做?谢谢
来 自:江西财经大学
等 级:版主
威 望:57
帖 子:2916
专家分:10489
&&得分:15&
程序代码:#include &time.h&
#include &stdio.h&
int main()
&&& clock_t beg,
&&& beg = clock();
&&& for (i = <font color=#;i & <font color=#00000;++i);
&&& end = clock();
&&& printf(&%.2f ms\n&, (end - beg) / <font color=#0.0);
&&& return <font color=#;
[fly]存在即是合理[/fly]
等 级:侠之大者
帖 子:214
专家分:408
回复 7楼 azzbcc
等 级:侠之大者
帖 子:214
专家分:408
回复 7楼 azzbcc
但是我怎么感觉实际输出的时间比等待的时间小很多??单位是ms吗
等 级:侠之大者
帖 子:214
专家分:408
回复 7楼 azzbcc
还有为什么要除以1000啊
版权所有,并保留所有权利。
Powered by , Processed in 0.033881 second(s), 8 queries.
Copyright&, BCCN.NET, All Rights Reserved求前20的阶乘(即求1!+2!+3!+、、、、、+20!){要求是用C语言中的循环指令编程}求完整程序。。。_百度知道
求前20的阶乘(即求1!+2!+3!+、、、、、+20!){要求是用C语言中的循环指令编程}求完整程序。。。
#include &stdio.h&int fact(int n){
int sum=1,i;
if(n==0 || n==1)
for(i=1;i&=n;i++)
sum*=i; }int main(){
int sum=0;
for(i=1;i&=20;i++)
sum+=fact(i);
printf(&1!+2!+...+20!=%d&#92;n&,sum);}
其他类似问题
按默认排序
其他7条回答
for(int i=1;i&=20;++i){
for(int j=i;j&0;j--){
temp=temp*j;
} sum+=} 看到大概写了一下,不知道对不对,思路就是这样,利用嵌套循环即可、
#include&stdio.h&void main(){int i,j,s,sum=0;for(i=1;i&21;i++){s=1;for(j=1;j&=i;j++){
s=s*j;}sum=sum+s;}printf(&%d&#92;n&,sum);}
#include &stdio.h& int main(void){
int i,j,sum = 0;
for(i = j = 1;i & 21;i ++)
printf(&%d&#92;n&,sum);}
/*1! + 2! + ...... + 20! = 180320Press any key to continue*/#include &stdio.h&double fact(unsigned n) { double product = 1.0; for(i = 1; i & ++i)
product *=}int main() { double sum = 0; for(i = 1; i &= 20; ++i)
sum += fact(i); printf(&1! + 2! + ...... + 20! = %.0lf&#92;n&,sum); return 0;}
你好,程序如下: #include&stdio.h&void main(){ long i,j, for(i=1,j=1,sum=1;i&=4;i++) {
sum+=j; } printf(&1!+2!+3!+........+20! = %ld&#92;n&,sum-1);} 有疑问提出。望采纳。
#include&stdio.h&int main(){int sum=0,b=1,a=1;while(a!=21){ b=a*b;sum=sum+b;a++;}printf(&%d&,sum);return 0;}
#include &stdio.h&main(){int i,j;&br/&long s,sum=0;&br/&for(i=1;i&=20;i++)&br/&{s=1;&br/&for(j=1;j&=i;j++)&br/&
s*=j;&br/&sum+=s;&br/&}printf(&%ld&,sum);}
阶乘的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁}

我要回帖

更多关于 c语言阶乘怎么表示 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信