刚刚用向量容器编了这个程序,1000以内的数还好,算到1000的阶乘时,速度就很慢了。若有达人刚好路过,请帮我看下,给些优化的算法,不胜感激。
代码如下:
代码如下:
#include
<
iostream
>
#include < vector >
#include < algorithm >
#include < iterator >
#include < stdio.h >
using namespace std;
vector < int > compute(vector < int > & vect, int data);
void showValue(vector < int > & vect, int n);
void main()
{
vector < int > vect;
int n, i;
vect.push_back( 1 );
cout << " 请输入n的值 " << endl;
cin >> n;
for (i = 1 ; i <= n; i ++ )
{
vect = compute(vect, i);
}
showValue(vect, n);
}
vector < int > compute(vector < int > & vect, int data)
{
int mulCarry = 0 , addCarry = 0 , // mulCarry记录加法进位,addCarry记录乘法进位
temp, k, flag = 0 ;
vector < int > sum,mul; // sum 记录加法的结果,mul记录乘法的结果
vector < int > ::iterator vectIter,sumIter,mulIter;
while (data)
{
mul.clear();
addCarry = 0 ; // 加法进位
mulCarry = 0 ; // 乘法进位
k = data % 10 ; // 从个位依次开始计算
data = data / 10 ;
if (flag ++ > 0 )
{
vect.insert(vect.begin(), 1 , 0 ); // 每次补一个0
}
if ( ! k) // 若k为0,则无需计算
{
continue ;
}
for (vectIter = vect.begin(); vectIter != vect.end(); vectIter ++ )
{
temp = * vectIter * k + mulCarry;
mulCarry = temp / 10 ;
mul.push_back(temp % 10 );
}
if (mulCarry > 0 )
{
mul.push_back(mulCarry);
}
if (sum.size() < mul.size())
{
sum.insert(sum.end(), mul.size() - sum.size(), 0 );
}
for (mulIter = mul.begin(),sumIter = sum.begin();
sumIter != sum.end(); mulIter ++ , sumIter ++ )
{
temp = * mulIter + * sumIter + addCarry;
addCarry = temp / 10 ;
* sumIter = temp % 10 ;
}
if (addCarry > 0 )
{
sum.push_back(addCarry);
}
}
return sum;
}
void showValue(vector < int > & vect, int n) // 打印得到的值,反向打印
{
cout << n << " 的阶乘为: " << endl;
ostream_iterator < int > screen(cout);
copy(vect.rbegin(),vect.rend(),screen);
cout << endl;
}
#include < vector >
#include < algorithm >
#include < iterator >
#include < stdio.h >
using namespace std;
vector < int > compute(vector < int > & vect, int data);
void showValue(vector < int > & vect, int n);
void main()
{
vector < int > vect;
int n, i;
vect.push_back( 1 );
cout << " 请输入n的值 " << endl;
cin >> n;
for (i = 1 ; i <= n; i ++ )
{
vect = compute(vect, i);
}
showValue(vect, n);
}
vector < int > compute(vector < int > & vect, int data)
{
int mulCarry = 0 , addCarry = 0 , // mulCarry记录加法进位,addCarry记录乘法进位
temp, k, flag = 0 ;
vector < int > sum,mul; // sum 记录加法的结果,mul记录乘法的结果
vector < int > ::iterator vectIter,sumIter,mulIter;
while (data)
{
mul.clear();
addCarry = 0 ; // 加法进位
mulCarry = 0 ; // 乘法进位
k = data % 10 ; // 从个位依次开始计算
data = data / 10 ;
if (flag ++ > 0 )
{
vect.insert(vect.begin(), 1 , 0 ); // 每次补一个0
}
if ( ! k) // 若k为0,则无需计算
{
continue ;
}
for (vectIter = vect.begin(); vectIter != vect.end(); vectIter ++ )
{
temp = * vectIter * k + mulCarry;
mulCarry = temp / 10 ;
mul.push_back(temp % 10 );
}
if (mulCarry > 0 )
{
mul.push_back(mulCarry);
}
if (sum.size() < mul.size())
{
sum.insert(sum.end(), mul.size() - sum.size(), 0 );
}
for (mulIter = mul.begin(),sumIter = sum.begin();
sumIter != sum.end(); mulIter ++ , sumIter ++ )
{
temp = * mulIter + * sumIter + addCarry;
addCarry = temp / 10 ;
* sumIter = temp % 10 ;
}
if (addCarry > 0 )
{
sum.push_back(addCarry);
}
}
return sum;
}
void showValue(vector < int > & vect, int n) // 打印得到的值,反向打印
{
cout << n << " 的阶乘为: " << endl;
ostream_iterator < int > screen(cout);
copy(vect.rbegin(),vect.rend(),screen);
cout << endl;
}