为何CODECHEF中输出一致的两段代码提交结果不同?
问题:CODECHEF ZOOZ题两段代码输出一致却一个AC一个WA的原因
问题背景
我在CODECHEF的ZOOZ题目中提交了两段代码,肉眼看两段代码对测试用例的输出结果一致,但CODE 1提交成功,CODE 2却提交失败,想搞清楚其中的原因。
CODE 1(提交成功)
int t = in.nextInt(); while((t--)>0){ int n = in.nextInt(); for(int j=0;j<n;j++){ if(j==0 || j==n-1) System.out.print("1"); else System.out.print("0"); } System.out.print("\n"); }
CODE 2(提交失败)
int t = in.nextInt(); while((t--)>0){ int n = in.nextInt(); System.out.println((int)Math.pow(10,n-1)+1); }
样例测试用例
2 4 3
样例输出
1001 101
失败原因分析
CODE 2的问题出在数值溢出和浮点数精度上:
- int类型溢出:int的取值范围是
-2^31到2^31-1(即-2147483648到2147483647)。当n≥10时,Math.pow(10,n-1)的结果是109及以上,n=11时,1010=10000000000远超过int最大值,强制转int会直接溢出,得到错误的负数或乱码值。 - 浮点数精度丢失:
Math.pow返回double类型,double只能精确表示253以内的整数。当n-1≥17时,10(n-1)会超过2^53,此时double无法精确存储这个整数,转int时会得到错误数值。
而CODE 1直接通过字符串拼接输出结果,完全避开了数值类型的限制和精度问题,无论n在题目允许的范围内多大,都能正确输出符合要求的字符串。
内容的提问来源于stack exchange,提问作者varsha Sharma
相关产品推荐
相关产品推荐

