【问题标题】:Adding digits at Even and Odd Places (C#)在偶数位和奇数位添加数字 (C#)
【发布时间】:2009-08-24 09:01:47
【问题描述】:

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

等等,不要急于回答!

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

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

【问题讨论】:

  • 只有一个问题,我们是从左边还是从右边开始计算奇数/偶数?如果数字有偶数位数,这将有所不同。

标签: c# algorithm


【解决方案1】:
    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】:

这不是单行的,但以下工作:

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; }

【讨论】:

  • @ThePower:我认为你有一个误解。 OP 要求奇数位和偶数位的数字总和,而不是奇数位和偶数位。
  • 该死,帕特里克,我花了太长时间才从你的帖子中删除换行符,当我的帖子发布时,你已经编辑了你的。 :(
  • 我喜欢你的单线幽默感!谢谢。
【解决方案3】:

如果您喜欢 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】:
    "1234567".Where((ch, i) => i % 2 == 0).Sum(ch => ch - '0')
    

    【讨论】:

      【解决方案5】:

      修改了分组逻辑的 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);
      

      【讨论】:

      • 很好,但我真的不喜欢变异标志技巧 [在任何版本中] - 可枚举的每个循环都将依赖于那里的状态 [并且将排除交错版本ETC。]。但是,只要我们尝试做 Stupid Coding Tricks,那就没问题了。
      【解决方案6】:

      这是我使用 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的调用。从左到右计算将给出不同的结果当number 的位数为偶数时,从右到左。)

      【讨论】:

      • 请注意,我不推荐这种方法:标准循环会更短、更快、更容易理解。这只是我跳过箍来回答问题中的“最好是一行”请求!
      【解决方案7】:

      如果您正在寻找不可避免的愚蠢的 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);
      

      【讨论】:

        【解决方案8】:

        我不太了解 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】:
        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】:
           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】:
            int n = 1234567;
            int[] c = 新的 int[2];
            诠释 p = 0;
            n.ToString().Select(ch => (int)ch - '0').ToList().ForEach(d => { c[p] += d; p ^= 1; });
            Console.WriteLine("偶数 = {0}, 奇数 = {1}", c[0], c[1]);

            较短的一个:

            int n = 1234567, p = 0;
            int[] c = 新的 int[2];
            而 (n > 0) { c[p] += n % 10; n /= 10; p ^= 1; };
            Console.WriteLine("偶数 = {0}, 奇数 = {1}", c[p ^ 1], c[p]);

            【讨论】:

              【解决方案12】:

              如果您从右侧开始,则此方法有效。至少,它适用于 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
              

              【讨论】:

                【解决方案13】:

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

                【讨论】:

                  猜你喜欢
                  • 2022-11-25
                  • 1970-01-01
                  • 2017-03-01
                  • 2021-05-12
                  • 1970-01-01
                  • 2015-04-04
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多