我需要在整数中添加偶数和奇数位数。说,
让number = 1234567
。
偶数位数的总和= 2+4+6 = 12
奇数位数的总和= 1+3+5+7 = 16
等等,不要跳到答案!
我正在寻找具有最小行数的代码,最好是单行代码。类似于'chaowman'在帖子Sum of digits in C#中发布的内容。
有没有人有一些很酷的代码。 感谢。
答案 0 :(得分:9)
bool odd = false;
int oddSum = 1234567.ToString().Sum(c => (odd = !odd) ? c - '0' : 0 );
odd = false;
int evenSum = 1234567.ToString().Sum(c => (odd = !odd) ? 0 : c - '0' );
答案 1 :(得分:2)
这不是单行,但以下工作:
int oddSum = 0, evenSum = 0;
bool odd = true;
while (n != 0) {
if (odd)
oddSum += n % 10;
else
evenSum += n % 10;
n /= 10;
odd = !odd;
}
编辑:
如果你想要它在一行:
int oddSum = 0, evenSum = 0; bool odd = true; while (n != 0) { if (odd) oddSum += n % 10; else evenSum += n % 10; n /= 10; odd = !odd; }
答案 2 :(得分:2)
如果你喜欢chaowmans解决另一个问题,这将是偶数/奇数的逻辑扩展:
int even = 17463.ToString().Where((c, i) => i%2==1).Sum(c => c - '0');
int odd = 17463.ToString().Where((c, i) => i%2==0).Sum(c => c - '0');
虽然循环可能更简单,更有效:
for (odd = even = 0; n != 0; n /= 10) {
tmp = odd;
odd = even*10 + n%10;
even = tmp;
}
它也不会更长或更复杂。两个版本都确定了数字左边的“奇怪”。
答案 3 :(得分:2)
"1234567".Where((ch, i) => i % 2 == 0).Sum(ch => ch - '0')
答案 4 :(得分:1)
如果你正在寻找不可避免的愚蠢的LINQ技巧版本,请点击这里:
var result = 1234567
.ToString()
.Select((c, index) => new { IndexIsOdd = index % 2 == 1, ValueOfDigit = Char.GetNumericValue(c) })
.GroupBy(d => d.IndexIsOdd)
.Select(g => new { OddColumns = g.Key, sum = g.Sum(item => item.ValueOfDigit) });
foreach( var r in result )
Console.WriteLine(r);
我确信可以被一个无聊的人变成一个单行(并删除将其转换为字符串作为生成数字的方式)。
编辑:使用元组缩短(但更混乱)
var result = 1234567
.ToString()
.Select((c, index) => Tuple.Create( index % 2 == 1, Char.GetNumericValue(c))
.GroupBy(d=>d.Item1)
.Select(g => new { OddColumns = g.Key, Sum = g.Sum(item => item.Item2) });
foreach( var r in result )
Console.WriteLine(r);
答案 5 :(得分:1)
Ruben的修改后的分组逻辑版本:
bool isOdd = false;
var sums = 1234567
.ToString()
.Select(x => Char.GetNumericValue(x))
.GroupBy(x => isOdd = !isOdd)
.Select(x => new { IsOdd = x.Key, Sum = x.Sum() });
foreach (var x in sums)
Console.WriteLine("Sum of {0} is {1}", x.IsOdd ? "odd" : "even", x.Sum);
答案 6 :(得分:1)
这是我使用LINQ的长单线,(a)计算一行中的奇数和偶数,(b)不转换原始数字为中间string
,(c)没有任何副作用:
var totals = Enumerable.Range(0, 10)
.Select(x => (number / (int)Math.Pow(10, x)) % 10)
.Where(x => x > 0)
.Reverse()
.Select((x, i) => new { Even = x * (i % 2), Odd = x * ((i + 1) % 2) })
.Aggregate((a, x) => new { Even = a.Even + x.Even, Odd = a.Odd + x.Odd });
Console.WriteLine(number); // 1234567
Console.WriteLine(totals.Even); // 12
Console.WriteLine(totals.Odd); // 16
(上面的代码从左到右计算奇数/偶数位置。从右到左计数而不是删除对Reverse
的调用。从L到R的计算将给出不同的当number
具有偶数位数时,结果比R到L..
答案 7 :(得分:0)
我真的不知道C#,但这里的单线程可能对Patrick McDonald来说有点熟悉:
int oddSum = 0, evenSum = 0; bool odd = true; while (n != 0) { if (odd) oddSum += n % 10; else evenSum += n % 10; n /= 10; odd = !odd; }
答案 8 :(得分:0)
int evenSum = 1234567.ToString().ToCharArray().Where((c, i) => (i % 2 == 0)).Sum(c => c - '0');
int oddSum = 1234567.ToString().ToCharArray().Where((c, i) => (i % 2 == 1)).Sum(c => c - '0');
答案 9 :(得分:0)
int number = 1234567;
int oddSum = 0;
int evenSum = 0;
while(number!=0)
{
if (n%2 == 0) evenSum += number % 10;
else oddSum += number % 10;
number /= 10;
}
答案 10 :(得分:0)
int n = 1234567; int[] c = new int[2]; int p = 0; n.ToString().Select(ch => (int)ch - '0').ToList().ForEach(d => { c[p] += d; p ^= 1; }); Console.WriteLine("even sum = {0}, odd sum = {1}", c[0], c[1]);
更短的一个:
int n = 1234567, p = 0; int[] c = new int[2]; while (n > 0) { c[p] += n % 10; n /= 10; p ^= 1; }; Console.WriteLine("even sum = {0}, odd sum = {1}", c[p ^ 1], c[p]);
答案 11 :(得分:0)
如果你从右边开始,这是有效的。至少,它适用于C ++。正如我所说,我不知道C#。我希望他们在C#中删除了一些废话。
这不是一个单行,但如果你对声明进行折扣(我认为是公平的),这是一个声明:
int oddSum, evenSum;
for(bool odd = ((oddSum = evenSum = 0) == 0);
n != 0;
odd = (!odd || (n /= 10) == n + (oddSum += (odd ? n % 10 : 0) - evenSum + (evenSum += (!odd ? n % 10 : 0)))))
;
作为额外的功劳,这里有一个单行的Python脚本,可以将所有C#解决方案变成一个单行。
one_liner.py
open(__import__('sys').argv[2]','w').write(open(__import__('sys').argv[1],'r').read().replace('\n',''))
用法:
python one_liner.py infile outfile
答案 12 :(得分:0)
这没有LINQ。
var r = new int[]{0,0}; for (int i=0; i<7; i++) r[i%2]+="1234567"[i]-48;
System.Console.WriteLine("{0} {1}",r[0],r[1]);