`
linest
  • 浏览: 155496 次
  • 性别: 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的解,而且除了常数项,其他系数全是正的,就是说,方程最多有一个正数解,也就是最多有一个正整数解。二分法是不会有错的。。。。。。

相关推荐

    Radix4Radix2FFT实现

    **Radix-4与Radix-2快速傅里叶变换(FFT)实现** 在数字信号处理和计算领域,快速傅里叶变换(Fast Fourier Transform,FFT)是一种高效计算离散傅里叶变换(DFT)及其逆变换的方法。FFT算法大大减少了计算量,尤其...

    ubuntu-nm命令基本使用.pdf

    - **-t radix 或 --radix=radix**:使用指定的进制显示符号值。`radix` 可以为 `d` 表示十进制、`o` 表示八进制或 `x` 表示十六进制。 - **--target=bfdname**:指定目标代码的格式,而非使用系统的默认格式。 - **-...

    JAVA中字符-字符串常用的方法.doc

    - `radix`: 基数。 - **返回值**: 字符`ch`的数值。 ##### 13. `static int digit(int codePoint, int radix)` - **功能**: 返回使用指定基数的指定字符(Unicode代码点)的数值。 - **参数**: - `codePoint`: ...

    Algorithm for programmer

    - **2.2 The radix permutation**: radix置换。 - **2.3 In-place matrix transposition**: 原地矩阵转置。 - **2.4 The triple reversion technique**: 三重反转技术。 - **2.5 The zippermutation**: Zipper...

    flash脚本代码大全

    - **语法**:`parseInt(string, radix);` - **功能**:将字符串转换为整数。 19. **Random(随机数)** - **语法**:`Math.random();` - **功能**:生成0到1之间的随机数。 20. **Scroll(滚动)** - **语法*...

    Matters Computational-ideas, algorithms, source code

    - **The Radix Permutation**: A permutation technique based on radix sorting. - **In-Place Matrix Transposition**: Methods for transposing matrices in-place. - **Rotation by Triple Reversal**: An ...

    Verilog Quickstart--Practical Guide to Simulation & Synthesis in Verilog (3rd Ed).pdf

    - **Setting the Default Radix**:设置默认基数的方法。 - **Special Characters**:特殊字符在字符串中的使用。 - **The Current Simulation Time**:当前模拟时间的概念。 - **Suppressing Spaces in Your Output...

    c语言部分方法介绍资料

    根据给定文件的信息,我们可以总结出C语言中与文件标题和描述相关的重要知识点,特别是针对字符处理函数以及数学函数的应用。 ### 字符处理函数 在C语言中,字符处理函数通常用于判断或转换字符,这些函数大部分...

    javaScript对象结构图

    - **toString([radix])**: 返回数字的字符串表示。 - **参数**: `radix`: 进制。 - **兼容性**: N4, IE4 - **toPrecision(precision)**: 返回数字的精确度表示。 - **参数**: `precision`: 精确度。 - **兼容性*...

    自动化专业英语 词汇

    - **Radix**: 权,基数,表示数制中不同的进制。 - **Chain**: 串,一系列连续的元素。 - **Remainder**: 余数,除法运算后剩余的部分。 - **Digit**: 位数,组成数字的每个单独的数字。 - **Fractional**: 小数的,...

    Matters Computational

    - **The Radix Permutation**: A permutation that orders data based on its radix representation. - **In-Place Matrix Transposition**: Transposing matrices without extra storage. - **Rotation by ...

    Algorithms For Programmers

    - **Radix-2 representation**:介绍基数2表示法。 - **A sparse signed binary representation**:讲解稀疏有符号二进制表示。 - **Generating bit combinations**:介绍生成位组合的方法。 - **Generating bit...

    算法导论答案 中文版

    - **基数排序(Radix Sort)**: - **概念**:对于整数排序,按照低位到高位的顺序进行排序。 - **应用**:适用于整数排序,特别是当数据范围较大时。 以上就是对这份《算法导论》答案集中关键知识点的总结,这些...

    计算机专业英语单词.ppt

    - **根、基数**: `radix` 在数学中指的是进位制的基数,例如十进制的基数为10。 - **八进制**: `octal` 是一种基数为8的进位制。 - **字母表**: `alphabet` 在计算机领域中可能指的是字符集,如ASCII码表。 - **分数...

    java常用char,string函数

    13. **digit(int codePoint, int radix)** - **功能**:此方法用于获取指定Unicode代码点在指定基数下的数值。 - **参数**: - `codePoint`:Unicode代码点。 - `radix`:基数。 - **返回值**:返回代码点在...

    as3错误代码内容.doc

    #### 1003 radix 参数必须介于2至36之间 - **描述**:当使用转换基数的方法如 `parseInt` 或者相关函数时,如果传递的基数不在2到36之间,就会出现这个错误。 - **解决方法**: - 重新检查基数参数的值,并确保其在...

    Dom视频笔记

    - **参数**:`radix`表示进制,默认为10。 - **示例**:`parseInt("123", 10);` // 返回123 **4. 获取当前时间** - **方法**:通过`Date`对象的属性获取当前时间的小时、分钟和秒数。 - **示例**: ```...

Global site tag (gtag.js) - Google Analytics