C# 如何将数字反转为整数而不是字符串?
我遇到了一个问题“一个人怎么能把一个数字反转成整数而不是字符串?”谁能帮我找到答案?反转应该反转数字的小数位数,即使用10为基数。类似这样的吗C# 如何将数字反转为整数而不是字符串?,c#,algorithm,C#,Algorithm,我遇到了一个问题“一个人怎么能把一个数字反转成整数而不是字符串?”谁能帮我找到答案?反转应该反转数字的小数位数,即使用10为基数。类似这样的吗 using System; public class DoWhileDemo { public static void Main() { int num; int nextdigit; num = 198; Console.WriteLine("Number: " + num); Co
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();
}
}
public int ReverseInt(int num)
{
int result=0;
while (num>0)
{
result = result*10 + num%10;
num /= 10;
}
return result;
}
作为一句粗俗的一句话(更新:用本杰明的评论来缩短它):
速度更快的四分之一班轮:
public static int ReverseOneLiner(int num)
{
for (int result=0;; result = result * 10 + num % 10, num /= 10) if(num==0) return result;
return 42;
}
它不是一行,因为我必须包含return42代码>。C#编译器不让我编译,因为它认为没有代码路径返回值
另外,如果你写了这样的代码,而一个同事抓住了它,那么他/她对你所做的一切都是你应得的。小心
编辑:我想知道LINQ one liner的速度有多慢,所以我使用了以下基准代码:
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);
}
乘以-1?请精确回答您的问题…这应该可以做到:
int n = 12345;
int left = n;
int rev = 0;
while(Convert.ToBoolean(left)) // instead of left>0 , to reverse signed numbers as well
{
int r = left % 10;
rev = rev * 10 + r;
left = left / 10; //left = Math.floor(left / 10);
}
Console.WriteLine(rev);
耶!一种华丽的方式。(不,真的。我希望这更多的是一个“我该怎么做…”的问题,而不是你在生产中真正需要的东西)
你不能。由于计算机在任何情况下都以十六进制进行思考,因此有必要将数字标记为阿拉伯语格式,这在语义上与转换为字符串相同。//
/// <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;
}
///使用int的sting表示法反转int。
///
私有整数反向枚举器(整数值)
{
字符串textValue=value.ToString().TrimStart('-');
char[]valueChars=textValue.ToCharArray();
数组。反向(valueChars);
string reversedValue=新字符串(valueChars);
int reversedInt=int.Parse(reversedValue);
如果(值<0)
反向T*=-1;
反向返回;
}
检查以下简单易懂的内容-
public int reverseNumber(int Number)
{
int ReverseNumber = 0;
while(Number > 0)
{
ReverseNumber = (ReverseNumber * 10) + (Number % 10);
Number = Number / 10;
}
return ReverseNumber;
}
参考:旧线程,但我没有看到这种变化:
int rev(int n) {
string str = new String(n.ToString().Reverse().ToArray());
return int.Parse(str);
}
我研究了以下解决方案。但是当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;
int reverse=0;
bool为阴性=假;
if(n<0)
isNegative=true;
n=数学Abs(n);
而(n>0)
{
int-rem=n%10;
反向=(反向*10)+rem;
n=n/10;
}
如果(为负)
反向=反向*(-1);
反向返回;
最短解决方案:
int reverse=0;
int number = 21;
while (number > 0)
{
reverse = number % 10;
Console.Write(reverse);
number = number / 10;
}
根据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();
static void Main(字符串[]args)
{
Console.WriteLine(“请输入号码”);
int number=Convert.ToInt32(Console.ReadLine());
控制台写入线(反向操作(编号));
Console.WriteLine(反向草书(数字));
Console.ReadLine();
}
公共静态整数反转草书(整数编号)
{
整数余数=数字%10;
数字=数字/10;
如果(数字<1)
返回剩余部分;
返回ReverseRecursive(number)+余数*Convert.ToInt32(Math.Pow(10,number.ToString().Length));
}
公共静态整数反向操作(整数编号)
{
int=0;
而(数量>0)
{
反向=反向*10+(数字%10);
数字=数字/10;
}
反向返回;
}
一个新的:
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;
}
}
由@jerjer和@cfern建议的解决方案是完美的,但它不适用于负整数,如-1234507
解决方案:如果数字为负整数,则在调用方法ReverseInt(-1234507)后乘以-1
你可以这样做
Convert.ToInt32(new string(num.ToString().Reverse().ToArray()));
如果你的意思是反转数字,那么你基本上是反转字符串-转换为字符串,反转,转换回…我认为它看起来更像Euler项目。问题4,确切地说:虽然一行程序效率很低。当然,这就是为什么我称它为hackish。更奇怪的是,ToCharArray()是多余的,您还可以从聚合中的select执行字符到整数的转换,从而节省水平空间。:)有关纯字符串版本,请参见下面的示例。@cfern如果数字为负数,您会错过一些检查。。。我大学时的老师会对这件事大惊小怪的-大便。如果在60秒内编写代码,就会发生这种情况。我想知道如何定义负数的倒数。Rev(-1234)=-4321?事实上,正如我在问题行中提到的……我在一个网站上遇到了这个问题,他们在那里发布了多个面试问题。所以我也对问题行感到困惑。非常感谢,但我认为当给定的数字末尾有0时,这将不起作用。就像40R一样,在while循环中,你在哪里声明了r?只是想一想,我知道它没有专门提到负数,但要支持反向负数,你必须勾选左边=while循环中的0,否则当条件为left>0时,它将不会进入。@jerjer取决于您想要什么。如果是您想要的数字,那么前导零将丢失,再次反转它显然也会丢失前导零。但是,如果您对数字感兴趣:反转frickin'字符串!毕竟,数字只不过是以10为基数编码的数字的字符表示。由于数学中很少有这样的应用,所以这种反转是有意义的,你可以说字符串反转应该一直应用。它不适用于负数。如果您按如下方式更改它,它将在(Convert.ToBoolean(left)){var r=left%10;rev=rev*10+r;left=left/10;//lef
int x = 9876543;
char[] arr = x.ToString().ToCharArray();
Array.Reverse(arr);
Console.WriteLine(int.Parse(new string(arr)));
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();
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();
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);
}
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;
}
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;
}
}
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);
Convert.ToInt32(new string(num.ToString().Reverse().ToArray()));