#include<iostream>
#include<vector>
#include<ctime>
void mul(std::vector<int> &n1,int n2)
{
for(size_t i=0;i!=n1.size();++i){
n1[i]*=n2;
}
for(size_t i=0;i!=n1.size()-1;++i){
n1[i+1]+=(n1[i]/10);
n1[i]%=10;
}
size_t highest=n1.size()-1;
//处理最高位的进位
while(n1[highest]>9){
n1.push_back(n1[highest]/10);
n1[highest]%=10;
++highest;
}
}
int main()
{
clock_t begin=clock();
std::vector<int> bigNum(1,1);
for(int i=2;i<=10000;++i){
mul(bigNum,i);
}
//逆续输出
std::vector<int>::reverse_iterator r_it=bigNum.rbegin();
for(;r_it!=bigNum.rend();++r_it)
std::cout<<*r_it;
clock_t end=clock();
std::cout<<"/n"<<end-begin<<"ms";
return 0;
}
思路还是一样的,只不过不是一开始就分配预估的空间了,而是用vector动态分配。
在release模式下25s左右,测试机器为p3 733,比之前的那个要快一些,而且更为安全一点。
#include<vector>
#include<ctime>
void mul(std::vector<int> &n1,int n2)
{
for(size_t i=0;i!=n1.size();++i){
n1[i]*=n2;
}
for(size_t i=0;i!=n1.size()-1;++i){
n1[i+1]+=(n1[i]/10);
n1[i]%=10;
}
size_t highest=n1.size()-1;
//处理最高位的进位
while(n1[highest]>9){
n1.push_back(n1[highest]/10);
n1[highest]%=10;
++highest;
}
}
int main()
{
clock_t begin=clock();
std::vector<int> bigNum(1,1);
for(int i=2;i<=10000;++i){
mul(bigNum,i);
}
//逆续输出
std::vector<int>::reverse_iterator r_it=bigNum.rbegin();
for(;r_it!=bigNum.rend();++r_it)
std::cout<<*r_it;
clock_t end=clock();
std::cout<<"/n"<<end-begin<<"ms";
return 0;
}
思路还是一样的,只不过不是一开始就分配预估的空间了,而是用vector动态分配。
在release模式下25s左右,测试机器为p3 733,比之前的那个要快一些,而且更为安全一点。