今天有点累了,贴个老程序大家看看。
13!已经超出long的表示范围,1000!怎么办?
用大整数乘以一个无符号数(10000以内),其中大整数以动态数组存放,每个元素存放一个5位的整数。如果每个元素存放一个1位的整数要超时的。另外输入10000半天出不来结果,估计题目里0 ≤ N ≤ 10000是吓吓人的。
#include
<
iostream
>
#include < algorithm >
#include < vector >
using namespace std;
const int MAX = 100000 ;
void prtBigv(vector < int > v)
... {
for(int i=0; i<v.size();i++)
...{
if(i==0)
printf("%d",v[i]);
else
printf("%05d",v[i]);
}
printf(" ");
}
vector < int > mul(vector < int > v, unsigned k)
... {
int c=0;
unsigned p;
vector <int> res;
for (int i=v.size()-1; i>=0; i--)
...{
p=v[i]*k+c;
res.push_back(p%MAX);
c=p/MAX;
}
if (c>0) res.push_back (c) ;
return res;
}
bool run()
... {
vector <int> v;
unsigned n;
if(scanf("%u",&n)==EOF) return false;
v.push_back(1) ;
for(int i=2;i<=n;i++)
...{
v=mul(v,i);
reverse(v.begin (),v.end());
}
prtBigv(v);
return true;
}
int main()
... {
while(run());
return 0;
}
#include < algorithm >
#include < vector >
using namespace std;
const int MAX = 100000 ;
void prtBigv(vector < int > v)
... {
for(int i=0; i<v.size();i++)
...{
if(i==0)
printf("%d",v[i]);
else
printf("%05d",v[i]);
}
printf(" ");
}
vector < int > mul(vector < int > v, unsigned k)
... {
int c=0;
unsigned p;
vector <int> res;
for (int i=v.size()-1; i>=0; i--)
...{
p=v[i]*k+c;
res.push_back(p%MAX);
c=p/MAX;
}
if (c>0) res.push_back (c) ;
return res;
}
bool run()
... {
vector <int> v;
unsigned n;
if(scanf("%u",&n)==EOF) return false;
v.push_back(1) ;
for(int i=2;i<=n;i++)
...{
v=mul(v,i);
reverse(v.begin (),v.end());
}
prtBigv(v);
return true;
}
int main()
... {
while(run());
return 0;
}