pat1010. Radix (25) BUG!!!

1 篇文章 0 订阅
#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;
}

如有错误,欢迎指正!

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值