#include<stdio.h>
#include<string>
#include<string.h>
#include<iostream>
using namespace std; //compare比较函数:相等返回0,大于返回1,小于返回-1
int compare(string str1,string str2)
{
if(str1.length()>str2.length()) return ;
else if(str1.length()<str2.length()) return -;
else return str1.compare(str2);
}
//高精度加法
//只能是两个正数相加
string add(string str1,string str2)//高精度加法
{
string str; int len1=str1.length();
int len2=str2.length();
//前面补0,弄成长度相同
if(len1<len2)
{
for(int i=;i<=len2-len1;i++)
str1=""+str1;
}
else
{
for(int i=;i<=len1-len2;i++)
str2=""+str2;
}
len1=str1.length();
int cf=;
int temp;
for(int i=len1-;i>=;i--)
{
temp=str1[i]-''+str2[i]-''+cf;
cf=temp/;
temp%=;
str=char(temp+'')+str;
}
if(cf!=) str=char(cf+'')+str;
return str;
}
//高精度减法
//只能是两个正数相减,而且要大减小
string sub(string str1,string str2)//高精度减法
{
string str;
int tmp=str1.length()-str2.length();
int cf=;
for(int i=str2.length()-;i>=;i--)
{
if(str1[tmp+i]<str2[i]+cf)
{
str=char(str1[tmp+i]-str2[i]-cf+''+)+str;
cf=;
}
else
{
str=char(str1[tmp+i]-str2[i]-cf+'')+str;
cf=;
}
}
for(int i=tmp-;i>=;i--)
{
if(str1[i]-cf>='')
{
str=char(str1[i]-cf)+str;
cf=;
}
else
{
str=char(str1[i]-cf+)+str;
cf=;
}
}
str.erase(,str.find_first_not_of(''));//去除结果中多余的前导0
return str;
}
//高精度乘法
//只能是两个正数相乘
string mul(string str1,string str2)
{
string str;
int len1=str1.length();
int len2=str2.length();
string tempstr;
for(int i=len2-;i>=;i--)
{
tempstr="";
int temp=str2[i]-'';
int t=;
int cf=;
if(temp!=)
{
for(int j=;j<=len2--i;j++)
tempstr+="";
for(int j=len1-;j>=;j--)
{
t=(temp*(str1[j]-'')+cf)%;
cf=(temp*(str1[j]-'')+cf)/;
tempstr=char(t+'')+tempstr;
}
if(cf!=) tempstr=char(cf+'')+tempstr;
}
str=add(str,tempstr);
}
str.erase(,str.find_first_not_of(''));
return str;
} //高精度除法
//两个正数相除,商为quotient,余数为residue
//需要高精度减法和乘法
void div(string str1,string str2,string &quotient,string &residue)
{
quotient=residue="";//清空
if(str2=="")//判断除数是否为0
{
quotient=residue="ERROR";
return;
}
if(str1=="")//判断被除数是否为0
{
quotient=residue="";
return;
}
int res=compare(str1,str2);
if(res<)
{
quotient="";
residue=str1;
return;
}
else if(res==)
{
quotient="";
residue="";
return;
}
else
{
int len1=str1.length();
int len2=str2.length();
string tempstr;
tempstr.append(str1,,len2-);
for(int i=len2-;i<len1;i++)
{
tempstr=tempstr+str1[i];
tempstr.erase(,tempstr.find_first_not_of(''));
if(tempstr.empty())
tempstr="";
for(char ch='';ch>='';ch--)//试商
{
string str,tmp;
str=str+ch;
tmp=mul(str2,str);
if(compare(tmp,tempstr)<=)//试商成功
{
quotient=quotient+ch;
tempstr=sub(tempstr,tmp);
break;
}
}
}
residue=tempstr;
}
quotient.erase(,quotient.find_first_not_of(''));
if(quotient.empty()) quotient="";
} int main()
{
string str1,str2;
string str3,str4;
while(cin>>str1>>str2)
{
cout<<add(str1,str2)<<endl;
cout<<sub(str1,str2)<<endl;
cout<<mul(str1,str2)<<endl;
div(str1,str2,str3,str4);
cout<<str3<<" "<<str4<<endl;
}
return ;
}

最新文章

  1. 使用powershell批量添加Keil和IAR的头文件路径
  2. Map的性能
  3. 【mysql】关于事务的隔离级别
  4. Nginx安装与使用
  5. Xcode 6制作动态及静态Framework
  6. crawler4j源码学习(2):Ziroom租房网房源信息采集爬虫
  7. 信息安全系统设计基础实验四 20135210&amp;20135218
  8. Swift 动画学习笔记
  9. 如何调用super
  10. CSS基础知识之float
  11. workerman启动失败解决
  12. openjudge(四)
  13. Webpack 开发服务器代理设置解决跨域问题
  14. html总结:表格中的文字居中
  15. VsCode语言设置为中文
  16. HTTP 错误 401.3 - Unauthorized asp.net mvc 图片,css,js没有权限访问
  17. c运行库、c标准库、windows API的区别和联系
  18. 洛谷P3368 树状数组2 树状数组+差分
  19. C#读入整数
  20. Jupyter Notebook远程服务器配置

热门文章

  1. js颜色拾取器
  2. R 如何 隐藏坐标轴
  3. CF1073F Choosing Two Paths
  4. easyui-tabs 页签绑定click事件,动态加载jqgrid
  5. 编译boost,去掉不使用的组件
  6. 编写高质量代码改善C#程序的157个建议——建议38:小心闭包中的陷阱
  7. 20169219 实验一 Java开发环境的熟悉(Linux + IDEA)
  8. 移植 libevent-2.0.22-stable 到ARM平台
  9. docker 镜像创建
  10. C#中实现UrlEncode和UrlDecode