为什么这个代码显示测试用例错误



问题Monocarp在白板上写下两个数字。这两个数字都遵循特定的格式:一个正整数x,末尾附加p零。

现在Monocarp让你比较一下这两个数字。你能帮他吗?

输入
第一行包含一个整数t
(1≤t≤104(——测试用例数。

每个测试用例的第一行包含两个整数x1<1>p1(1≤>x1≤106;0≤>p1(——第一个数字的描述。

每个测试用例的第二行包含两个整数x2>p2(1≤>x2≤106;0≤p2(——第二个数字的描述。

输出
对于每个测试用例,打印给定两个数字的比较结果。如果第一个数字小于第二个数字,则打印<。如果第一个数字大于第二个数字,则打印>。如果相等,则打印=

我的代码

import java.util.*;
public class A_1613_LongComparison_Contest
{
public static void main(String args[])
{
Scanner sc=new Scanner(System.in);
System.out.println("");
int n=sc.nextInt();
int i=0, ans1=0, ans2=0, j=0, pow=0;
for(i=1;i<=n;i++)
{
for(j=1;j<3;j++)
{
System.out.print("");
int x=sc.nextInt();
System.out.println("");
int p=sc.nextInt();
if(j==1)
{
pow=(int)(Math.pow(10,p));
ans1=x*pow;
}
else
{
pow=(int)(Math.pow(10,p));
ans2=x*pow;
}
}
if(ans1>ans2)
System.out.println(">");
else if(ans1==ans2)
System.out.println("=");
else
System.out.println("<");
}
}
}

这个问题取自代码部队竞赛。这是我的第一个问题,很抱歉把它全部粘贴了问题链接https://codeforces.com/contest/1613/problem/A在我看不到的测试用例中显示错误,请帮助我找到问题谢谢

int溢出

示例输入:

1
1 12
1000000 6

预期输出:

=

程序的实际输出:

>

为什么

对于第一个数字,Math.pow(10, 12)正确地产生1000 000 000 000.0作为Javadouble。这对于int来说太大了,所以当您强制转换它时,它会被强制转换为2 147 483 647,这是最大可能的int值。因此CCD_ 8变为2 147 483 647。人们本以为会报告一个错误,但事实并非如此。

对于第二个数字,pow()不仅正确地返回了1000 000.0,而且该数字还被转换为具有相同值的int,即1000 000。但随后,multiplcation会导致溢出,而不是1000 000 000 000 000,您得到的是:727 379 968。没错,一个负数。

那么这些数字相等吗?一点也不。CCD_ 11较大。因此打印>

有什么解决方案吗

立即的解决方案是使用BigInteger而不是int进行数学运算。我不知道你是否受到了性能限制,导致这对你的挑战无效。如果是这样,你将不得不想出一个更聪明的解决方案。这是挑战的一部分,所以我不会把它从你身上夺走。我至少能想出一个聪明的选择(我知道是调侃(。

long的范围也不够大。它们上升到9.22*1018。您需要1*10100006。因此,下一个自然的步骤是学习使用BigInteger。语法大不相同,但数学概念应该仍然熟悉。

相关内容

最新更新