(C语言)高精度减法

来源:互联网 发布:淘宝商品管理 编辑:程序博客网 时间:2024/05/29 10:34

题目描述

和高精度加法类似,高精度减法也需要使用数组来处理大数相减的问题。  

输入

有多组测试数据。

对每组测试数据,在一行中给出两个正整数a,b。(a,b的位数小于1000),中间用一个空格隔开。

遇到文件结尾时输入结束.

输出

在一行中输出a-b的结果.

样例输入

123456 789123456789 123456123456 1234567891234567891234567891234567984489413 3254698745621556461151

样例输出

122667123333333-1233333331234567891231313192488946428028262
(本人认为高精度减法稍微有点复杂(改代码的时候真的很无语,想砸电脑的心都有,可能是因为本人太菜了,这么一个普遍的题目都一直要改代码),然后说说我的思路吧,还是将输入的字符串数组倒置转换为数字类型的数组,然后我通过函数的递归依次对数组的每一位进行比较大小从而判断两个数组的大小,然后不看符号,始终将大的数减去小的数,然后在加上符号,因为大的数减去小的数不会出现减不够而出现负值的情况,最后输出的时候将数组后面多余的零去掉,然后倒序输出即可)(期间遇到了许多的问题,比如在判断两个数组的大小的时候情况一定要考虑完全,相等的时候直接输出零,(刚开始的时候我承认我忽略了这一点))


#include<stdio.h>

#include<string.h>
int comp (char *p,char *q,int n){ //判断a与b的大小 
if (n==0)
return 0;
return (*p==*q)? comp(p+1,q+1,n-1):(*p-*q);
}
int main(){
char m[1000],n[1000];
int a[1000]={0},b[1000]={0};
int i,t,len_m,len_n;
while ( scanf ("%s%s",m,n)!=EOF ){
len_m=strlen (m);
len_n=strlen (n);
for (i=0; i<len_m; i++)
a[i]=m[len_m-i-1]-'0';
for (i=0; i<len_n; i++)
b[i]=n[len_n-i-1]-'0';
t=(len_m>len_n)? 1:-1;
if (len_m==len_n)
t=comp(m,n,(len_m>=len_n)?len_m:len_n);
if (t<0){
for (i=0; i<len_m; i++){
b[i]-=a[i];
if (b[i]<0){
b[i]+=10;
b[i+1]--;
}
}
i=len_n-1;
while(b[i]==0) i--;
printf("-");
for ( ; i>=0; i--)
printf("%d",b[i]);
printf("\n");
}
if (t>0){
for (i=0; i<len_n; i++){
a[i]-=b[i];
if (a[i]<0){
a[i]+=10;
a[i+1]--;
}
}
i=len_m-1;
while(a[i]==0) i--;
for ( ; i>=0; i--)
printf("%d",a[i]);
printf("\n");
}
if (t==0)
printf("0\n");
}
return 0;
}
0 0
原创粉丝点击