`
linest
  • 浏览: 150242 次
  • 性别: Icon_minigender_1
  • 来自: 内蒙古
社区版块
存档分类
最新评论

pat-1010* Radix

    博客分类:
  • pat
 
阅读更多
1010: 给出两个数,已知一个数的进制,求是否可以在某进制下两数相等。
如例子一,第一个数为10进制6 110 如果2进制则相等。
Sample Input 1:
6 110 1 10
Sample Output 1:
2
Sample Input 2:
1 ab 1 2
Sample Output 2:
Impossible


不用二分搜索时第7case超时 ,用了二分搜索第10case错误。。。
交了好多遍。。。求正确代码。。。

#include<iostream>
using namespace std;
#include<string.h>

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;
	long long tmp;

	while(low<=high)
	{
		mid = (low + high)/2;
        tmp = compare(p,mid,top);
		if(tmp>0)
		{
			high = mid-1;
		}
		else if(tmp<0)
		{
			low = mid +1;
		}
		else
			return mid;
	}
	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;
	}
		
}


分享到:
评论
8 楼 lixuanchong 2012-01-30  
在lz的代码上稍作修改即可:
#include<iostream>

#include<string.h>
#include <string>
using namespace std;
void cutZero( string & str )
{
	string::iterator it = str.begin();
	for( ;it!=str.end();++it )
	{
		if(*it != '0')
		{
			break;
		}
	} 

	str.erase(str.begin() , it);
} 

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;
	long long tmp;

	while(low<=high)
	{
		mid = (low + high)/2;
        tmp = compare(p,mid,top);
		if(tmp>0)
		{
			high = mid-1;
		}
		else if(tmp<0)
		{
			low = mid +1;
		}
		else
			return mid;
	}
	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;
////////////////////////////////////////////
	string a_str = A;
	string b_str = B;
	cutZero(a_str);
	cutZero(a_str);

	if( a_str == b_str )
	{
		cout << radix << endl;
		return 0;
	}

////////////////////////////////////////////
	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;
	}
		
}

7 楼 air_sky 2011-10-15  
确实。。result=a0*base^0+a1*base^1+a2*base^2+...+an*base^n,所有数都是非负数,函数应该是单调递增。。
按理确实可以二分法查找,但是测试用例也确实存在二分法找不到而穷举法找到的情况。。就是不知道测试用例具体是什么数据。。
6 楼 linest 2011-10-11  
air_sky 写道

关于“方程只有一个正整数解,就可以用二分法”是不正确的。例如方程(x-2)^2=0在[0, 3]上运用二分法寻根的话,会得出错误的无解结论。。所以,能运用二分法求解的必要条件是方程F(x)=c所表示的函数G(x)=F(x)-c在区间边界异号。。
上述表达得不是太清楚,希望可以看懂。至于严谨的数学证明,还待高人来证明。

所以我在区间过大,且边界异号的情况下采用二分法。但始终无法消灭测试点10。



(x-2)^2 = 0 在[0,3]范围内不是单调函数,所以不能用二分。
本题中同一个表达串随着进制增加,结果会越来越大,是单调递增的,你举得例子好像不适合本题哎, 欢迎继续讨论。
5 楼 air_sky 2011-10-03  
昨天早上终于把1010. radix过了。。这几天来也是有参照你的代码,所以特地来说说心得,交流交流。。

关于“方程只有一个正整数解,就可以用二分法”是不正确的。例如方程(x-2)^2=0在[0, 3]上运用二分法寻根的话,会得出错误的无解结论。。所以,能运用二分法求解的必要条件是方程F(x)=c所表示的函数G(x)=F(x)-c在区间边界异号。。
上述表达得不是太清楚,希望可以看懂。至于严谨的数学证明,还待高人来证明。

所以我在区间过大,且边界异号的情况下采用二分法。但始终无法消灭测试点10。

最后方案是:先在low~low+32767范围内用for查找,再对过大的区间进行二分法,最后在剩下的小区间用for查找。。终于AC。。

若有需要代码的话我再贴出吧。

PS:竟然注册满一天才能评论,晕。。
4 楼 linest 2011-09-24  
zhucezhenmafan 写道
/*
不好意思,我记错了,是把mid = low;
这是今天刚过的代码(就是你的代码修改了下),这里不能贴图,要不就把AC的状态发给你看。
我在pat的老的网站和改域名的网站都提交过了,下面是运行状态。
另外,本人很菜,我真不知道为啥这样能AC,希望有高手指导下。
9069 2011-09-23 12:36:46 Accepted  Info  0 1010 C++ 0 184
2011年9月23日 星期五 12:48:36 HKT 答案正确 25 1010 C++ (g++) 0 690
*/


能过已经挺强了 我现在也不知道为啥~~~
3 楼 zhucezhenmafan 2011-09-23  
/*
不好意思,我记错了,是把mid = low;
这是今天刚过的代码(就是你的代码修改了下),这里不能贴图,要不就把AC的状态发给你看。
我在pat的老的网站和改域名的网站都提交过了,下面是运行状态。
另外,本人很菜,我真不知道为啥这样能AC,希望有高手指导下。
9069 2011-09-23 12:36:46 Accepted  Info  0 1010 C++ 0 184
2011年9月23日 星期五 12:48:36 HKT 答案正确 25 1010 C++ (g++) 0 690
*/
#include<iostream> 
using namespace std; 
#include<string.h> 
 
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; 
    } 
         
2 楼 linest 2011-09-22  
zhucezhenmafan 写道
long long binarySearch(char *p,long long low,long long high,long long top) 

    long long mid; 
    long long tmp; 
 
    while(low<=high) 
    { 
        mid = (low + high)/2;
        tmp = compare(p,mid,top); 
        if(tmp>0) 
        { 
            high = mid-1; 
        } 
        else if(tmp<0) 
        { 
            low = mid +1; 
        } 
        else 
            return mid; 
    } 
    return -1; 


红色的地方改下就过了,代码如下:
long long binarySearch(char *p,long long low,long long high,long long top) 

    long long mid = high; 
    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; 


事实上,我也不知道为什么。按照上面的改法,按说,题目可以看成是求整数系数f(x)=C的解,而且除了常数项,其他系数全是正的,就是说,方程最多有一个正数解,也就是最多有一个正整数解。二分法是不会有错的。。。。。。

改了还是过不了。。。你是怎么过的呢
1 楼 zhucezhenmafan 2011-09-22  
long long binarySearch(char *p,long long low,long long high,long long top) 

    long long mid; 
    long long tmp; 
 
    while(low<=high) 
    { 
        mid = (low + high)/2;
        tmp = compare(p,mid,top); 
        if(tmp>0) 
        { 
            high = mid-1; 
        } 
        else if(tmp<0) 
        { 
            low = mid +1; 
        } 
        else 
            return mid; 
    } 
    return -1; 


红色的地方改下就过了,代码如下:
long long binarySearch(char *p,long long low,long long high,long long top) 

    long long mid = high; 
    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; 


事实上,我也不知道为什么。按照上面的改法,按说,题目可以看成是求整数系数f(x)=C的解,而且除了常数项,其他系数全是正的,就是说,方程最多有一个正数解,也就是最多有一个正整数解。二分法是不会有错的。。。。。。

相关推荐

Global site tag (gtag.js) - Google Analytics