添加反转数字然后反转总和

时间:2015-06-24 17:50:40

标签: c++ math

我的程序需要帮助。这个概念是接受2个整数,加上它们的反转值,然后反转总和。我已经尝试过调试我的代码,但我仍然无法看到它的错误。这是代码:

    #include <iostream>
    #include <math.h>
    using namespace std;

    int main()
    {
        int t, n1, n2;
        cin >> t;

        while(t--)
        {
            int n_digs1=1, n_digs2=1, res1=0, res2=0, f1=0, f2=0;
            cin >> n1 >> n2;
            for(int i=1;i<=9;i++)
            {
                if((int)(n1/pow(10,i)) != 0)
                    n_digs1++;
                else
                    f1=1;
                if((int) (n2/pow(10,i)) != 0)
                    n_digs2++;
                else
                    f2=1;
                if(f1==1 && f2==1){
                    //cout << n_digs1 << n_digs2 << endl;
                    break;}
            }
            int rev1, rev2;
            for(int i=n_digs1-1;i>=0;i--)
            {
                rev1 = n1%10;
                n1/=10;
                res1 = res1 + rev1*pow(10,i);
            }
            for(int i=n_digs2-1;i>=0;i--)
            {
                rev2 = n2%10;
                n2/=10;
                res2 = res2 + rev2*pow(10,i);
            }
            int n3 = res1+res2, n_digs3=1, rev3, res3=0;
            for(int i=1;i<=9;i++)
            {
                if((int)(n3/pow(10,i)) != 0)
                    n_digs3++;
                else
                    break;
            }

            for(int i=n_digs3-1;i>=0;i--)
            {
                rev3 = n3%10;
                n3/=10;
                res3 = res3 + rev3*pow(10,i);
            }
            cout << res3 << endl;
        }
        return 0;
    }

我试图解决的问题是基于SPOJ。(http://www.spoj.com/problems/ADDREV/) 非常感谢你!

4 个答案:

答案 0 :(得分:0)

正如评论中所建议的那样,你应该编写一个函数来反转这个数字,因为你必须这样做三次。

当您构建反转的数字时,您将错误的部分乘以并乘以错误的数量。

前两行正确提取最低位:

rev1 = n1%10;
n1/=10;

因此,如果n1在1234开始,则现在为123,rev1保持值为4.

构建反转值应如下所示:

res1 = (res1 * 10) + rev1;

您根本不需要包含pow,因为后续迭代会扩展其中的内容。要继续该示例,res1现在将为4.在下一次迭代中,n1将减少为12,rev1将为3.最后一行将执行此操作:

res1 = (4 * 10) + 3;

结果为43.它现在正确地反转了两位数。它将以这种方式继续扭转剩下的数字。

无需计算原始数字中的位数。当n1rev1均为零时,您已撤消了整个数字。

答案 1 :(得分:0)

反转整数的单独函数会使问题更简单

#include <iostream>
#include <sstream>
using namespace std;    

int reverse(int a)
{
    stringstream sstream;
    while (a != 0)
    {
        int temp = a % 10;
        a /= 10;

        sstream << temp;
    }
    int r;
    sstream >> r;

    return r;
}
int main()
{
    int a, b;
    cin >> a >> b; //a = 12, b = 34

    int ra = reverse(a);
    int rb = reverse(b);

    int sum = ra + rb;

    int rsum = reverse(sum);

    cout << rsum << endl; //46

    return 0;
}

答案 2 :(得分:0)

在C ++中,“reuse”是关键字。

  1. 重用现有功能。
  2. 重复使用自己的功能。
  3. #include <iostream>
    #include <string>
    #include <algorithm>
    
    int reverse_fast(int val) {
        int result = 0;
        while (val) {
            result = result * 10 + val % 10;
            val = val / 10;
        }
        return result;
    }
    
    int reverse(int val) {
        std::string s = std::to_string(val);
        reverse(s.begin(), s.end());
        return std::stoi(s);
    }
    
    int main()
    {
        int t, n1, n2;
        std::cin >> t;
    
        while (t--) {
            std::cin >> n1 >> n2;
            std::cout << reverse(reverse(n1) + reverse(n2));
        }
    }
    

答案 3 :(得分:0)

首先,您需要重新考虑如何撤消数字。

基本上,你想要做的是从0开始运行总计。

然后从数字中最右边的数字开始反转,你

1)取总数并乘以10.这将“运行总计”的数字“向左移动”1位,在单位中将“0”移动到总数中。

2)从您要反转的输入数字中检索最右边的数字,并将其添加到总数中。

3)将输入数字除以10并将结果存储回输入数字。如果结果为0,则停止,否则转到步骤1)。

就是这样。

例如,要反转数字123:

  

1)总计= 0.

     

2)总计=(总计x 10)+(last_digit_of_number)=(0 x 10)+ 3 = 3

     

3)将数字除以10(123/10),因此数字现在为12。

     

4)总计=(总计x 10)+(last_digit_of_number)=(3 x 10)+ 2 = 32

     

5)将数字除以10(12/10),因此数字现在为1

     

6)总计=(总计x 10)+(last_digit_of_number)=(32 x 10)+ 1 = 321

     

7)将数字除以10(1/10),因此数字现在为0.我们可以停止。

所以Total为321,因此数字已被颠倒

请看下面的代码:

unsigned long reverse_num(unsigned long num)
{
    unsigned long sum = 0;  // our running total
    while (num)    // keep going until our input is 0
    {
        sum = sum * 10 // multiply our running total by 10, so as to 
                       // shift it one place to the left
        +
                       // add on the following
        num % 10;      // to get the last digit of our input do a mod(10)

        num /= 10;     // divide by 10 to remove the last digit
    }
    return sum;  // return the result
}

所以现在要求你想要反转两个反转数字的输入。简单:

unsigned long input1, input2;
cin >> input1 >> input2;
cout << reverse_num(reverse_num(input1) + reverse_num(input2));

这个电话正在按照字面意思完成任务。您正在反转两个反转数字之和的结果。