博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PAT 1010__已过但why二分查找时mid须初始化为low
阅读量:6896 次
发布时间:2019-06-27

本文共 2480 字,大约阅读时间需要 8 分钟。

hot3.png

#include 
#include 
#include 
#include 
int i;//函数 求底数可能取的最小值low //输入char *p 返回intint getLow(char * p){ int l = strlen(p); int low; char max='0'; for(i=0;i
 max) max = p[i];//直接比较ASCII码 //printf("0=%d 9=%d a=%d z=%d",'0','9','a','z');//48 57 97 122 } if(max<='9'){ low = max-'0'+1;} else{ low = max-'a'+11;} return low;}//函数 数值字符串转换为十进制数值 //输入char *p, long long radix 返回long longlong long char2Decimal(char * p, long long radix){//可以用p[i]表示*p中的字符 int l = strlen(p); long long decimalResult = 0; for(i=0;i
= 'a' && p[i] <= 'z') temp =  p[i]-'a' + 10; if(p[i] >= '0' && p[i] <= '9') temp = p[i]-'0'; decimalResult = decimalResult*radix + temp; } return decimalResult;}//函数 输入的char *p 与 long long target比较大小int compare(char * p,long long radix,long long target){ long long sum = 0; //sum = char2Decimal(p, radix);//提交8 个case点错误,其中有7个是因为在计算sum时溢出了 int l = strlen(p); for(i=0; i
= 'a' && p[i] <= 'z') temp =  p[i]-'a' + 10; if(p[i] >= '0' && p[i] <= '9') temp = p[i]-'0'; sum = sum*radix + temp; if(sum > target) return 1;//sum*radix会变得很大,甚至超过z的9次方,所以要及时退出,避免溢出!!! } if(sum < target) return -1; else if(sum == target) return 0;}//函数 二分查找能让*p和target相等的radixlong long binarySearchRadix(long long low, long long high, char * p, long long target){//注意这里的low 是long long 而不是int //long long mid = (low + high)/2;//用这个会有1个case 10 错误,即使放在while循环内第一行也不行! long long mid = low;//mid初始化必须是low int result; while(low <= high){ /*mid = (low + high)>>1;*/ result = compare(p,mid,target); switch (result){ case -1: low = mid + 1; break; case 0: return mid; case 1: high = mid - 1; } mid = (low + high)>>1; } return -1;}int main(){ //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); char s[4][11]; int tag,low; long base; long long target,high,findRadix; char p[11]; for(i=0;i<4;i++){ scanf("%s",s[i]); } tag = atoi(s[2]); base = atol(s[3]); switch(tag){ case 1: target = char2Decimal(s[0],base);//已知的十进制数值 strcpy(p,s[1]); break; case 2: target = char2Decimal(s[1],base); strcpy(p,s[0]); break; } low = getLow(p); //底数可能取的最大值high = max(已知的十进制数值+1, low+1),所以底数可能是个很大的数,必须用long long high = target>low?target+1:low+1; findRadix = binarySearchRadix(low,high,p,target); if(findRadix >0 ) printf("%lld\n",findRadix); else if(findRadix == -1 ) printf("Impossible\n"); return 0;}

参考了:

http://blog.csdn.net/wzb56_earl/article/details/7330762

转载于:https://my.oschina.net/kaneiqi/blog/201930

你可能感兴趣的文章
Module not found: Error: Can't resolve 'XXX' in 'XXXX'
查看>>
Mac Mysql 修改初始化密码
查看>>
textarea 禁止拉伸
查看>>
js 常用正则表达式表单验证代码
查看>>
【ShaderToy】基础篇之再谈抗锯齿(antialiasing,AA)
查看>>
常见中文字体的英文名
查看>>
你不知道的JavaScript(四)数值
查看>>
Spring的Restful
查看>>
令人吐血的string.format 对齐问题
查看>>
Notepad++中直接运行python
查看>>
Error:java: Compilation failed: internal java compiler
查看>>
bzoj2821作诗
查看>>
AngularJS - contorller app module
查看>>
获取当前服务器目录文件
查看>>
解决爬虫时网站采用gb2312编码所遇到的乱码问题!
查看>>
安装配置oracle11gR2、client、plsql developer及学习
查看>>
读取文件的目录结构和统计文件的代码信息
查看>>
HDU 1096 A+B for Input-Output Practice (VIII)
查看>>
需求分析
查看>>
Java项目转换成Web项目
查看>>