您的位置:首页 > 其它

大数减法算法

2015-10-22 21:26 239 查看
输入两个大数,把两个大数各用字符数组存起来

用两个函数,一个加法函数,一个减法函数

总的程序为:

#include<stdio.h>
#include<string.h>
int ans[1003];
void zhuan(char *a,int *n)
{
int t=0;
int len=strlen(a);
if(a[0]=='-'){
t=1;
n[0]=1;
}
for(int i=t;i<len;i++)
n[len-i]=a[i]-'0';
}
bool dd(int *x,int *y)
{
int i=1000;
while(i--){
if(x[i]>y[i]) return 1;
if(x[i]<y[i]) return 0;
}
return 1;
}
void jian(int *x,int *y);
void jia(int *x,int *y)
{
if(x[0]){ // x 为负
x[0]=0;
jian(y,x);
return ;
}
if(y[0]){ // x 为负,y 为负
y[0]=0;
jian(x,y);
return ;
}
// x,y为正数
for(int i=1;i<1000;i++){
ans[i]=x[i]+y[i];
if(ans[i]>9){
ans[i]-=10;
x[i+1]++;
}
}
}
void jian(int *x,int *y)
{
if(y[0]){ // y 为负
y[0]=0;
jia(x,y);
return ;
}
if(x[0]){ // y 为负 ; x 为负
x[0]=0;
jia(x,y);
ans[0]=1;
return ;
}
if(!dd(x,y)){ // x, y 为正数 且 y大于x
jian(y,x);
ans[0]=1;
return ;
}
// x, y 为正数 且 x大于y
for(int i=1;i<1000;i++){
ans[i]=x[i]-y[i];
if(ans[i]<0){
ans[i]+=10;
x[i+1]++;
}
}
}

void pp(int *a)
{
if(a[0]) printf("-");
int i=1000;
for(;i>1;i--){
if(a[i]){
for(;i>1;i--)
printf("%d",a[i]);
}
}
printf("%d\n",a[1]);
}
int main()
{
char a[1000],b[1000];
int n[1000],m[1000];
while(~scanf("%s%s",a,b)){
memset(n,0,sizeof(n));
memset(m,0,sizeof(m));
memset(ans,0,sizeof(ans));
zhuan(a,n);
zhuan(b,m);
jian(n,m);
pp(ans);
}
return 0;
}

分析(以下用x,y来表示该两个数):

如果 x 负 y 负:负 - 负 = 若|x| > |y|,结果为负;反之为正

调用jian(x,y)函数,先判断 y 的正负,此处 y 为负,把 y 变为正,再调用jia(x,y),在该函数中,判断 x 为负,把 x 变为正,再回头调用jian(y,x),此时 x y 皆为正,再判断 x y 的大小,进行减法运算,注意结果的正负符号

如果 x 负 y 正:负 - 正 = -( 正 + 正 )

调用jian(x,y)函数,先判断 y 的正负,此处 y 为正,再判断 x ,x 为负,把 x 变为正,调用jia(x,y),结果为负

如果 x 正 y 正:正 - 正 =若x > y,结果为负;反之为正

判断 x,y 的大小,进行减法运算,注意结果的正负符号

如果 x 正 y 负:正 - 负 =( 正 + 正 )

先判断 y 的正负,此处 y 为负,把 y 变为正,再调用jia(x,y),结果为正
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 大数减法 大数