我的程序需要帮助。这个概念是接受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/) 非常感谢你!
答案 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.它现在正确地反转了两位数。它将以这种方式继续扭转剩下的数字。
无需计算原始数字中的位数。当n1
和rev1
均为零时,您已撤消了整个数字。
答案 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”是关键字。
#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));
这个电话正在按照字面意思完成任务。您正在反转两个反转数字之和的结果。