阶乘 算法-网上找的c语言的求大数阶乘的答案 看不太懂这个算法 求大神解释算法

问题描述

网上找的c语言的求大数阶乘的答案 看不太懂这个算法 求大神解释算法

#include
int main()
{
??? int n;
??? int a[9000]; //确保保存最终运算结果的数组足够大
???? int digit = 1; //位数
???? int temp;?? //阶乘的任一元素与临时结果的某位的乘积结果
???? int i, j, carry; //carry:进位

???? printf("please in put n:n");
??? scanf("%d",&n);
??? a[0] = 1;?? //将结果先初始化为1

??? for ( i=2; i<=n; i++ )? //开始阶乘,阶乘元素从2开始依次"登场"
??? {? //按最基本的乘法运算思想来考虑,将临时结果的每位与阶乘元素相乘
???????? for( j=1, carry=0;? j<=digit; j++ )
??????? {
??????????? temp = a[j-1] * i + carry; //相应阶乘中的一项与当前所得临时结果的某位相乘(加上进位)
????????????? a[j-1] = temp % 10; //更新临时结果的位上信息
????????????? carry = temp / 10; //看是否有进位
???????? }
??????? while(carry)
??????? {??? //如果有进位
????????????? a[++digit-1] = carry % 10; //新加一位,添加信息。位数增1
??????????? carry = carry / 10; //看还能不能进位
???????? }
??? }
??? printf("n ! = ");??? //显示结果
??? for(j = digit; j >=1;j--)
??? {
??????? printf("%d",a[j-1]);
??? }
??? printf("n");
??? return 0;
}

解决方案

 这有什么看不懂的。首先,阶乘运算就是大数乘法。
而大数乘法其实就是模拟手工计算。
也就是两个数字相乘,比如
abc*def = abc * d * 100 + abc * e * 10 + abc * f
而对于abc * f,又可以分为a * f * 100 + b * f * 10  + c * f
以此类推。

再不会,找一本小学3年级的课本复习下。

解决方案二:

#include
int main()
{
??? int n;
??? int a[9000]; //确保保存最终运算结果的数组足够大
???? int digit = 1; //位数
???? int temp;?? //阶乘的任一元素与临时结果的某位的乘积结果
???? int i, j, carry; //carry:进位

???? printf("please in put n:n");
??? scanf("%d",&n);
??? a[0] = 1;?? //将结果先初始化为1

??? for ( i=2; i<=n; i++ )? //开始阶乘,阶乘元素从2开始依次"登场"
??? {? //按最基本的乘法运算思想来考虑,将临时结果的每位与阶乘元素相乘
???????? for( j=1, carry=0;? j<=digit; j++ )
??????? {
??????????? temp = a[j-1] * i + carry; //相应阶乘中的一项与当前所得临时结果的某位相乘(加上进位)
????????????? a[j-1] = temp % 10; //更新临时结果的位上信息
????????????? carry = temp / 10; //看是否有进位
???????? }
??????? while(carry)
??????? {??? //如果有进位
????????????? a[++digit-1] = carry % 10; //新加一位,添加信息。位数增1
??????????? carry = carry / 10; //看还能不能进位
???????? }
??? }
??? printf("n ! = ");??? //显示结果
??? for(j = digit; j >=1;j--)
??? {
??????? printf("%d",a[j-1]);
??? }
??? printf("n");
??? return 0;
}

解决方案三:

跟手工计算一样:

a[0..digit-1] == i!

比如i==5, i!=120, 那么
a[0]=0, a[1]=2, a[2]=1, digit=3

时间: 2024-12-31 02:22:00

阶乘 算法-网上找的c语言的求大数阶乘的答案 看不太懂这个算法 求大神解释算法的相关文章

c语言链表代码求大神解释

问题描述 c语言链表代码求大神解释 insert中的 while( next_node && new_node->data > next_node->data) 是什么意思? 还有excise是什么意思,干什么用的? 最近在学链表,学不清楚... #include #include #include "list.h" /* Create a new node containing the specified data, and return a poi

strcmp-求大神解释一下这个C语言。谢谢!!

问题描述 求大神解释一下这个C语言.谢谢!! #include #define N 100 int strlen( char string[]) { int i=0; while(string[i]!='') i++;//直到碰到第一个字符串结束符'' return i; } int strcmp(char *p1,char *p2) { while(*p1||*p2) { if(*p1!=*p2) return(*p1-*p2); else { p1++; p2++; } } return 0

c语言-求大神解释C语言题,请解释详细一点,谢谢

问题描述 求大神解释C语言题,请解释详细一点,谢谢 下面的代码输出什么? #include int main(void) { int i; int a[5]; for (i = 0; i <= 5; ++i) { a[i] = -i; printf("a[%d] = %dn", i, a[i]); } return 0; } 解决方案 #include<stdio.h> void main() { int i=0; int a[5]={0,0,0,0,0}; for

c语言二叉树问题,代码不太理解,求大神解释,急

问题描述 c语言二叉树问题,代码不太理解,求大神解释,急 问题:A Binary Tree is called balanced if, for each node in the tree, the height of its left and right subtrees differ by no more than one. Write a function int height_if_balanced( Tnode *root ) which returns -1 if the tree

c语言代码问题,有疑问,求大神解释

问题描述 c语言代码问题,有疑问,求大神解释 这个function的机理是什么? 为什么第二个循环只有分号...有什么作用 求大神解释 char *mystery( char *a, char *b ) { char *c = a; while ( *c != '' ) { c++; } while (( *c++ = *b++ ) != '' ) ; return a; } 解决方案 第一个循环,c指向了a字符串的末尾: 第二个循环,把b指向的字符串拷贝到a字符串后面了. 解决方案二: 求大神

求大神解释下c语言双重for循环的汇编语句??

问题描述 求大神解释下c语言双重for循环的汇编语句?? void main(){ int i,j; for(i=0;i<5;i++){ printf("0"); for(j=0;j<2;j++){ printf("1"); } } } 汇编: main: .LFB24: pushl %ebp movl %esp, %ebp pushl %ebx andl $-16, %esp subl $16, %esp movl $5, %ebx .L3: movl

c语言 树结构 二叉树-初学二叉树 运行有错误 瞅了几个小时无果 大神帮帮忙 找出错误在哪

问题描述 初学二叉树 运行有错误 瞅了几个小时无果 大神帮帮忙 找出错误在哪 ![图片说明](http://img.ask.csdn.net/upload/201503/07/1425715444_303984.png #include #include typedef struct Tree { int date; struct Tree *lson,*rson; }tree , *ztree; int a[200005]; ztree creat(ztree t,int n) { int h

c语言-刚学C,编了个小程序出错了,请大神帮忙看一下。

问题描述 刚学C,编了个小程序出错了,请大神帮忙看一下. 知道长方形的长和宽,求面积和周长 #include main() { float x,y,a,b; printf ("请输入长和宽且用逗号分隔:); scanf ("%f,%f,&x,&y); a=x*y; b=(x+y)*2; printf ("面积=%f,周长=%fn",a,b); } 解决方案 错误一:include后面缺少头文件包含 错误二:printf中没有右半边的引号 错误三:sc

c语言游戏编程-关于TC平台下横线优化算法的疑惑~~~TAT大神们帮帮我

问题描述 关于TC平台下横线优化算法的疑惑~~~TAT大神们帮帮我 以下是代码,原作者是想通过以字而不是字节copy数据到显存,从而实现更快地画一条横线,但是我看不太懂他的代码TAT..为什么第一点为奇数,就只填写后一点,最后一点为奇数,就两点都填写?还有就是这里的"填写后一点"里的"一点"是什么意思.啊,好像不是屏幕上的一点啊...困扰我好多天了,希望有人能解救一下我呜呜呜...void HLine_Fast(int x1int x2int yunsigned i