pat 1010 radix 部分正确20分

30 篇文章 0 订阅
16 篇文章 0 订阅

将两个其它进制的数都转化为10进制,再对比两者是否相等即可。题目没说范围,据说会出到这样的数据:1234567890 10 1 10 ,于是必须使用二分来做,否则必然TLE。

部分正确代码:

#include<stdio.h>
#include<string.h>
char a[12],b[12];
#define NUM 1000
int dis(char a)
{
	if(a>='0'&&a<='9')
		return a-'0';
	if(a>='a'&&a<='z')
		return 10+a-'a';
	return -1;
}
long long transfer(char *arr, int radix)
{
	long long res=0;
	int len=strlen(arr);
	int i,j;
	for(i=0;i<len;i++){
		if(dis(arr[i])>=radix)
			return -1;
		res*=radix;
		res+=dis(arr[i]);
	}
	return (long long)res;
}
int main()
{
	int tag,radix,i;
	long long p,q;
	scanf("%s%s%d%d",a,b,&tag,&radix);
	if(tag==1){
		p=transfer(a,radix);
		for(i=2;i<36;i++){
			if(p==transfer(b,i)){
				printf("%d",i);
				return 0;
			}
		}
		
	}
	else {
		q=transfer(b,radix);
		for(i=2;i<NUM;i++){
			if(q==transfer(a,i)){
				printf("%d",i);
				return 0;
			}
		}
	}
	printf("Impossible");
	return 0;


}

 

别人的AC代码:

#include <cstdio>
 #include <iostream>
 #include <iomanip>
 #include <vector>
 #include <string>
  
 using namespace std;  
   
 char A[11];  
 char B[11];  
 long long least;  
   
 long long num2Dec(char * p,long long radix)  
 {  
     long long len=strlen(p);  
     long long m = 1;  
     long long num = 1;  
     long long sum = 0;  
     for(long long i=len-1;i>=0;i--)  
     {  
         if(p[i]>='a'&&p[i]<='z')  
             num= p[i] - 'a' + 10;  
         else if(p[i]>='0'&& p[i]<='9')  
             num=p[i] - '0';  
         sum+=num*m;  
         m*=radix;  
     }  
     return sum;  
 }  
   
 long long findLowRadix(char *p)  
 {  
     long long len=strlen(p);  
     long long low=0;  
     long long num;  
     for(long long i=len-1;i>=0;i--)  
     {  
         if(p[i]>='a'&&p[i]<='z')  
             num= p[i] - 'a' + 10;  
         else if(p[i]>='0'&& p[i]<='9')  
             num=p[i] - '0';  
         if(num+1>low)  
             low=num+1;  
     }  
     return low;  
   
 }  
   
 int compare(char* p,long long radix ,long long target)  
 {  
     long long len=strlen(p);  
     long long m = 1;  
     long long num = 1;  
     long long sum = 0;  
     for(long long i=len-1;i>=0;i--)  
     {  
         if(p[i]>='a'&&p[i]<='z')  
             num= p[i] - 'a' + 10;  
         else if(p[i]>='0'&& p[i]<='9')  
             num=p[i] - '0';  
         sum+=num*m;  
         m*=radix;  
         if(sum>target)  //avoid  overflow  
             return 1;  
     }  
   
     if(sum>target)  
         return 1;  
     else if(sum<target)  
         return -1;  
     else  
         return 0;  
   
 }  
   
   
 long long binarySearch(char *p,long long low,long long high,long long top)  
 {  
     long long mid = low;  
     long long tmp;  
   
     while(low<=high)  
     {  
         tmp = compare(p,mid,top);  
         if(tmp>0)  
         {  
             high = mid-1;  
         }  
         else if(tmp<0)  
         {  
             low = mid +1;  
         }  
         else  
             return mid;  
         mid = (low + high)/2;  
     }  
     
     return -1;  
 }  
   
   
 int main()  
 {  
     long long tag;  
     long long radix;  
     long long target;  
     long long least; // lowest possible radix  
     long long most; // highest possible radix  
     long long res;  
       
   
     cin>>A;  
     cin>>B;  
     cin>>tag;  
     cin>>radix;  
   
     if(1==tag)  
     {  
         target=num2Dec(A,radix);  
         least = findLowRadix(B);  
         most = (target + 1 > least + 1) ? target +1 :least +1;   
         res = binarySearch(B,least,most,target);  
         if(res==-1)  
             cout<<"Impossible"<<endl;  
         else  
             cout<<res<<endl;  
   
     }  
     else if(2==tag)  
     {  
         target=num2Dec(B,radix);  
         least = findLowRadix(A);  
         most = (target + 1 > least + 1) ? target +1 :least +1;   
         res = binarySearch(A,least,most,target);  
         if(res==-1)  
             cout<<"Impossible"<<endl;  
         else  
             cout<<res<<endl;  
     }  
           
 }



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值