题目信息
作者: 姚军
单位: 重庆大学
时间限制: 400 ms
内存限制: 64 MB
代码长度限制: 16 KB
两个数
输入两个数,倒着输出两个数的乘积。
输入格式:
两个数
输出格式:
一个数
输入样例1:
5 7
输出样例1:
53
输入样例2:
3 1.4
输出样例2:
2.4
输入样例3:
8 5
输出样例3:
4
思路分析
这是对于常见的整数反转问题的一个变形,求的是对于两个数的乘积(可能是整数也可能是浮点数)的反转。对于浮点数的反转,要考虑两个问题,一个是浮点数的表示,另一个是小数点的位置。我们知道,计算机中以二进制存储数据,对十进制的浮点数只能近似地表示,因此可能出现下面的情况。所以需要在程序中对浮点数四舍五入以保持位数。
对第二个问题,计算结果的小数点的位置可能在前面,比如0.20
,也可能在后面,如2.00
(保留2小数),将其作为字符串反转过后就变成02.0
和00.2
,前者需要删除.0
,后者需删除00.
。解决这两个问题之后,就可以得到基本的解决框架了。
算法实现
java
package Main;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
import java.util.zip.InflaterInputStream;
import javax.xml.ws.AsyncHandler;
import java.awt.Frame;
import java.io.*;
import java.lang.StringBuffer;
import java.text.DecimalFormat;
public class Main {
public static void main(String[] argc) throws IOException
{
int flag=0;
BufferedReader br =new BufferedReader(new InputStreamReader(System.in));
String arrStr=br.readLine();
String[] arrSplit=arrStr.split(" ");
double First=Double.parseDouble(arrSplit[0]);
double Second=Double.parseDouble(arrSplit[1]);
double result=First*Second;
// double result=Double.parseDouble(arrStr); //读取输入的数字
DecimalFormat df = new DecimalFormat("0.000000");
String result_str=df.format(result);
//如果有小数点,原始字符串从后往前删除0
for (int j=result_str.length()-1;result_str.charAt(j)=='0';j--)
result_str=result_str.substring(0, j) + result_str.substring(j, result_str.length()-1);
//如果结尾是'.'则删除
if (result_str.charAt(result_str.length()-1)=='.')
{
result_str=result_str.substring(0, result_str.length()-1);
}
String new_str=new StringBuffer(result_str).reverse().toString();
for (int i=new_str.length()-1;i>0;i--)
{//判断是否有小数点
if (new_str.charAt(i)=='.')
{
flag=1;
break;
}
}
//反转字符串从前往后删除0
while(new_str.charAt(0)=='0' && new_str.length()>0)
new_str=new_str.substring(1, new_str.length());
if (new_str.charAt(new_str.length()-1)=='0'
&& new_str.charAt(new_str.length()-2)=='.' )
{
new_str=new_str.substring(0,new_str.length()-2);
}
System.out.print(new_str);
}
}