问题描述:
输入一串以空格作为分割符的字符串,字符串由0~9组成,空格前面的部分字符串为大数A,空格后的部分字符串为大数B,用A-B,输出做差结果
算例:输入 12345678 99999999
输出:-87654321
下面是实现的程序,程序写的不好,有很多可以精简的地方,但结果都正确。
// 大数相减.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
using namespace std;
/*把A、B两个数的长度补齐成一样,以便相减*/
void buqi(int a[100], int b[100], int len1, int len2)
{
int i;
if (len1 > len2)
{
for (i = len1 - 1; i >= len1 - len2; i--)
{
b[i] = b[i - (len1 - len2)];
}
for (i = 0; i < len1 - len2; i++)
{
b[i] = 0;
}
}
else if (len1 < len2)
{
for (i = len2 - 1; i >= len2 - len1; i--)
{
a[i] = a[i - (len2 - len1)];
}
for (i = 0; i < len2 - len1; i++)
{
a[i] = 0;
}
}
else return;
}
/*减法函数,要求字符串一中的数,要大于字符串二中的数*/
void sub(char str1[100], char str2[100])
{
int i = 0,len1,len2,maxlen;
int a[100], b[100], c[100];
len1 = strlen(str1);
len2 = strlen(str2);
maxlen = len1 > len2 ? len1:len2;
while (str1[i] != '\0')
{
a[i] = str1[i] - '0';
i++;
}
i = 0;
while (str2[i] != '\0')
{
b[i] = str2[i] - '0';
i++;
}
//for (i = 0; i < len1; i++)
// cout << b[i] << endl;
//对齐 位补齐
buqi(a, b, len1, len2);
//从低位到高位作差
for (i = maxlen - 1; i >= 0; i--)
{
if (a[i] >= b[i])
c[i] = a[i] - b[i];
else
{
a[i - 1] = a[i - 1]-1;
a[i] += 10;
c[i] = a[i] - b[i];
}
}
i = 0;
while (c[i++] == 0);//获得第一个不是0的数字的位置
//cout <<maxlen<< i << endl;
if (i == maxlen+1) cout<<"0"<<endl;
else
{
for (i = i - 1; i < maxlen; i++)
{
cout << c[i];
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
char str1[100], str2[100];
int len1, len2;
int i,k=0,bigflag;
while (1)
{
cin >> str1;//输入
cin >> str2;
len1 = strlen(str1);
len2 = strlen(str2);
if (len1 > len2)
{
bigflag = 1;
}
else if (len1<len2) bigflag = 2;
else
{
for (i = 0; i < len1; i++)
{
if (str1[i]>=str2[i]) bigflag = 1;
else if (str1[i] == str2[i]) continue;
else if (str1[i] < str2[i]) bigflag = 2;
}
}
if (bigflag == 1) sub(str1, str2);
else if (bigflag == 2)
{
cout << "-";
sub(str2, str1);
}
}
system("pause");
return 0;
}