SPOJ ADDREV 问题

3 投票
3 回答
1438 浏览
提问于 2025-04-16 03:49

我看过关于这个 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++中标准整数类型的范围。

撰写回答