SPOJ ADDREV 问题
我看过关于这个 SPOJ 问题的其他讨论,特别是 ADDREV(反转数字相加),但是很遗憾,我写的三种程序(用C、Python和Java)都没有得到正确的答案。我把这三种语言的代码片段都附上了。
Python:
def find_rev(a):
d=0
while(a>=1):
d=d*10+a%10
a=a/10
return d
n=input('enter a number')
for i in range(int(n)):
num1=input('enter the first number')
num2=input('enter the second number')
num=0
num1=find_rev(int(num1))
num2=find_rev(int(num2))
num=num1+num2
num=find_rev(num)
print num
用Python时,我遇到了运行时错误。
用C时,我得到了错误的答案。
#include<stdio.h>
long rev(long);
int main()
{
long int n;
long int n1;
long int n2;
long int i=0;
scanf("%ld",&n);
//printf("%d",n);
for (i=0;i<n;i++)
{
//printf("\n%d",i);
//printf("\nenter the two numbers");
scanf("%ld%ld",&n1,&n2);
n = rev(rev(n1)+rev(n2));
printf("%ld\n",n);
}
return 0;
}
long rev(long a)
{
long d=0;
while(a>=1)
{
d = d*10+a%10;
a = a/10;
}
return d;
}
用Java时,我遇到了编译错误。
import java.util.*;
//import java.io.*;
public class spoj_prob {
public static void main(String args[])
{
long n=0;
System.out.println("enter a number \n");
Scanner in=new Scanner(System.in);
n=in.nextLong();
long n1=0;
long n2=0;
long sum=0;
for (int i=0; i<n; i++)
{
System.out.println("enter two numbers \n ");
n1=in.nextLong();
n2=in.nextLong();
n1=rev(n1);
n2=rev(n2);
System.out.println(n1);
System.out.println(n2);
sum=rev(n1+n2);
System.out.println(sum);
}
}
static long rev(long a)
{
long d=0;
while (a>=1)
{
d=d*10+a%10;
a=a/10;
}
return d;
}
}
}
当然,这些错误都是SPOJ评测系统报告的。在我的电脑上,这些程序运行得很好。我使用的测试案例是:
2
999999999 11
999 11
答案
101
101
还有
3
34 54
123 091
00034 00054
更新: 大家,我在C语言中找到了答案。谢谢大家的帮助。
3 个回答
0
试试这个在Python 3中的解决方案:
import sys
t = int(input())
i=0
while i<t:
a,b = map(int,sys.stdin.readline().split()) #to take both inputs in single line
c=str(a) #converting the number into string
d=str(b)
e=int(c[::-1]) #converting reverse of the string c to int
f=int(d[::-1]) #converting reverse of the string d to int
s=e+f #adding the two reverse numbers
s1=str(s)
s2=int(s1[::-1]) #reverse s and display it
print(s2)
i+=1
1
- 在Python中,我觉得你遇到运行时错误是因为你调用了一个受限制的函数input,其他的我想不起来了。
- 在C语言中,你遇到的是答案错误,因为输入的整数可能非常大,导致了溢出。
- 对于JAVA,你可能会遇到两个问题。一个是你使用的Scanner类可能不被SPOJ支持(可能是出于安全或其他原因)。第二个是你的类名需要是Main,我想是这样。请在SPOJ论坛上搜索更多详细信息。
1
在你开始使用任何服务之前,先看看它的常见问题解答(FAQ)通常是个好主意。这里面会解释程序应该如何接收数据。
特别要注意的是,如果你在控制台上打印像enter a number
这样的提示信息或者其他多余的内容,程序就会总是出错。因为一个正确的程序应该输出类似于
34
1998
1
而你的程序可能输出的是
enter a number
enter two numbers
34
enter two numbers
1998
enter two numbers
1
不过我不太清楚为什么Java会编译失败。你可能需要找一些关于如何用Java提交代码的资料,看看参考解决方案。
另外,题目定义中没有对输入数字的大小进行限制,所以这些数字可能会超出Java和C++中标准整数类型的范围。