#include <iostream>
#include <vector>
#include <iomanip>
using namespace std;
const int MAX=100000000;
int main()
{
int N;
cin>>N;
vector<long long int> result;
while(N)
{
if(result.empty()==1)
result.push_back(N);
else
{
for(int i=result.size()-1;i>=0;i--)
{
long long temp=N*result[i];
if((temp/MAX)!=0) //需要进位的时候
{
if(i==result.size()-1)
result.push_back(temp/MAX);
else
result[i+1]+=(temp/MAX);
result[i]=temp%MAX;
}
else //不需要进位
{
result[i]=temp;
}
}
}
N--;
}
for(int i=result.size()-1;i>=0;i--)
{
if(i==result.size()-1)
cout<<result[i];
else
cout<<setw(8)<<setfill('0')<<result[i];
}
return 0;
}
思路:vector的每个单元存一个8位的数,做乘法的时候从高位向低位做(即i--),然后如果得数超过八位就加到下一位的数字中(没有下一位要创建)。
写代码过程中的错误
1.vector empty ==1时为空
2.必须用long long int x=long long y*int/long long int z的形式,因为如果等式右边两个均为int,是先执行乘法(可能会超过最大值然后变成负的),再转换成long long ,结果就错了。
3.setw(8)<<setfill('0')<<result[i]不能调换顺序,如果setfill'0'放在result[i]后面则再第一次打印result[i]时是不会加'0'的。还有使用c++里的格式化输出一定要加iomanip的头文件。