PAT习题解:1010. Radix (25)

本文介绍PAT-A-1010题目的解题思路,利用二分查找法确定能使两个不同进制的数相等的目标进制。文章详细解释了如何设置查找范围,并通过代码示例展示了具体的实现过程。

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

题目链接:http://www.patest.cn/contests/pat-a-practise/1010

这道题主要考察进制转换和二分查找,坑的地方主要在大数溢出上,需要使用long long类型。搞定以后挺爽的,哈哈。

题目大意为,给定数a和数b以及数a的进制,求数b的进制,使数a与数b相等。

策略是采取二分查找法,确定的进制上下界中,查找一个进制,使其满足等式。

进制的下界容易确定,必然为数b中最大符号代表的数加上1。进制的上界为数a和数b最大符号代表的数的最大值加上1。(进制必然小于数a,因为比数a大的话,数b必然比数a大;如果数a小于数b中的最大符号,数a必然比数b小,肯定找不到这一进制。)

此进制有可能很大,所以需要采用long long类型。

比较时,有可能提前确定出两数在当前进制下的大小。

#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>

typedef long long ll;

int char2int(char c)
{
	if (c >= '0' && c <= '9')
	{
		return c - '0';
	}
	else if (c >= 'a' && c <= 'z')
	{
		return c - 'a' + 10;
	}
	else
	{
		return -1;
	}
}

ll str2ll(char num[], ll radix)
{
	ll sum = 0;
	for (int i = 0; num[i] != '\0'; i++)
	{
		sum = sum * radix + char2int(num[i]);
	}
	return sum;
}

int findSmallestRadix(char num[])
{
	int max = 0;
	for (int i = 0; num[i] != '\0'; i++)
	{
		if (max < char2int(num[i]))
		{
			max = char2int(num[i]);
		}
	}
	return max + 1;
}

int compare(ll n1, char n2[], ll radix)
{
	ll sum = 0;
	for (int i = 0; n2[i] != '\0'; i++)
	{
		sum = sum * radix + char2int(n2[i]);
		if (sum > n1)
		{
			return 1;
		}
	}
	if (sum > n1)
	{
		return 1;
	}
	else if (sum < n1)
	{
		return -1;
	}
	else
	{
		return 0;
	}

}
ll biSearch(ll n1, char n2[])
{
	ll l = (ll)findSmallestRadix(n2);
	ll r = (n1 > l) ? n1 + 1 : l + 1;
	ll m;
	while (l < r )
	{
		m = (l + r) / 2;
		if (compare(n1, n2, m) == 1)
		{
			r = m;
		}
		else if (compare(n1, n2, m) == -1)
		{
			l = m;
		}
		else
		{
			return m;
		}
	}
	return -1;
}
int main()
{
	char n1[11];
	char n2[11];
	char tag;
	ll radix;
	scanf("%s %s %c %lld", n1, n2, &tag, &radix);
	ll r;
	switch (tag)
	{
		case '1':
			r = biSearch(str2ll(n1,radix), n2);
			break;
		case '2':
			r = biSearch(str2ll(n2, radix), n1);
			break;
	}
	if (r == -1)
	{
		printf("Impossible");
	}
	else
	{
		printf("%lld", r);
	}
	return 0;
}



<think>好的,我现在需要帮助用户解决他们遇到的TypeScript错误问题。用户提供的代码片段中有两个数组转换操作,其中第一个使用`item.name.toString()`正常,而第二个`item.price.toInt()`报错。错误信息提示“Unresolved reference”,指出`toInt()`方法不存在或者接收类型不匹配。 首先,我需要确认用户的代码环境。根据错误信息中的`[plugin:uni:app-uts]`,用户可能是在使用UniApp的UTS(Unified TypeScript)进行开发。UTS是UniApp推出的跨平台开发语言,基于TypeScript,但可能有一些特定的语法或限制,尤其是在处理数据类型和方法时。 接下来,析错误原因。用户的代码中,`item.price`可能已经是数值类型(比如number),而数值类型在JavaScript/TypeScript中并没有`toInt()`方法。JavaScript中的Number类型有`toString()`方法,但转换整数通常使用`Math.floor()`、`parseInt()`或者直接使用位操作符如`|0`。用户可能误以为存在`toInt()`方法,导致调用错误。 然后,检查用户的代码。第一个转换`item.name.toString()`是正确的,因为`name`是字符串,调用`toString()`是多余的,但不会报错。第二个转换`item.price.toInt()`的问题在于,`price`是数字类型,而数字类型没有`toInt()`方法。正确的做法应该是直接取整,或者转换为整数,比如使用`Math.floor(item.price)`或者`parseInt(item.price)`,但需要注意如果价格已经是整数,可能不需要转换。 另外,考虑到UTS可能对类型检查更严格,特别是在严格模式下,必须确保所有类型转换都是显式的和正确的。用户可能需要在UTS环境中使用特定的方法或语法来处理数字转换,比如使用`Number.toInt()`或者类似的内置函数。 然后,我需要验证这些假设。查阅UTS的文档,确认数字类型可用的方法。如果UTS类似于TypeScript,那么Number类型确实没有`toInt()`方法。正确的转换方式应该是使用`Math.trunc()`、`Math.floor()`或`parseInt()`。例如,`item.price | 0`也可以快速取整。 另外,检查错误信息中提到的Kotlin方法,比如`String.toInt()`,这说明UTS可能在某些情况下将代码编译到Kotlin(比如Android平台),因此当用户尝试在数字类型上调用`toInt()`时,编译器找不到对应的方法,因为Kotlin的`toInt()`是String的方法,而数字类型没有这个方法。因此,用户需要将数字转换为字符串再调用`toInt()`,但这显然不符合逻辑,因为价格已经是数值,应该直接处理数值类型。 综合以上析,用户的问题在于误用了`toInt()`方法,正确的做法是直接使用数值本身,或者进行取整操作,或者转换为整数类型。需要建议用户修改`toInt()`为正确的转换方式,并解释为何会发生这个错误,以及如何避免类似问题。 最后,给出修改后的代码示例,并说明每种方法的适用场景,比如是否需要保留小数,是否需要取整等。同时,提醒用户注意UTS环境下的类型检查严格性,确保所有类型转换正确,以避免类似的编译错误。</think>以下是步解答: --- ### **错误析** ```typescript let newArrs2 = arrs3.map(item => item.price.toInt()); // 报错 ``` 错误原因:JavaScript/TypeScript **数字类型(Number)没有 `toInt()` 方法**。此方法仅在字符串类型(String)中存在,用于将字符串解析为整数(例如 `"123".toInt()`)。 --- ### **修复方案** #### 方案一:直接返回数值(无需转换) 如果 `price` 本身就是整数: ```typescript let newArrs2 = arrs3.map(item => item.price); // ✅ 直接获取数值 // 输出:[6999, 9888, 4999] ``` #### 方案二:强制转换为整数 如果 `price` 可能含小数且需要取整: ```typescript let newArrs2 = arrs3.map(item => Math.floor(item.price)); // ✅ 向下取整 // 或 let newArrs2 = arrs3.map(item => ~~item.price); // ✅ 按位取反快速取整 ``` #### 方案三:字符串转整数(若原始数据是字符串) 如果 `price` 实际存储为字符串(例如 `"6999"`): ```typescript let newArrs2 = arrs3.map(item => parseInt(item.price)); // ✅ 字符串转整数 ``` --- ### **错误对比表** | 错误代码 | 正确代码 | 差异说明 | |---------|---------|----------| | `item.price.toInt()` | `Math.floor(item.price)` | Number类型没有`toInt()`方法 | | `item.price.toInt()` | `parseInt(item.price)` | 仅适用于字符串类型 | --- ### **完整修复代码** ```typescript let arrs3 = [ { name: "华为", price: 6999 }, { name: "苹果", price: 9888 }, { name: "小米", price: 4999 } ]; // 正确获取名称(原代码冗余的toString()可优化) let newArrs = arrs3.map(item => item.name); // ✅ 直接获取字符串 console.log(newArrs); // ["华为", "苹果", "小米"] // 正确获取价格(假设需要整数) let newArrs2 = arrs3.map(item => item.price); // ✅ 直接获取数值 // 或 let newArrs2 = arrs3.map(item => Math.floor(item.price)); // ✅ 显式取整 console.log(newArrs2); // [6999, 9888, 4999] ``` --- ### **关键知识点** 1. **类型方法差异**: - `String` 类型有 `.toString()`(冗余,因为本身就是字符串)和 `.toInt()` - `Number` 类型只有 `.toString()`,没有 `.toInt()` 2. **数值取整方法**: - `Math.floor()`:向下取整 - `Math.ceil()`:向上取整 - `Math.round()`:四舍五入 - `parseInt()`:字符串转整数 --- ### **UNI-UTS 特别说明** 在 UniApp UTS 开发环境下,需特别注意: 1. **类型严格性**:UTS 对类型检查比标准 TypeScript 更严格 2. **跨平台编译**:部方法在不同平台(iOS/Android)的实现可能有差异 3. **推荐使用标准方法**:优先使用 `Math` 系列函数进行数值操作
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值