[英]Number Reversal in c++
當我向該函數傳遞一個大於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;
}
您應該避免使用pow
它會返回一個double
,而你只想要操作的整數。 例如,假設arr[j] * pow(10,i)
為753.99 ...,則強制轉換只會將753放入rev_num
! 在某些情況下,這將起作用,但並非總是如此。 這是工作的機會五十。
嘗試更換:
rev_num += arr[j] * pow(10,i);
至
rev_num = rev_num * 10 + arr[j];
您是否嘗試過四舍五入或添加.5? 這樣還能解決您的問題嗎?
下面的簡單代碼怎么樣
int reverseNumber(int num) {
int reverse = 0;
while(num > 0) {
reverse = reverse*10 + num%10;
num = num/10;
}
return reverse;
}
由於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;
}
這里顯示的函數的所有代碼示例均無效,因為該函數未處理有效的整數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!");
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.