Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#替换为长变量_C#_Long Integer - Fatal编程技术网

C#替换为长变量

C#替换为长变量,c#,long-integer,C#,Long Integer,我有一个很大的数字,比如: 1012223457 我需要将此数字中的第三个最高有效位设置为3。我怎样才能做到这一点?有没有办法不用转换成字符串,也不用在其中添加“20000000”就可以实现这一点呢?ToString的少量使用会使代码更加简洁。请记住,我仍然在使用数学函数进行更改,不涉及字符串操作 var number = 123456789; var length = number.ToString().Length; var multiplier = Math.Pow(1

我有一个很大的数字,比如:

1012223457

我需要将此数字中的第三个最高有效位设置为
3
。我怎样才能做到这一点?有没有办法不用转换成字符串,也不用在其中添加“20000000”就可以实现这一点呢?

ToString的少量使用会使代码更加简洁。请记住,我仍然在使用数学函数进行更改,不涉及字符串操作

   var number = 123456789;
   var length = number.ToString().Length;
   var multiplier = Math.Pow(10, length - 3):
   var oldDigit = Math.Floor(number / multiplier) % 10;
   var change = 3 - oldDigit;
   number += change * multiplier;

这样就不用绳子了。大多数卷积是在不使用字符串的情况下确定数字的长度。所以我用了一个数学技巧:

long number = 1012223457;
number += (long)(2*Math.Pow(10.0,(double)((int)(Math.Log10(Math.Max(Math.Abs(number), 0.5)) + 1)-3)));
2*
是您想要添加的值

解决方案是令人困惑的,但它应该是可行的

我甚至没有想到数字长度的诀窍是StackOverflow,但你可以找到它的相关信息。巧合的是,提供的代码是用C#编写的

因此,必须使用一个非常复杂的方法,而不使用字符串,但需要数学函数来补偿。我可能会选择使用
字符串的东西,因为可读性会大大提高。

请看以下答案:

因此,可以这样做:

int digitpos = 5;
long number = 1080511231123;
int numbertoset = 3;

int digitcount = (int)Math.Floor(Math.Log10(number) + 1);
long exp = (long)Math.Pow(10, digitcount - digitpos);
if (exp == 0) throw new ArgumentException("The number does not contain required digit.");
int targetdigit = (int)(number / exp) % 10;
int multiplier = numbertoset - targetdigit;
long result = number + multiplier * exp;

要替换目标数字,我必须先计算它的值。

这不是实现您要求的OP的最佳方法,您必须使用ToString来获得最佳和最可靠的解决方案,但尽管如此,下面的示例满足了您的要求:

var a = 10000000L;
var pows = Enumerable.Range(0, 16).Select(x => (long)Math.Pow(10, x));
var d = pows.First(x => a / x == 0);
var thirdDigit = (a / (d / 1000)) % 100;
a += (long)((3 - thirdDigit) * (d / 1000));

不,是你盖的。为什么添加
20000000
不好?在不解释为什么不能使用Y或Z的情况下问“我需要做X而不使用Y或Z”没有多大意义。因为它可能是9个数字,而不总是10个。你还忽略了什么有趣的要求?比如“只使用XXXXX操作”或者类似的东西?它能有50位数长吗?(或者你的意思是“long”作为C#
long
也被称为
System.Int64
)?为什么你不能将它转换为字符串?甚至在不看你的代码是否工作的情况下,这个问题明确地说“有没有办法不转换为字符串就完成它”。是的,但我觉得OP的意思是“不要用字符串替换数字”。我会先等待OP的回答。还有@VDohnal哦,我一定很累了。你仍然通过
ToString()
number
转换为
string
以获得长度。有趣的是,这是公认的答案,但它转换成了OP告诉我们不能使用的字符串。咯咯笑