PAT 甲级 1010 Product of Polynomials (24/25)

博主心态炸了…本题差一个点没有A,得了24分。有一个点超时,根据网上大佬的题解,应该在遍历进制采用二分的方法。
说一下题意
就是给你四个数 n1,n2,tag,radix;
意思是第tag个数 是radix进制的,然后问你有没有可能n2是x进制的,让n1==n2成立 求x,若没有,输出impossible。
看上去是暴力题,但是有一个很坑的地方,题目虽说给定n每一位都是小于35的。但是所求的x进制却未必是小于35进制的,也有可能是100000进制数。所以遍历时不能简单从2遍历到35;而是从最高位+1遍历到已给的n是10进制值+1。什么意思呢。比如说给定数据 6 4 1 10,6为10进制,求一下在多少进制情况下,4可以等6。首先下边界为4,因为n2的一位已经是4了,所以肯定不能是4以下的进制,只能是5、6更高的进制,再说一下上边界。 既然给定n1 = 6,那么n2的进制一定不能超过n1。如果超过n1 那么n2为任意数值都会比n1大,于是不符合题意。所以循环边界(所求数最高位+1,已给数的十进制+1),在这个区间内进行二分查找即可求得结果。
贴一下我没有使用二分查找24分的代码。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
char N[3][15],rr[10];
int tag,radix;
ll sum,ans;
int main()
{
	scanf("%s%s%d%d",N[1],N[2],&tag,&radix);
	for(int i=strlen(N[tag]) - 1;i>=0;i--)
	{
		if(N[tag][i] >= 'a' && N[tag][i] <= 'z')  
			sum += ((N[tag][i] - 'a' + 10) * pow(radix,strlen(N[tag])-1-i));
		else
			sum += ((N[tag][i] - '0') * pow(radix,strlen(N[tag])-1-i));
	}
	int t = tag == 1 ? 2 : 1;
	int imax = -1;
	for(int i=strlen(N[t]) - 1;i>=0;i--)
	{
		if(N[t][i] >= 'a' && N[t][i] <= 'z') 
		{
			if(N[t][i] - 'a' + 10 > imax)
					imax = N[t][i] - 'a' + 10;
		}	
			else{
				if(N[t][i] - '0' > imax) 
				imax = N[t][i] - '0';
				 
			}
				
	}
	for(ll r=imax+1;r<=sum+1;r++)
	{
		ans = 0;
		 for(int i=strlen(N[t]) - 1;i>=0;i--)
		 {
		 	if(N[t][i] >= 'a' && N[t][i] <= 'z')  
				ans += ((N[t][i] - 'a' + 10) * pow(r,strlen(N[t])-1-i));
			else
				ans += ((N[t][i] - '0') * pow(r,strlen(N[t])-1-i));
				 
		 }
		 if(ans == sum)
		 {
		 		printf("%lld\n",r);	 	
		 	return 0;
		 }
	}
	printf("Impossible\n");
	
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值