PAT甲级1010

来源:互联网 发布:361网络彩票骗局 编辑:程序博客网 时间:2024/06/18 18:29
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main(){
char n1[20],n2[20],n3[20];
int tag,radix;
long long num1=0,num2=0;
scanf("%s%s%d%d",&n1,&n2,&tag,&radix);
  long long i=0,temp=0;
 if(tag==2) {strcpy(n3,n2);strcpy(n2,n1);strcpy(n1,n3);}  //始终让n1为已知进制
  for(i=0;n1[i]!='\0';i++)
  {
 if(n1[i]>='0'&&n1[i]<='9') temp=n1[i]-'0';
     else temp=n1[i]-'a'+10;
        num1=num1*radix+temp;    //计算出N1数组的值 
  }
 // printf("\n%d",num1);
// printf("\n%s",n1);
 // printf("\n%s",n2);
int max=0;
   for(i=0;n2[i]!='\0';i++)  //找出N2中最大的位max,说明n2起码是max+1进制 
  {   if(n2[i]>='0'&&n2[i]<='9')    // 
       temp=n2[i]-'0';
else temp=n2[i]-'a'+10;
if(temp>max) max=temp;
  }
  
  long long left=max+1; 
  long long right=num1+1;//最大进制肯定不超过num1+1,why?因为只要有一位数a(不为零),a*(num1+1)就肯定大于num1,就不用比较了 
  long long mid=0;       //  一开始我把右边界设置为2的63次方-1,因为这是最大longlong数,但是这样,会有测试点通不过(结果偏大),例如,n1=1,n2=1,应该输出2 
  while(left<=right)//二分查找 
  {
  mid=(left+right)/2;
 
num2=0;
 for(i=0;n2[i]!='\0';i++)
 { if(n2[i]>='0'&&n2[i]<='9')  
       temp=n2[i]-'0';
else temp=n2[i]-'a'+10;
    num2=num2*mid+temp;
if(num2>num1) break;
//   printf("**%d**",num2);
 }
 if(num2==num1) 
 //  printf("\n%d\n",num2); 
{
   printf("%lld",mid);return 0;}
      if(num2>num1||num2<0) right=mid-1;
      else left=mid+1;
  } 
  
  printf("Impossible");
return 0;
}
原创粉丝点击