我遇到了一个问题“如何将数字反转为整数而不是字符串?”有谁可以帮我找到答案?逆转应该反转数字的十进制数字,即使用数字10。
答案 0 :(得分:42)
这样的东西?
public int ReverseInt(int num)
{
int result=0;
while (num>0)
{
result = result*10 + num%10;
num /= 10;
}
return result;
}
作为一个hackish one-liner(更新:使用Benjamin的评论来缩短它):
num.ToString().Reverse().Aggregate(0, (b, x) => 10 * b + x - '0');
更快的一分四分之一班轮:
public static int ReverseOneLiner(int num)
{
for (int result=0;; result = result * 10 + num % 10, num /= 10) if(num==0) return result;
return 42;
}
这不是一个单行,因为我必须包含return 42;
。 C#编译器不允许我编译,因为它认为没有代码路径返回值。
P.S。如果您编写这样的代码并且同事抓住它,您应该得到他/她对您所做的一切。请注意!
编辑:我想知道LINQ单线程的速度有多慢,所以我使用了以下基准代码:
public static void Bench(Func<int,int> myFunc, int repeat)
{
var R = new System.Random();
var sw = System.Diagnostics.Stopwatch.StartNew();
for (int i = 0; i < repeat; i++)
{
var ignore = myFunc(R.Next());
}
sw.Stop();
Console.WriteLine("Operation took {0}ms", sw.ElapsedMilliseconds);
}
结果(在int32范围内有10 ^ 6个随机数):
While loop version:
Operation took 279ms
Linq aggregate:
Operation took 984ms
答案 1 :(得分:27)
这应该这样做:
int n = 12345;
int left = n;
int rev = 0;
while(left>0)
{
r = left % 10;
rev = rev * 10 + r;
left = left / 10; //left = Math.floor(left / 10);
}
Console.WriteLine(rev);
答案 2 :(得分:4)
乘以-1?确切地说你的问题...
答案 3 :(得分:4)
耶!一种金光闪闪的方式。 (不,真的。我希望这更像是“我该怎么做......”的问题,而不是你真正需要的东西)
public int Reverse(int number) {
return int.Parse(number.ToString().Reverse().Aggregate("", (s,c) => s+c));
}
答案 4 :(得分:4)
using System;
public class DoWhileDemo {
public static void Main() {
int num;
int nextdigit;
num = 198;
Console.WriteLine("Number: " + num);
Console.Write("Number in reverse order: ");
do {
nextdigit = num % 10;
Console.Write(nextdigit);
num = num / 10;
} while(num > 0);
Console.WriteLine();
}
}
答案 5 :(得分:3)
检查以下简单易行 -
public int reverseNumber(int Number)
{
int ReverseNumber = 0;
while(Number > 0)
{
ReverseNumber = (ReverseNumber * 10) + (Number % 10);
Number = Number / 10;
}
return ReverseNumber;
}
答案 6 :(得分:2)
你做不到。由于计算机在任何情况下均以十六进制表示,因此您需要将数字标记为阿拉伯语格式,这在语义上与转换为字符串相同。
答案 7 :(得分:1)
我查看了以下解决方案。但是当n是负数时怎么样?
让我们说n = -123456
这是我添加到它处理负数的一个调整,假设它会以同样的方式威胁负面麻木。
int reverse = 0;
bool isNegative = false;
if (n < 0)
isNegative = true;
n = Math.Abs(n);
while (n > 0)
{
int rem = n % 10;
reverse = (reverse * 10) + rem;
n = n / 10;
}
if (isNegative)
reverse = reverse * (-1);
return reverse;
答案 8 :(得分:1)
旧线程,但我没有看到这种变化:
int rev(int n) {
string str = new String(n.ToString().Reverse().ToArray());
return int.Parse(str);
}
答案 9 :(得分:1)
/// <summary>
/// Reverse a int using its sting representation.
/// </summary>
private int ReverseNumber(int value)
{
string textValue = value.ToString().TrimStart('-');
char[] valueChars = textValue.ToCharArray();
Array.Reverse(valueChars);
string reversedValue = new string(valueChars);
int reversedInt = int.Parse(reversedValue);
if (value < 0)
reversedInt *= -1;
return reversedInt;
}
答案 10 :(得分:0)
最短的解决方案:
int reverse=0;
int number = 21;
while (number > 0)
{
reverse = number % 10;
Console.Write(reverse);
number = number / 10;
}
答案 11 :(得分:0)
根据 Pritam Karmakar 评论, 是的,当给定的数字结尾为0时,这将不起作用。 如果您将数字传递为150,它将返回51而不是051。 所以我根据用户输入编写代码以反向顺序显示数字,请检查一下。
int reverseNum = 0, reminder, num;
Console.WriteLine("Enter Number to Reverse:");
int.TryParse(Console.ReadLine(), out num);
bool isZero = false;
int cnt=0;
while (num > 0)
{
reminder = num % 10;
reverseNum = (reverseNum * 10) + reminder;
num = num / 10;
if (reverseNum == 0)
isZero = true;
cnt++;
}
if (isZero)
{
Console.WriteLine(reverseNum.ToString().PadLeft(cnt, '0'));
}
else
{
Console.WriteLine(reverseNum);
}
Console.ReadKey();
答案 12 :(得分:0)
public static void Main(string[] args)
{
int reversed = Reverse(-7360);
}
public static int Reverse(int number, int left = 0, int right = 0)
{
if (number == 0) return left + right;
return Reverse(number / 10, left * 10 + right * 10, number % 10);
}
答案 13 :(得分:0)
static void Main(string[] args)
{
Console.WriteLine("Please enter number");
int number = Convert.ToInt32(Console.ReadLine());
Console.WriteLine(ReverseLoop(number));
Console.WriteLine(ReverseRecursive(number));
Console.ReadLine();
}
public static int ReverseRecursive(int number)
{
int remainder = number % 10;
number = number / 10;
if (number < 1)
return remainder;
return ReverseRecursive(number) + remainder * Convert.ToInt32(Math.Pow(10, number.ToString().Length));
}
public static int ReverseLoop(int number)
{
int reversed = 0;
while (number > 0)
{
reversed = reversed * 10 + (number % 10);
number = number / 10;
}
return reversed;
}
答案 14 :(得分:0)
由 @jerjer 和 @cfern 建议的解决方案是完美的,但不适用于负整数编号(如 -1234507 < / strong>。
解决方案:如果数字为负int,则在调用方法ReverseInt(-1234507)之后乘以-1。
int number = -1234507;
**number = number > 0 ? number : (number * -1);**
int reverseNumber = 0;
while(number > 0){
reverseNumber = (reverseNumber * 10) + (number % 10) ;
number = number / 10;
}
Console.WriteLine(reverseNumber);
答案 15 :(得分:0)
您可以执行以下操作。
Convert.ToInt32(new string(num.ToString().Reverse().ToArray()));
答案 16 :(得分:-1)
int x = 9876543;
char[] arr = x.ToString().ToCharArray();
Array.Reverse(arr);
Console.WriteLine(int.Parse(new string(arr)));
答案 17 :(得分:-1)
int sum = 0; int remainder = 0;
int n = 123;
for (int i = n; i > 0; i = i / 10)
{
remainder = i % 10;
sum = (sum * 10) + remainder;
}
Console.WriteLine(sum);
Console.ReadLine();
答案 18 :(得分:-1)
一个新的:
using System;
using System.Linq;
public class Program
{
public static void Main()
{
int i = 234;
int j = -123;
Console.WriteLine(reverse(i));
Console.WriteLine(reverse(j));
}
static int reverse(int i)
{
int sign = i / Math.Abs(i);
var abs = string.Concat(Math.Abs(i).ToString().Reverse());
return int.Parse(abs) * sign;
}
}