ZJU PAT 1010

本文详细解析了PAT1010题目的解决思路,包括如何使用二分查找法确定radix范围,并提供了一段C++代码实现,具体介绍了如何将给定的进制数字转换为十进制,以及如何通过比较两个不同进制数字来找到正确的radix。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

好久没写oj的题解了,今天做了pat 1010的题目,提交代码后才只有19分,最后在网上看到才发现radix的大小是long long级别的啊,那么我们就只能使用二分来查找结果了,那么剩下的就是理清思路了。

  1. 如果两个数字都是1,结果肯定是2
  2. 如果两个数字相同,但不是1,结果肯定是题目输入的那个radix
  3. 如果两个数字不相同,我们则有确定radix的范围呢?我们假设A的radix已经知道,那么我们可以用long long表示出A的十进制(幸好题目的样例中已知的数字可以用A表示,否则解起来就更麻烦了),通过遍历B我们可以知道它的最小radix是多少,我们假设前者为target,后者为least,那么B的radix就是再target和least之间了,最小为least,如果target大于least,那么就是[least,target],否则就是[least,least]了。为什么呢?我们想想,如果B是一个一位数,那么无论是什么进制都没有用,如果B是10,那么radix等于target正好等于A,如果B再大点,radix等于target肯定大于A了。
说道这里,就应该比较清楚了。

//============================================================================
// Name        : PAT1010.cpp
// Author      : Whosemario
//============================================================================

#include <iostream>
#include <string.h>
using namespace std;

int equal(char* A, char* B){
	int i,j;
	for(int i=0;i<strlen(A);i++) if(A[i]!='0') break;
	for(int j=0;j<strlen(B);j++) if(B[j]!='0') break;
	int lenA = strlen(A);
	int lenB = strlen(B);
	if(lenA-i != lenB-j) return -1;
	for(int k=0;k<lenA-i;k++)
		if(A[lenA-1-k]!=B[lenB-1-k]) return false;
	if(lenA-i==1&&A[lenA-1]=='1') return 1;
	return 2;
}

long long str2Num(char * A, long long radix){
	int len = strlen(A);
	long long ret = 0;
	long long p =1;

	for(int i=len-1;i>=0;i--){
		int num ;
		if(A[i]>='0' && A[i]<='9') num = A[i]-'0';
		else num = A[i]-'a'+10;
		ret += p*num;
		p*=radix;
	}

	return ret;
}

long long calcRadix(char * B){
	long long ret = 0;
	int len = strlen(B);
	for(int i=0;i<len;i++){
		int num ;
		if(B[i]>='0' && B[i]<='9') num = B[i]-'0';
		else num = B[i]-'a'+10;
		if(num+1>ret) ret=num+1;
	}
	return ret;
}

int compare(char* B, long long radix, long long target){
	int len = strlen(B);
	long long ret = 0;
	long long p = 1;
	for(int i=len-1;i>=0;i--){
		int num;
		if(B[i]>='0' && B[i]<='9') num = B[i]-'0';
		else num = B[i]-'a'+10;
		ret += p*num;
		if(ret > target) return 1;
		p*=radix;
	}
	if(ret > target) return 1;
	else if(ret<target) return -1;
	else return 0;
}

long long binarySearch(char* B, long long low, long long high, long long target){
	long long mid;
	while(low<=high){
		mid = (low+high)/2;
		int res = compare(B,mid,target);
		if(res > 0)
			high = mid-1;
		else if(res<0)
			low = mid+1;
		else return mid;
	}
	return -1;
}

int main() {
	char A[12];
	char B[12];
	int chose;
	long long radix;

	cin>>A>>B>>chose>>radix;
	int eq = equal(A,B);
	if(eq==1) printf("2\n");
	else if(eq==2) printf("%d\n",radix);
	else{
		if(chose==1){
			long long target = str2Num(A,radix);
			long long least = calcRadix(B);
			long long most = (target)>(least)?(target):(least);  // input : 11 b 1 10
			long long res = binarySearch(B,least,most,target);
			if(res==-1) cout<<"Impossible"<<endl;
			else cout<<res<<endl;
		}
		else{
			long long target = str2Num(B,radix);
			long long least = calcRadix(A);
			long long most = (target)>(least)?(target):(least);
			long long res = binarySearch(A,least,most,target);
			if(res==-1) cout<<"Impossible"<<endl;
			else cout<<res<<endl;
		}
	}
	return 0;
}


<think>好的,我现在需要处理用户关于寻找PAT乙级题目解答的请求。首先,用户希望得到详细的解答与解析,并且希望回答具有实用性和可操作性。根据任务要求,我需要调用网络搜索工具来获取相关信息,然后整合这些信息生成结构清晰的回答。 首先,我应该确认PAT乙级考试的相关信息,比如它是什么,考察内容等。然后,针对用户的问题,寻找常见的解答途径。可能包括官方资源、在线评测平台、技术社区和书籍资料等。需要确保每个方法都有具体的例子或链接,方便用户操作。 接下来,我需要考虑如何组织这些信息。用户要求分多个方法或步骤,每个步骤间换行,避免使用步骤词汇,所以可能需要用标题式的分点,比如“官方资源”、“在线评测平台”等作为每个部分的小标题。 然后,检查是否需要代码或公式。题目解答中可能会有代码示例,所以需要按照格式要求,用三个反引号包裹代码,并注明语言类型。例如,在举例题目1001时,应该提供一个Python代码示例,并正确格式化。 另外,回答中不能将引用集中在末尾,所以每个引用可能需要自然地嵌入到各个部分中。例如,提到牛客网时直接说明其特点,并可能提到具体的题目链接,但根据实际搜索结果,可能无法提供具体链接,所以需要笼统描述。 还要注意避免使用第一人称,所以用客观陈述的方式介绍各个资源和方法。例如,“PAT官网提供历年真题”而不是“我建议访问PAT官网”。 生成相关问题部分时,需要基于用户的原问题和回答内容。可能的后续问题包括如何备考、常见错误、题目难度分析等,确保每个问题都与PAT乙级解答相关,并且能帮助用户进一步获取信息。 最后,检查格式是否符合要求,特别是数学公式和代码部分,确保没有遗漏。同时,确保相关问题部分使用正确的标题,并且每个问题用数字标号,没有多余的空格或换行。</think>根据PAT乙级真题的解答需求,整合以下解题思路和资源渠道供参考: **官方资源与OJ平台** 浙江大学PAT官网(https://pat.zju.edu.cn/)提供历年真题题库及在线评测功能。部分题目配备标准答案代码,适合基础训练与提交验证。例如题目1001(害死人不偿命的3n+1猜想)的Python实现: ```python n = int(input()) count = 0 while n != 1: n = n // 2 if n % 2 == 0 else (3*n + 1)//2 count +=1 print(count) ``` **技术社区解析** 优快云、博客园等平台包含大量真题解析笔记,用户"柳婼"的题解系列(如《算法笔记》配套题解)提供C++/Java/Python多语言实现。典型解题步骤包含: - 输入数据处理(如使用`map(int, input().split())`) - 核心算法实现(如素数判断函数`is_prime`) - 输出格式控制(`print(f"{x:.1f}")`) **数据结构应用实例** 常见考点涉及哈希表应用,如1042字符统计题: ```python from collections import defaultdict s = input().lower() d = defaultdict(int) for c in s: if c.isalpha(): d[c] +=1 max_c = max(d, key=lambda x: (-d[x],x)) print(max_c, d[max_c]) ``` **数学公式推导** 部分题目涉及数论知识,如1007素数对猜想需验证$p$和$p+2$同为素数的情况: $$ \exists p \in \mathbb{P},\ p+2 \in \mathbb{P} $$ 通过埃拉托斯特尼筛法可优化计算效率,时间复杂度控制在$O(n\log\log n)$
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值