HDUOJ入坑的第一天--------1002題(計算A+B)
今天去HDUOJ逛了一下,嘗試了一下以前競賽的練習題,結果第一道題就被坑了,說出來你可能不信,A+B我居然不會。。。。。。看下題目吧:
題目意思大致說一下,就是求給定n組數對,求每對數的和,嗯,看起來簡單吧,我也覺得,可是事實是這樣的。。。。。。。。:
我當時很懵,我小學學的還是挺好的,怎麼加法都不會了。。。。。。。
然後
又看了一遍題目,突然想到這裏它說得的加法它的數字位數有貓膩,(去他的Integer,就知道誤導學生入坑),10000位的整數。。。。。int小身子板它表示不出來,所以,機智的我改用了char類型數組,下面是我的代碼,(已ac)
#include <stdio.h>
#include <string.h>
int main() {
/*
* n代表要計算幾次
* num1len 表示第一個數的長度位數, num2len 表示第二個數的長度位數, sumlen;
*/
int n, temp, num1len, num2len, sumlen;
/*存放結果的*/
int sum[10000];
/*輸入參數*/
scanf("%d", &n);
for (int i =1; i <= n; i++)
{
char num1[10000], num2[10000], temp1[10000], temp2[10000];
temp = 0;
scanf("%s %s", temp1, temp2);
/*拷貝一份兩個加數,用於後面的加法轉換 */
for (int l1 = 0; l1 <= strlen(temp1); l1++)
{
num1[l1] = temp1[l1];
}
for (int l2 = 0; l2 <= strlen(temp2); l2++)
{
num2[l2] = temp2[l2];
}
num1len = strlen(num1);
num2len = strlen(num2);
/*求出和的最小位數*/
sumlen = (num1len > num2len ? num1len : num2len);
/*將備份數組反過來,逐位對齊,
*1234
*123456
*操作後
*432100
*654321
*/
if (num1len > num2len)
{
for (int r = sumlen - 1, s = num2len - 1; r >= 0; r--, s--)
{
if (r >= sumlen - num2len)
{
num2[r] = num2[s];
} else
{
num2[r] = '0';
}
}
} else
{
for (int r = sumlen - 1, s = num1len - 1; r >= 0; r--, s--)
{
if (r >= sumlen - num1len)
{
num1[r] = num1[s];
} else
{
num1[r] = '0';
}
}
}
/*逐位相加,滿十近一*/
for (int z = sumlen - 1; z >= 0; z--)
{
sum[z] = (num1[z] + num2[z] + temp - 2 * '0') % 10;
temp = (num1[z] + num2[z] - 2 * '0' + temp) / 10;
}
/*打印結果*/
printf("Case %d:\n", i);
printf("%s + %s = ", temp1, temp2);
if (temp)
{
printf("%d", temp);
}
for (int w = 0; w < sumlen; w++)
{
printf("%d",sum[w]);
}
printf("\n");
if (i != n)
{
printf("\n");
}
}
return 0;
}
寫的有點亂,但思路是這樣,需要注意的是,這裏不能用int
結果(ac了,開心,哈哈哈,我還不傻):