用string模拟长整数
根据计算机组成原理的知识,用mul函数模拟一个乘法器即可
注意用截取字符串和打表法来优化性能
用时击败1%的用户哈哈哈哈
#include<iostream>
#include<string>
#include<map>
using namespace std;
string sum(string a,string b){
string::reverse_iterator it1 = a.rbegin();
string::reverse_iterator it2 = b.rbegin();
int carry = 0;
string ans = "";
while(it1!=a.rend()||it2!=b.rend()){
int pa,pb;
if(it1==a.rend()){
pa=0;
} else {
pa=*it1-'0';
it1++;
}
if(it2==b.rend()){
pb=0;
} else {
pb=*it2-'0';
it2++;
}
int sum = pa+pb+carry;
carry = sum/10;
char digit = '0'+sum%10;
ans = digit+ans;
}
if(carry!=0) ans = '1' + ans;
return ans;
}
//使用打表法优化乘法计算
string mul(string a,string b){
//提前打表,把0*b到9*b的结果算出来
map<char,string> multi;
string generator = "0";
multi['0'] = "0";
for(int i=1;i<=9;i++){
multi['0'+i] = sum(generator,b);
generator = multi['0'+i];
}
//开始模拟乘法器
string::reverse_iterator it1 = a.rbegin();
string ans = "0";
int i=0;
while(it1!=a.rend()){
string temp = multi[*it1];
//如果数字很大的话,先对齐再加太浪费时间了
//不用管的部分,直接拼接字符串就行
int sub = ans.size()-i;
string lower = ans.substr(sub);
string upper = ans.substr(0,sub);
upper = sum(upper,temp);
ans = upper+lower;
i++;
it1++;
}
return ans;
}
void Example6_14(){//例题6.14 清华大学 n的阶乘
string n;
while(cin>>n){
string factor = "1";
string ans = "1";
while(factor!=n){
factor = sum(factor,"1");
ans = mul(ans,factor);
}
cout<<ans<<endl;
}
}
int main(){
Example6_14();
return 0;
}

京公网安备 11010502036488号