PTA-1086 就不告诉你

本文介绍了一种通过编程实现对两个正整数乘积进行倒序输出的方法,使用C++语言,提供了两种解决方案:一种是通过数组存储和处理每一位数字,另一种是直接将乘积转换为字符串并反转。

做作业的时候,邻座的小盆友问你:“五乘以七等于多少?”你应该不失礼貌地围笑着告诉他:“五十三。”本题就要求你,对任何一对给定的正整数,倒着输出它们的乘积。

53.jpg

输入格式:

输入在第一行给出两个不超过 1000 的正整数 A 和 B,其间以空格分隔。

输出格式:

在一行中倒着输出 A 和 B 的乘积。

输入样例:

5 7

输出样例:

53

注意:末尾是零时反转不算

答案代码一:

#include<iostream>
#include<string>
using namespace std;
int main()
{
	int a,b;
	cin>>a>>b;
	int sum=a*b;
	int su[10]={0};
	int count=0;
	while(sum>0)
	{
		su[count++]=sum%10;
		sum/=10;
	}
	int sign=0;
	if(a*b==0)
		cout<<"0";
	else{
		for(int i=0;i<count;i++)
		{
			if(su[i]!=0)
			{
				sign=1;
			}
			if(sign)
				cout<<su[i];
		}
	}
	return 0;
 } 

 类型二:反转字符串

#include<algorithm>
using namespace std;
int main()
{
    string a=to_string(num);
    reverse(a.begin(),a.end());    
}

 

<think>嗯,用户问的是关于PTA平台上“1086告诉你”这道题的正确解法,以及为什么用乘法后逐个取余输出会半对半错,甚至在他们的IDE里无法通过。首先,我需要仔细分析问题所在。 首先,这道题的描述可能类似于:给定两个数相乘后的结果,要求逆序输出结果,但忽略前导零。例如,输入35,乘积是15,逆序后是51。但如果乘积是100,逆序后应该是1而是001。这可能就是用户遇到的问题,因为他们的解法可能没有正确处理末尾的零,导致输出错误。 用户提到他们用乘法算出结果后,逐个取余输出,但结果部分正确。这可能是因为他们在处理逆序时,没有考虑到结果中的前导零。例如,当乘积是100时,直接逆序输出会得到001,而正确结果应该是1。因此,需要将结果转换为字符串,去掉前导零后再逆序,或者将数值转换为整数后再处理。 另外,用户提到在他们的IDE中无法通过,可能是在某些测试用例下出现了问题。例如,当乘积为0时,逆序后应该还是0,但按照逐个取余的方法可能会输出多个零。或者,当乘积本身包含中间的零时,处理方式是否正确。 接下来,我需要参考用户提供的引用内容。引用[2]提到用户使用了乘法后逐个取余输出,但结果半对半错。这可能是因为用户直接将数字按位拆分,而没有处理逆序后的前导零。正确的做法应该是将乘积转换为字符串,逆序后再转换为整数,这样可以自动去除前导零。 例如,对于3*5=15,转换为字符串"15",逆序为"51",再转换为整数51。对于10*10=100,转换为字符串"100",逆序为"001",转换为整数1。这样就可以避免前导零的问题。 用户可能在代码中直接对数字进行取余除法操作,逐个取出每一位数字并存储到数组或列表中,然后按逆序输出。但这种方法在处理末尾零时会出错,因为末尾零在逆序后变成前导零,需要被忽略。例如,100的各位是1,0,0,逆序后输出0,0,1,但正确结果应为1。因此,必须将这些数字转换为整数或字符串处理。 此外,还需要考虑乘积为0的情况。如果两个数相乘为0,逆序后仍应为0,而是没有输出。例如,0乘以任何数都是0,逆序后还是0。 因此,正确的解决步骤应该是: 1. 计算两个数的乘积。 2. 将乘积转换为字符串。 3. 逆序字符串。 4. 将逆序后的字符串转换为整数,去除前导零。 5. 输出结果。 例如,Python中的实现可能是: a, b = map(int, input().split()) product = a * b reversed_str = str(product)[::-1] result = int(reversed_str) print(result) 这样就能正确处理所有情况,包括前导零的问题。用户原来的方法可能没有将逆序后的数字转换回整数,导致输出带有前导零的字符串,从而在PTA平台上被判错误。 另外,需要注意输入两个数可能是0的情况,以及乘积为0的情况。例如,当输入是00时,乘积是0,逆序后还是0,输出应为0。 用户可能在代码中直接处理每一位数字,例如: product = a * b digits = [] while product > 0: digits.append(product % 10) product = product // 10 for d in digits: print(d, end='') 但这样在product为0时,循环会执行,导致没有输出。正确的处理应该是在product为0时直接输出0。或者,将乘积转换为字符串逆序处理,可以避免这个问题。 总结来说,用户的问题出在没有正确处理前导零乘积为0的情况。正确的解法是将乘积转换为字符串,逆序后再转为整数,或者直接处理字符串去除前导零,然后输出。</think>### PTA题目"1086告诉你"的正确解法 根据题目要求,当两个数相乘后需要将结果逆序输出,但需注意去除前导零。以下是关键分析步骤: 1. **核心问题** - 若直接对乘积逐位取余逆序输出,例如$100 \rightarrow 001$,会导致前导零未被去除[^2]。 - 正确方法:将乘积转为字符串逆序后,再转为整数去除前导零。例如: $$100 \xrightarrow{\text{字符串逆序}} "001" \xrightarrow{\text{转整数}} 1$$ 2. **代码实现** ```python a, b = map(int, input().split()) product = a * b reversed_str = str(product)[::-1].lstrip('0') # 去除前导零 print(reversed_str if reversed_str else '0') # 处理乘积为0的情况 ``` 3. **常见错误** - 未处理乘积为0的情况(如输入`0 5`时,逆序应为`0`)。 - 逐位取余存储数字时未处理逆序后的前导零[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值