当我传递奇数位数时> 1到函数,我得到的实际结果比我应该得到的少1,并且代码对于偶数位数完全正常,我无法找出原因。
int rev_number(int num){
int arr [10];
int i=0;
int j=0;
int rev_num=0;
while(num > 0){
arr[i] = num%10;
num = num/10;
i++;
}
i--;
while(i>=0){
rev_num += arr[j] * pow(10,i);
j++;
i--;
}
return rev_num;
}
答案 0 :(得分:3)
在您只想操纵整数时,应避免使用返回pow
的{{1}}。例如,假设double
的结果是753.99 ......,演员只会在arr[j] * pow(10,i)
中放入753!在某些情况下,这将起作用,但并非总是如此。这是五十五个工作的机会。
尝试更换:
rev_num
到
rev_num += arr[j] * pow(10,i);
您是否尝试过圆形或添加.5?这也能解决你的问题吗?
答案 1 :(得分:3)
以下简单代码怎么样
int reverseNumber(int num) {
int reverse = 0;
while(num > 0) {
reverse = reverse*10 + num%10;
num = num/10;
}
return reverse;
}
答案 2 :(得分:1)
由于pow
处理浮点值,因此它的整数表示可能会被截断,因此某些值可能最终低于预期值。
更好的解决方案是使用整数数学,例如:
while(i>=0){
rev_num *= 10;
rev_num += arr[j];
j++;
i--;
}
还有其他几种方法可以表达相同的内容,并且将值存储在数组中并不是绝对必要的,您可以将模数值重新乘以。
但是,我最喜欢的“反向数字”是将其作为字符串读取,然后使用标准反向功能。
所以,像这样:
#include <string>
#include <algorithm>
#include <iostream>
int main()
{
std::string s;
std::cin >> s;
std::reverse(s.begin(), s.end());
std::cout << s << std::endl;
}
答案 3 :(得分:-1)
这里显示的函数的所有代码示例都是无效的,因为函数不处理有效的整数0.所以我决定显示一个正确的函数实现。:)
using System;
namespace ReverseNumberExercise
{
class Program
{
static int ReverseNumber(int x)
{
int y = 0;
do
{
long digit;
x = ( int )Math.DivRem( x, 10L, out digit );
y = y * 10 + ( int )digit;
} while ( x != 0 );
return (y);
}
static void Main()
{
while (true)
{
Console.Write("Enter an integral number: ");
string input = Console.ReadLine();
if (string.IsNullOrEmpty(input)) break;
int x;
if (!int.TryParse(input, out x))
{
Console.WriteLine("Invalid number. Try again.");
}
Console.WriteLine("Reversed number is: {0}", ReverseNumber(x));
Console.WriteLine();
}
Console.WriteLine("\nGood bye!");
}
}
}