一.原理
和高精度加法差不多,高加:http://t.csdn.cn/LRfnL
二.核心点(难点)
1.如果a,b,则要swap(a,b),加上负号,方便减法
2.如果a[i]<b[i],则需要借位
3.详细见核心代码
三.代码
1.核心代码
1.交换a,b数组
交换的好处:不用关心长度问题和负数问题,一定能减,毕竟常识就知道a>b来减,一定比a<b简单嘛。
bool cmp(char a1[],char b1[]){
if(strlen(a1)<strlen(b1))
return 0;
else if(strlen(a1)==strlen(b1) &&strcmp(a1,b1)==-1)
return 0;
else return 1;
}
if(!cmp(a1,b1)){ //if a<b;则swap(a,b)
strcpy(c1,a1); //c=a
strcpy(a1,b1); //a=b;
strcpy(b1,c1); //b=c;
flag=1;
}
2.减法时借位
if(a[i]<b[i]){
a[i]+=10;
a[i+1]--;
}
c[i]=a[i]-b[i];
2.完整函数(考虑负数)
bool cmp(char a1[],char b1[]){
if(strlen(a1)<strlen(b1))
return 0;
else if(strlen(a1)==strlen(b1) &&strcmp(a1,b1)==-1)
return 0;
else return 1;
}
void sub(char a1[],char b1[]){
char c1[1001]={}; //交换数组使用
int a[1001]={}; //减数
int b[1001]={}; //被减数
int c[1001]={}; //差
int flag=0; //判断是否为负数
if(!cmp(a1,b1)){ //if a<b;则swap(a,b)
strcpy(c1,a1); //c=a
strcpy(a1,b1); //a=b;
strcpy(b1,c1); //b=c;
flag=1;
}
int lena=strlen(a1),lenb=strlen(b1); //长度
for(int i=0;i<lena;i++){
a[lena-i-1]=(a1[i]-'0'); //翻转
}
for(int i=0;i<lenb;i++){
b[lenb-i-1]=(b1[i]-'0'); //翻转
}
for(int i=0;i<lena;i++){ //进行高加
if(a[i]<b[i]){
a[i]+=10;
a[i+1]--;
}
c[i]=a[i]-b[i];
}
//除去首位0
while(true){
if(c[lena]==0 &&lena>0) lena--;
else break;
}
//输出
if(flag){
cout<<'-';
for(int i=lena;i>=0;i--){
cout<<c[i];
}
}else{
for(int i=lena;i>=0;i--){
cout<<c[i];
}
}
}
3.题目(考虑负数)
题目描述:
给定一个高精度数a和b,输出它们的差
样例一:
输入:114514
2333333333
输出:-2333218819
样例二
输入:1000000000
888888888
输出:111111112
4.答案
#include<iostream>
#include<cstring>
using namespace std;
bool cmp(char a1[],char b1[]){
if(strlen(a1)<strlen(b1))
return 0;
else if(strlen(a1)==strlen(b1) &&strcmp(a1,b1)==-1)
return 0;
else return 1;
}
void sub(char a1[],char b1[]){
char c1[1001]={}; //交换数组使用
int a[1001]={}; //减数
int b[1001]={}; //被减数
int c[1001]={}; //差
int flag=0; //判断是否为负数
if(!cmp(a1,b1)){ //if a<b;则swap(a,b)
strcpy(c1,a1); //c=a
strcpy(a1,b1); //a=b;
strcpy(b1,c1); //b=c;
flag=1;
}
int lena=strlen(a1),lenb=strlen(b1); //长度
for(int i=0;i<lena;i++){
a[lena-i-1]=(a1[i]-'0'); //翻转
}
for(int i=0;i<lenb;i++){
b[lenb-i-1]=(b1[i]-'0'); //翻转
}
for(int i=0;i<lena;i++){ //进行高加
if(a[i]<b[i]){
a[i]+=10;
a[i+1]--;
}
c[i]=a[i]-b[i];
}
//除去首位0
while(true){
if(c[lena]==0 &&lena>0) lena--;
else break;
}
//输出
if(flag){
cout<<'-';
for(int i=lena;i>=0;i--){
cout<<c[i];
}
}else{
for(int i=lena;i>=0;i--){
cout<<c[i];
}
}
}
int main(){
char a[1001]={},b[1001]={};
cin>>a>>b;
sub(a,b);
return 0;
}