代码之家  ›  专栏  ›  技术社区  ›  abhilashca

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

  •  5
  • abhilashca  · 技术社区  · 16 年前

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

    我正在寻找行数最少的代码,最好是单行代码。与“chaowman”在帖子中发布的内容类似 Sum of digits in C# .

    有人有很酷的代码吗。

    13 回复  |  直到 9 年前
        1
  •  9
  •   Ed Guiness    16 年前
        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' );
    
        2
  •  2
  •   Patrick McDonald    16 年前

    这不是一个单行线,但以下工作:

    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; }
    
        3
  •  2
  •   sth    16 年前

    如果你喜欢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;
    }
    

        4
  •  2
  •   Lloyd    16 年前
    "1234567".Where((ch, i) => i % 2 == 0).Sum(ch => ch - '0')
    
        5
  •  1
  •   Martin JonáÅ¡    16 年前

    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
  •   LukeH    16 年前

    b string

    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 number 具有偶数位数。)

        7
  •  1
  •   Ruben Bartelink    13 年前

    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);
    
        8
  •  0
  •   Imagist    16 年前

    我并不真正了解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; }
    
        9
  •  0
  •   user152949 user152949    16 年前
    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
  •   Preetum Nakkiran    16 年前
     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');
    
        11
  •  0
  •   user9046 user9046    16 年前
    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]);
        12
  •  0
  •   Imagist    16 年前

    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
    
        13
  •  0
  •   Sklivvz    16 年前

    这在没有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]);