Description | ||
题目描述 小明很喜欢做a+b,他但经常忘记进位,所以他算88+12=90,而不是100。 现在你给了小明一些a+b的算式,请问他算出来会是什么? 输入 第一行是一个整数K,表示样例的个数。 每个样例占一行,为两个整数a,b,0≤a,b≤1e9。 输出 每行输出一个样例的结果,不要输出前导0。 样例输入 3 1 2 5 6 55 55 样例输出 3 1 0 |
思路分析:将数的运算转化为字符串数组,也就是高精度加法,只不过舍掉了进位罢了
#include <stdio.h>
#include <string.h>
int max(int x, int y) {
if (x > y) return x;
else return y;
}
int main() {
int k;
scanf("%d", &k);
while (k--) {
//这道题设计到了一个高精度加法
char arr[11], brr[11], temp[11];
scanf("%s %s", &arr, &brr);
int lena = strlen(arr);
int lenb = strlen(brr);
int lenmax = max(lena, lenb);
int tempsum, flag = 0, count = 0;
int a = 0;
for (int i = 0; i < lena; i++) {
temp[i] = arr[i];//先将arr中数组的值全部赋值给temp
}
for (int i = 0; i < lena; i++)
{
arr[i] = temp[lena - 1 - i];
//将输入的数据在数组中交换位置
}
if (lena < lenb) {
for (int i = 0; i < lenb - lena; i++) {
arr[lena + i] = '0';
}
}
//交换位置后在后面补0
for (int i = 0; i < lenb; i++)
{
temp[i] = brr[i];//先将brr中数组的值全部赋值给temp
}
for (int i = 0; i < lenb; i++) {
brr[i] = temp[lenb - 1 - i];//将数组倒置
}
if (lena > lenb) {
for (int i = 0; i < lena - lenb; i++) {
brr[lenb + i] = '0'; //交换位置后补0
}
}
memset(temp, 0, sizeof(temp));
//现在开始写加法程序
for (int i = 0; i < lenmax; i++) {
tempsum = (arr[i] - '0') + (brr[i] - '0');
tempsum = tempsum % 10;
temp[lenmax - 1 - i] = tempsum + '0'; //位数相加并调换位置
}
lenmax = strlen(temp);
//开始写输出程序
//需求分析1.000100202020,这种前面的0必须舍弃
//2. 000000全是0的话只输出一个0
//02
for(a = 0;a<lenmax;a++){
if(temp[a]!='0'){
flag = 2;
break;
}
else
flag =1;
}
if(flag ==2){
for(int i = a;i<lenmax;i++){//这个运行了很多次
printf("%c",temp[i]);
}
}
else if(flag == 1) printf("0");
printf("\n");
//}
}
}