该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include
#include
#include
#include
using namespace std;
#define Max(a,b) ((a)>(b)?(a):(b)) //简化后面2个大整数的长度的比较
#define Min(a,b) ((a)
#define Cha(a,b) (Max(a,b)-Min(a,b))
//string类型转换成int类型
int string_to_num(string k){//string字符串变整数型例如str="1234",转换为整数的1234.
int back;
stringstream instr(k);
instr>>back;
return back;
}
//整形数转换为string类型
string num_to_string(int intValue){
string result;
stringstream stream;
stream << intValue;//将int输入流
stream >> result;//从stream中抽取前面放入的int值
return result;
}
//在字符串str前添加s个零,后面分治法*10^n
string stringBeforeZero(string str,int s){
for(int i=0;i
str.insert(0,"0");
return str;
}
//两个整数字符串相加
string Add(string str1,string str2){
//假定str1和str2是相等的长度,不相等时在前面自动补零,使两个字符串长度相等
str2 =stringBeforeZero(str2, Cha(str1.size(),str2.size()));
str1 =stringBeforeZero(str1, Cha(str1.size(),str2.size()));
string result;
int in=0;
for(int i=str1.size()-1;i>=0;i--){
int c = (str1[i] - *0*) + (str2[i] - *0*) + in;
in = c/10;
c %= 10;
result.insert(0,num_to_string(c));//在result字符串最前端插入新生成的单个字符
}
if (in != 0) //判断最高位有没进位
result.insert(0,num_to_string(in));
return result;
}
//减少乘法运算次数的替换用到减法
string Sub(string str1,string str2){
string result;
//去掉大整数前面的0
while (*0* == str1[0]&&str1.size()>1)
str1=str1.substr(1,str1.size()-1);
while (*0* == str2[0]&&str2.size()>1)
str2=str2.substr(1,str2.size()-1);
//使两个字符串长度相等
if (str1.size() > str2.size())
str2 = stringBeforeZero(str2,str1.size() - str2.size());
for(int i=str1.size()-1;i>=0;i--){
int c = (str1[i] - *0*) - (str2[i] - *0*);//利用ASCII码进行各位减法运算
if (c < 0){ //当不够减时向前一位借位,前一位也不够位时再向前一位借位,依次如下
c +=10;//本位+10
int prePos = i-1;//前一位
char preChar = str1[prePos];//前一位的数字
while (*0* == preChar) {//如果前一位是0
str1[prePos]=*9*;//变成9
prePos -= 1;//再向它的前一位进1
preChar = str1[prePos];
} //一直前一位,直到不是0
str1[prePos]-=1;//不是0,减一
}
result.insert(0,num_to_string(c));//在result字符串最前端插入新生成的单个字符
}
return result;
}
//在字符串str后跟随s个零
string stringFollowZero(string str,int s){
for(int i=0;i
str.insert(str.size(),"0");
return str;
}