二分强化 PAT1010 Radix (25 分) 未(AC)

思路梳理
首先将已知radix的树转化为10进制
从大到0遍历 进制数 查看另一个数是否与之相等

字母的处理是将每一个数字存储在数组中,再拿出来计算对应位置的数字

第一次解题代码
直接遍历

#include <iostream>
#include <cmath>
#include <cstring>

int main(int argc, char** argv) {
	
	long n1=0,n2=0,tag=0,radix=0;
	long s[2];
	int index = 0;
	long sum = 0;
	long sum1 = 0,flag = 0; 
	int temp= 0;
	int len[2];
	
	char x1[11],x2[11];
	long b[2][11];
	
	scanf("%s %s",&x1,&x2);
	for(int i = 0;i<strlen(x1);i++)
	{
		if(x1[i]<='9')
			b[0][i] = x1[i] - '0';
		else
			b[0][i] = x1[i] - 'a' + 10;
		
	}

	for(int i = 0;i<strlen(x2);i++)
	{
		if(x2[i]<='9')
			b[1][i] = x2[i] - '0';
		else
			b[1][i] = x2[i] - 'a' + 10;
		
	}
	scanf("%ld %ld",&tag,&radix);
	len[0] = (int)strlen(x1);
	len[1] =  (int)strlen(x2);
//	s[0] = getnum(b1,len1);
//	s[1] = getnum(b2,len2);
//	printf("%ld %ld %ld %ld\n",s[0],s[1],tag,radix);
	
	
	
	

	
		
	for(int z = len[tag - 1]-1;z>=0;z--)
	{
		int i = pow(radix,index);
		sum += b[tag-1][z] * i;
		
		index++;

	}
//	printf("%dyy",sum);
	if(tag-1 == 1)
		tag = 1;
	else 
		tag =2;
	

	for(int j = 100;j>0;j--)
	{	
		
		index = 0;
			
		for(int z = len[tag - 1]-1;z>=0;z--)
		{
			int i = pow(j,index);
			sum1 += b[tag-1][z] * i;
			index++;
		}
		

			
		if(sum1 == sum)
		{
		
			printf("%d",j);
			flag = 1;
			break;
		}
//		printf("%dxx",sum1);
		sum1 = 0;
			
	}
	if(flag == 0)
		printf("Impossible");

	
	return 0;
}
在这里插入代码片

在这里插入图片描述

然后用二分法

考虑在数字为个位数时答案不唯一,使得r=sum+1;
因为进制数没有规定上限 考虑溢出 使用longlong 并且判断sum1是否小于0

修改后的代码

#include <iostream>
#include <cmath>
#include <cstring>

typedef long long ll;
int main(int argc, char** argv) {
	
	ll n1=0,n2=0,tag=0,radix=0;
	ll s[2];
	ll index = 0;
	ll sum = 0;
	ll sum1 = 0,flag = 0; 
    ll temp= 0;
	ll len[2];
	
	char x1[11],x2[11];
	ll b[2][11];
	
	scanf("%s %s",&x1,&x2);
	for(int i = 0;i<strlen(x1);i++)
	{
		if(x1[i]<='9')
			b[0][i] = x1[i] - '0';
		else
			b[0][i] = x1[i] - 'a' + 10;
		
	}

	for(int i = 0;i<strlen(x2);i++)
	{
		if(x2[i]<='9')
			b[1][i] = x2[i] - '0';
		else
			b[1][i] = x2[i] - 'a' + 10;
		
	}
	scanf("%ld %ld",&tag,&radix);
	len[0] = (int)strlen(x1);
	len[1] =  (int)strlen(x2);

	
	
	
	

	
		
	for(int z = len[tag - 1]-1;z>=0;z--)
	{
		int i = pow(radix,index);
		sum += b[tag-1][z] * i;
		
		index++;

	}

	if(tag-1 == 1)
		tag = 1;
	else 
		tag =2;
	
	
	ll l = 0,r=sum + 1;
	ll mid = 0;
	while(l<=r)
	{	
		mid = l + (r-l)/2;
		index = 0;
			
		for(int z = len[tag - 1]-1;z>=0;z--)
		{
			int i = pow(mid,index);
			sum1 += b[tag-1][z] * i;
			index++;
		}
		

			
		if(sum1 == sum)
		{
		
			printf("%d",mid);
			flag = 1;
			break;
		}
		else if(sum1>sum || sum1<0)
			r = mid -1;
		else
			l = mid +1;
		
		sum1 = 0;
			
	}
	if(flag == 0)
		printf("Impossible");

	
	return 0;
}
在这里插入代码片

在这里插入图片描述
神奇的分数变低了。。。

哭泣 ,纠缠了一天了 ,占时放弃。。

猜你喜欢

转载自blog.csdn.net/qq_15556537/article/details/88559148