码迷,mamicode.com
首页 > 其他好文 > 详细

pat1010. Radix (25) BUG!!!

时间:2015-01-23 14:45:08      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:pat

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int c2int(char c){
	if('0'<=c&&c<='9')
		return c-'0';
	else
		return c-'a'+10;
}
long s2decimal(char str[], long radix){
	long digit, sum=0;
	// 必须判断每一位是否小于radix
	int i=0;
	for(;i<strlen(str);i++){
		digit=c2int(str[i]);
		// radix应该是从大到小排列下来
		//if(digit>=radix)return -1;
		sum=radix*sum+digit;
		// sum溢出
		if(sum<0)return -1;
	}
	return sum;
}
int main(void){
	char str1[15], str2[15], str[15];
	int tag;
	long radix;
	long sum=0, num;
	long low=2,high;


	scanf("%s%s%d%ld", str1,str2,&tag,&radix);
	if(tag==1){
		sum=s2decimal(str1, radix);
		strcpy(str, str2);
	}else if(tag==2){
		sum=s2decimal(str2, radix);
		strcpy(str, str1);
	}
	// 二分查找。理性思考得出判断:2<=radix<=sum+1
	// 输出最小进制
	// only one digit,there exists multiple situations
	if(strlen(str)==1&&c2int(str[0])==sum){
		printf("%d\n", c2int(str[0])+1);
		system("pause"); 
		return 0;
	}
	high=sum+1;
	while(low<=high){
		num=s2decimal(str, (low+high)/2);
		if(num==-1||num>sum)
			high=(low+high)/2-1;
		else if(num<sum)
			low=(low+high)/2+1;
		else if(num==sum){
			printf("%d\n", (low+high)/2);
			system("pause"); 
			return 0;
		}
	}
	printf("Impossible\n");
	system("pause"); 
	return 0;
}

bug测试用例:17 321 1 10

输出:2

本程序可以通过pat,但是radix<digit,pat判断有误!!!

应该在s2decimal方法中判断digit<radix,改进后的s2decimal方法:

long s2decimal(char str[], long radix){
	long digit, sum=0;
	// 必须判断每一位是否小于radix
	int i=0;
	for(;i<strlen(str);i++){
		digit=c2int(str[i]);
		// radix应该是从大到小排列下来
		if(digit>=radix)return -2;
		sum=radix*sum+digit;
		// sum溢出
		if(sum<0)return -1;
	}
	return sum;
}

如有错误,欢迎指正!

pat1010. Radix (25) BUG!!!

标签:pat

原文地址:http://blog.csdn.net/ldrmcml/article/details/43054599

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!