Description
PY has two positive integer a and b. Now he wants to know the value of a - b.
Input
Two lines.
The first line is the integer a, while the second line is the integer b.
(0< a, b < 10100)
Note: 每个数前面没有多余的0。
Output
The value of a-b.
Sample Input 1
999999999
999999999
思路分析:
1. scanf后的字符有如下特性如果输入的时: “123”, 则string【0】 = 1;(这个特性非常重要!)相当于你输入完一串字符后,系统统一收入string内。
2. 基于1的特性,而我们做差时总是从第0位开始比较做差,所以在把字符数组转入数组内时,要转置;(void init 函数实现的功能。)
3. 通过从最大位逐位开始比较两个数组的大小关系,来比较两个大数的大小关系。(int judge函数显示的功能。)
4. 在进入做差函数前,要把较小数不足位的数填为0,这样在后面做差时才不会出错!
5. 做差函数中,result里面最前面为0的部分不用输出,所以用一个while循环去除最前面为0的部分。实际上就是减少lc的值。
#include <stdio.h>
#include <string.h>
int num_a[10000], num_b[10000];
long la, lb;
char temp[10000];
/*scanf后的字符有如下特性如果输入的时: “123”, 则string【0】 = 1;(这个特性非常重要!)相当于你输入完一串字符后,系统统一收入string内。
我们做差时总是从第0位开始比较做差,所以在把字符数组转入数组内时,要转置.*/
void init(int *num_a, long *la) {
scanf("%s", temp);
*la = strlen(temp);
for (int i = 0; i < *la; i++) {
num_a[i] = temp[*la - i - 1] - '0';
}
}
/*通过从最大位逐位开始比较两个数组的大小关系,来比较两个大数的大小关系。*/
int judge(int *num_a, int *num_b, long lc) {
for (long i = lc - 1; i > 0; i--) {
if (num_a[i] > num_b[i]) {
return 1;
} else if (num_a[i] < num_b[i]) {
return 0;
}
}
return 1;
}
void divd(int *num_a, int *num_b, long lc) {
int result[10000];
for (long i = 0; i < lc; i++) {
result[i] = num_a[i] - num_b[i];
if (result[i] < 0) {
result[i] += 10;
num_a[i + 1]--;
}
}
lc--;
/*result里面最前面为0的部分不用输出,所以用一个while循环去除最前面为0的部分。实际上就是减少lc的值。*/
while (lc > 0) {
if (result[lc] > 0) {
break;
}
lc--;
}
while (lc >= 0) {
printf("%d", result[lc]);
lc--;
}
printf("\n");
}
int main() {
init(num_a, &la);
init(num_b, &lb);
long lc = la > lb ? la : lb;
/*在进入做差函数前,要把较小数不足位的数填为0,这样在后面做差时才不会出错!*/
for (long i = la; i < lc; i++) {
num_a[i] = 0;
}
for (long i = lb; i < lc; i++) {
num_b[i] = 0;
}
if (judge(num_a, num_b, lc)) {
divd(num_a, num_b, lc);
} else {
printf("-");
divd(num_b, num_a, lc);
}
return 0;
}