Description
有一天人諏Lee
在隨手幫女神做題,突然女神發現了自己演算紙上的一個式子,但是式子只有兩個加數卻沒有結果,最近在學不同進制加減法的女神忘了這個兩個數字是多少進制了(只記得是小於等於10),但是她很好奇在可能的多少進制下這個式子得到的答案長度最長,爲了從人贏Lee
手中搶走女神,你需要快速計算出這個答案,例如78+87=?
在10進制下是165,在9進制下是176,而小於等於8的進制顯然是不合法的,所以這個式子答案可能的最長長度就是3.
Input
第一行讀入一個整數 T(1≤T≤100000) 表示數據組數
接下來有T行
每行含兩個數A,B (不超過4位的非0整數)
Output
對於每個數據輸出一個數字,表示可能的答案的最大長度
Sample Input
2
78 87
1 1
Sample Output
3
2
思路:當AB同時爲負或者同時爲正時,很顯然,它們的和化爲低進制時,數據長度相對較長。注意:當它們的和爲負數時,負號也佔一個單位長度。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int x[7],y[7],p[20];
int main()
{
int i,j,k,t,n,m,a,b,a1,b1,t1,t2,h1,h2,h,hk;
scanf("%d",&t);
while(t--)
{
memset(x,0,sizeof(x));
memset(y,0,sizeof(y));
memset(p,0,sizeof(p));
h1=h2=0;
scanf("%d%d",&a,&b);
if(a>0&&b<0)//把a與b交換,從而可以把 a>0&&b<0和b>0&&a<0 轉換爲一種情況處理,不影響結果
{
hk=a;
a=b;
b=hk;
}
if(a<0)
a1=-1*a;//如果a<0,先取整數部分,轉換到數組中去
else
a1=a;
if(b<0)
b1=-1*b;//如果b<0,先取整數部分,轉換到數組中去
else
b1=b;
for(i=1;i<=5;i++)
{
if(a1)
{
x[i]=a1%10;
if(x[i]>h1)//h1記錄a中最大的數字
h1=x[i];
a1/=10;
}
else
{
t1=i-1;//t1記錄a轉化的數組長度
break;
}
}
for(i=1;i<=5;i++)
{
if(b1)
{
y[i]=b1%10;
if(y[i]>h2)//h2記錄b中最大的數字
h2=y[i];
b1/=10;
}
else
{
t2=i-1;//t2記錄b轉化的數組長度
break;
}
}
if(h1>h2)//取a,b中最大的數字
h2=h1;
h2+=1;//確定進制
if(t1>t2)//確定數組長度
h=t1;
else
h=t2;
if(a*b>0)//a<&&b<0和a>0&&b>0兩種情況
{
for(i=1;i<=h;i++)
{
p[i]=p[i]+x[i]+y[i];
if(p[i]>=h2)
{
p[i]-=h2;
p[i+1]+=1;
}
}
if(a<0&&b<0)
{
if(p[i])//判斷最高位是否進位
printf("%d\n",i+1);
else
printf("%d\n",i);
}
else
{
if(p[i])//判斷最高位是否進位
printf("%d\n",i);
else
printf("%d\n",i-1);
}
}
if(a<0&&b>0)//a>0&&b<0和a<0&&b>0兩種情況
{
if(a+b>=0)
{
for(i=1;i<=h;i++)
{
if(y[i]<x[i])
{
p[i]=y[i]+h2-x[i];
y[i+1]-=1;
}
else
p[i]=y[i]-x[i];
}
for(i=h;i>=1;i--)
{
if(p[i])
break;
}
printf("%d\n",i);
}
if(a+b<0)
{
for(i=1;i<=h;i++)
{
if(y[i]>x[i])
{
p[i]=x[i]+h2-y[i];
x[i+1]-=1;
}
else
p[i]=x[i]-y[i];
}
for(i=h;i>=1;i--)
{
if(p[i])
break;
}
printf("%d\n",i+1);
}
}
}
return 0;
}