在偶数和奇数位置添加数字(C#)

时间:2009-08-24 09:01:47

标签: c# algorithm

我需要在整数中添加偶数和奇数位数。说, 让number = 1234567。 偶数位数的总和= 2+4+6 = 12 奇数位数的总和= 1+3+5+7 = 16

等等,不要跳到答案!

我正在寻找具有最小行数的代码,最好是单行代码。类似于'chaowman'在帖子Sum of digits in C#中发布的内容。

有没有人有一些很酷的代码。 感谢。

13 个答案:

答案 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]);