UESTC 1012 (進制轉換)(思維)

 UESTC 1012  (進制轉換)(思維)

Description

有一天人諏Lee在隨手幫女神做題,突然女神發現了自己演算紙上的一個式子,但是式子只有兩個加數卻沒有結果,最近在學不同進制加減法的女神忘了這個兩個數字是多少進制了(只記得是小於等於10),但是她很好奇在可能的多少進制下這個式子得到的答案長度最長,爲了從人贏Lee手中搶走女神,你需要快速計算出這個答案,例如78+87=10進制下是165,在9進制下是176,而小於等於8的進制顯然是不合法的,所以這個式子答案可能的最長長度就是3.

Input

第一行讀入一個整數 T(1T100000) 表示數據組數

接下來有T

每行含兩個數A,B (不超過4位的非0整數)

Output

對於每個數據輸出一個數字,表示可能的答案的最大長度

Sample Input

2
78 87
1 1

Sample Output

3
2

思路:

思路:當AB同時爲負或者同時爲正時,很顯然,它們的和化爲低進制時,數據長度相對較長。注意:當它們的和爲負數時,負號也佔一個單位長度。

通過例舉幾個例子時可以發現:無論A、B爲正還是爲負,把它們的和化爲低進制,它們的和的數據長度會較長。但是不要忘記負號也佔一個單位長度。
在決定進制時,取a,b中各個數位中最大的數字h,並以h+1爲進制。把a+b的和按照h+1進制輸出,結果長度最長。
My solution:
/*2016.3.19*/
#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;
}






發佈了144 篇原創文章 · 獲贊 10 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章