用数组模拟(A-B)(超数据范围) 大数相减
用数据来模拟两个超出数据范围的减法,下面给小伙伴们上去代码,如果有错误,欢迎来指正哦,
//大数相减;
#include<stdio.h>
#include<string.h>
int main()
{
char s1[10001];
char s2[10001];
int a1[10001];
int a2[10001];
int ans[10001];
int n;//为了实现'大数',数组开的比较大,没用到的位也要初始化为0
memset(ans,0,sizeof(ans));
memset(a2,0,sizeof(a2));
memset(a1,0,sizeof(a1));
scanf("%d",&n);//多组输入
while(n--)
{
scanf("%s%s",s1,s2);
{
//每计算一次后需重置
memset(ans,0,sizeof(ans));
memset(a2,0,sizeof(a2));
memset(a1,0,sizeof(a1));
int i,k=0;
int len1=strlen(s1);
for(i=len1-1; i>=0; i--)
{
a1[k++]=s1[i]-'0';//存储每一位数字
}
k=0;
for(i=strlen(s2)-1; i>=0; i--)
{
a2[k++]=s2[i]-'0';//如上
}
int tmp=0;
for(i=10001;i>=0;i--){
if(a1[i]==a2[i]) continue;
else if(a1[i]>a2[i]) break;
else if(a1[i]<a2[i]){
tmp=1;break;}
}
int swp=0;
if(tmp==1){
for(i=0;i<10001;i++){
swp=a1[i];
a1[i]=a2[i];
a2[i]=swp;
}
printf("-");
}
tmp=0;
for(i=0;i<=10000;i++){
if(a1[i]<a2[i]){
a1[i+1]--;
ans[i]=a1[i]-a2[i]+10;
}
else{
ans[i]=a1[i]-a2[i];
}
}
int flag=0;//输出(注意前导0)
for(i=1000; i>=0; i--)
{
if(ans[i]!=0)
flag=1;
if(flag==1)
printf("%d",ans[i]);
}//考虑'0+0'的特殊情况:
if(flag==0)
printf("0");
printf("\n");
}
}
return 0;
}
上一篇博文已经说明了前面的代码,解释了相应的作用,本文就不再过多的解释了,直接跳转到int tmp=0;定义tmp变量这个位置。
int tmp=0;
for(i=10001;i>=0;i--){
if(a1[i]==a2[i]) continue;
else if(a1[i]>a2[i]) break;
else if(a1[i]<a2[i]){
tmp=1;break;}
}
这个代码段,来断定a1[]和a2[]的大小的,如果a1[]<a2[]让两者交换数据,如果a1[]>=a2[]则不做处理,tmp就是一个标志的作用。下一个代码段就是a1[]和a2[]交换数据的,不做过多的解释了。
接下来就是怎么实现两者相减的,
for(i=0;i<=10000;i++){
if(a1[i]<a2[i]){//判断是否会产生借位的情况
a1[i+1]--;//产生借位了,下一位减1;
ans[i]=a1[i]-a2[i]+10;//产生借位了,正在计算的位置+10
}
else{
ans[i]=a1[i]-a2[i];//不产生进位,正常相减;
}
}
我已经做好的相应的注释,最后倒序输出就可以了,本文到这也快要结束了,大家可以期待下次的内容哦。拜拜。
注释:如有错误,请指正,如有雷同请私信,本文作者原载,请不要直接复制侵权哦!