循环数比较
题目描述
对于任意两个正整数x和k,我们定义repeat(x, k)为将x重复写k次形成的数,例如repeat(1234, 3) = 123412341234,repeat(20,2) = 2020.
牛牛现在给出4个整数x1, k1, x2, k2, 其中v1 = (x1, k1), v2 = (x2, k2),请你来比较v1和v2的大小。
输入描述:
输入包括一行,一行中有4个正整数x1, k1, x2, k2(1 ≤ x1,x2 ≤ 10^9, 1 ≤ k1,k2 ≤ 50),以空格分割
输出描述:
如果v1小于v2输出"Less",v1等于v2输出"Equal",v1大于v2输出"Greater".
示例1
输入
1010 3 101010 2
输出
Equal
上代码:
import java.util.*;
public class Main{
public static void main(String[] args)
{
Scanner sc=new Scanner(System.in);
int x1=sc.nextInt();
int k1=sc.nextInt();
int x2=sc.nextInt();
int k2=sc.nextInt();
int sb111=0,sb222=0;
if(k1==k2)
{
System.out.println(x1>x2?"Greater":(x1==x2?"Equal":"Less"));
}else
{
StringBuffer sb1=new StringBuffer();
StringBuffer sb2=new StringBuffer();
for(int i=0;i<k1;i++)
{
sb1.append(x1);
}
for(int i=0;i<k2;i++)
{
sb2.append(x2);
}
for(int i=0;i<sb1.length();i++)
{
sb111=sb1.charAt(i);
}
for(int i=0;i<sb2.length();i++)
{
sb222=sb2.charAt(i);
}
if(sb1.length()>sb2.length())
{
System.out.println("Greater");
}
else if(sb1.length()<sb2.length())
{
System.out.println("Less");
}
else
{
System.out.println(sb111>sb222?"Greater":(sb111==sb222?"Equal":"Less"));
}
}
}
}
说明如下:
- 本题目中最大的陷阱就是在多次运算之后,当我们把x重写k次之后,就不能直接用字符串转整型了{ long sb=Long.parseLong(sb1.toString());出现了转换越界的情况,当然int sb111=Integer.parseInt(sb1);就更不行了}
- 如果强制转化则会出现如下报错信息:
Exception in thread "main" java.lang.NumberFormatException: For input string: "3333333333333333333333333333333333"
at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:68)
at java.base/java.lang.Long.parseLong(Long.java:699)
at java.base/java.lang.Long.parseLong(Long.java:824)
at leetcode.Main5.main(Main5.java:28)
多方查找资料后才知道转化越界,所以就采用了如上代码所展示的内容。
注:
java.lang.String.charAt() 方法返回指定索引处的char值。索引范围是从0到length() - 1。对于数组索引,序列的第一个char值是在索引为0,索引1,依此类推。
3. 本题解法:
(1)输入数据;
(2)判断在k1是否等于k2,如果等于,则直接比较;
(3)如果不相等就将x1放到StringBuffer中,放k1次,同理操作x2;比较sb1和sb2。先判断长度,长度大的当然就大,否则比较sb111和sb222;
(4)sb111是取出sb1中的值转换成整型再比较。
完成 !!!