大数相减
描述
两个长度超出常规整形变量上限的大数相减,请避免使用各语言内置大数处理库,如Java.math.BigInteger等。
输入
有 N 行测试数据,每一行有两个代表整数的字符串 a 和 b,长度超过百位。规定 a>=b,a, b > 0。
测试结果可以用 linux 小工具 bc进行测试是否正确。
输出
返回表示结果整数的字符串。
输入样例
1000 - 1
输出样例
999
此代码通过AC测试
题目来源:小米OJ
语言环境(C -GCC 4.8.4)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stddef.h>
#include <ctype.h>
/**
* @param char* 单行测试数据
*/
void solution(char *line)
{
// 在此处理单行测试数据
char* a = (char*)malloc(sizeof(char) * 300);
char* b = (char*)malloc(sizeof(char) * 300);
int aLen = 0;
int bLen = 0;
int i = 0;
int j = 0;
sscanf(line, "%s - %s", a, b);
aLen = strlen(a);//计算第一个数的字符串长度
bLen = strlen(b);//计算第二个数的字符串长度
// 将两个数的末端位对齐
for (i = bLen - 1, j = aLen - 1; i >= 0; i--, j--)
{
a[j] = a[j] - b[i] + '0';
//两数对应某位相减,不够减就向前一位借一
if (a[j] < '0')
{
int k = j - 1;
//向前循环,直至找到可借位
while (a[k] <= '0')
{
a[k] = '9';
k--;
}
a[k] = a[k] - 1;//找到可借位
a[j] = a[j] + 10;//借一补十
}
}
//打印处理结果,将结果最前方的0处理掉
for (i = 0; i<aLen; i++)
{
if (a[i] != '0') break;
}
for (; i<aLen; i++)
{
putchar(a[i]);
}
putchar('\n');
free(a);
free(b);
}
int main()
{
//测试 输入: 1000 - 1 减号两边各保持一个空格
char line[300];
gets_s(line);
solution(line);
}