新微赢技术网
标题:
阶乘问题
[打印本页]
作者:
爽口爽心
时间:
2009-11-4 01:55
标题:
阶乘问题
#include "stdio.h"
#include "iostream.h"
int main(int argc, char* argv[])
{
int carry,n,j;
int a[2000];
int digit=1;
int temp,i;
cout<<"please enter n:"<<endl;
cin>>n;
a[0]=1;
for(i=2; i<=n; i++)
{
for(carry=0,j=1; j<=digit; ++j)
{
temp=a[j-1]*i+carry;
a[j-1]=temp%10;
carry=temp/10;
}
while(carry)
{
//digit++;
a[++digit-1]=carry%10;
carry/=10;
}
}
cout<<"the result is:"<<endl;
for(int k=digit; k>=1; --k)
cout<<a[k-1];
cout<<endl;
return 0;
}
这代码求的是大数的阶乘,就是LONG DOUBLE 都放不下的那种。 但我始终没有看明白,想请大家告诉一下思路是怎么样的。 谢谢
PS: 红色的地方我有疑问 ++ 在减1 不等于白加吗 可为什么出来的答案却不一样了?
作者:
随chu风liu
时间:
2009-11-4 01:55
这是求大数的阶乘!
首先,你把语法正确:
#include <iostream>
using namespace std;
其次,具体过程这样理解:
a[]数组就是按位存放阶乘结果的
下标高的存放高位
carry是每位相乘的进位
可以举个例:6!
最后一步是120*6
a[0]=0 a[1]=2 a[2]=1
就是小学的乘法过程,自己理解吧!
作者:
轌婲の滿天飛
时间:
2009-11-4 01:55
caicaiha112 在 2008-9-8 10:23 的发言:
这是求大数的阶乘!
首先,你把语法正确:
#include <iostream>
using namespace std;
没必要非得这样写吧...
作者:
龍2132
时间:
2009-11-4 01:55
那你直接用std::cout也没人拦你啊
作者:
■■■■■■
时间:
2009-11-4 01:55
long long好像只够存到25的阶乘~然后爆了 嘿
作者:
【洳☆淉】
时间:
2009-11-4 01:55
好像不行,有数组越界的嫌疑,请先试一试再聊
作者:
守护天使
时间:
2009-11-4 01:55
caicaiha112 在 2008-9-8 10:23 的发言:
这是求大数的阶乘!
首先,你把语法正确:
#include
using namespace std;
其次,具体过程这样理解:
a[]数组就是按位存放阶乘结果的
下标高的存放高位
carry是每位相乘的进位
可以举个例:6!
最后一步是 ...
我稍微理解了一点你的思路,但笔算还是算不出来,就算是依次放入数组 那么下一次运算总需要上一次计算的值 可我找不出这个保存上一次阶乘值的变量,还有就是红色部分请教下`
欢迎光临 新微赢技术网 (http://bbs.weiying.cn/)
Powered by Discuz! X3.2