【问题标题】:C# Sum of digits of a number if the sum equals 9如果总和等于 9,C# 数字的总和
【发布时间】:2016-11-15 11:00:05
【问题描述】:

我希望在控制台中写入总和为 9 的所有 3 位数字。 到目前为止,这是我想出的,但它不起作用:

class Program
{
    static void Main(string[] args)
    {
        int sum = 0;
        for (int n = 100; n < 1000; n++)
        {
            while (n <1000)
            {
                sum += n % 10;
                n /= 10;
                if (sum == 9)
                Console.WriteLine(sum);
            }
        }
    }
}

【问题讨论】:

  • 嗯,你正在使用sum += n % 10; 这意味着一旦sum == 9 为真,它就永远不会再次为真,因为总和只会不断上升。您可能希望在每次迭代结束时将其重置为 0。这可以通过直接设置它的值而不是递增来完成 - sum = n % 10; 或者在你的条件之后使用 sum = 0;
  • 这很容易解决,我敢肯定,如果您花几分钟逐步调试变量,您会发现问题
  • @AlfieGoodacre 是正确的,但还有更多; sum 从 0 开始,但在第一个 while 循环之后,sum = 10。然后你减少 for 的计数器,使其 = 10。下一个循环,sum = 11,n 变为 1。你的 while 永远不会退出
  • 两种方法都试过了还是不行
  • 看看你的代码 - 你在外部 for 循环中将 n 初始化为 100,然后在内部 while 循环中你不断除以 10 - 所以它会一直卡在无限循环中

标签: c# numbers sum digits


【解决方案1】:

我会使用三个循环,每个数字一个:

for (int i1 = 1; i1 < 10; i1++)
for (int i2 = 0; i2 < 10; i2++)
for (int i3 = 0; i3 < 10; i3++)
{
    if (i1 + i2 + i3 == 9)
        Console.WriteLine("{0}{1}{2}", i1, i2, i3);
}

【讨论】:

  • 依赖于模 10,然后除以 10 直到 0 的答案确实具有在需求发生变化时更容易扩展到更长数字的优势。
  • 我同意@PaulF。这仅针对此问题。模数解决方案可以很容易地确定它们,而不仅仅是设置范围。还是不错的解决方案
  • 如果查看一个如此具体的解决方案 - 那么两个循环解决方案不是更好 - 一旦你有 i1 和 i2,然后 i3 = 9- (i1+i2) - 无需测试i3 for 循环的其他 9 个值。
  • 已知 i1 和 i2 的情况下,10 个中只有 1 个可能的解决方案 - 所以你计算它,如果答案是否定的,那么就没有可能的解决方案 - 所以你只需要一个 if 语句您不需要遍历 10 个可能的值。
  • 好吧,这只是尝试向 OP 展示针对他的特定问题的不同方法。因为他似乎学会了如何使用循环,所以我展示了一种纯 for 循环方法,它将这个数学问题简化为一个非常简单(且有效)的任务。当然,还有其他更灵活的方法也可以使用。如果任务是学习模数,我的方法会以一种有趣的方式阻止它。
【解决方案2】:

您不会在每次循环迭代后重置总和。 sum 应该在每次迭代开始时等于零,例如。此外,while 循环是错误的。试试这个:

for(int n=100;n<1000;n++)
        {
            sum=0;
            int i = n;
            while(i!=0) {
                sum += i % 10;
                i /= 10;
            }
            if (sum == 9)
            Console.WriteLine("Number {0} has digit sum of {1}", n, sum);
        }

【讨论】:

    【解决方案3】:

    为什么这么复杂?

    for (int n = 100; n < 1000; n++)
    {
        var s1 = n/100 % 10;
        var s2 = n/10 % 10;
        var s3 = n/1 % 10;
    
        var sum = s1+s2+s3;
        if (sum == 9)
        Console.WriteLine(n);       
    }
    

    对于不喜欢简单方法的人:D

    Enumerable.Range(0, 1000).Select(x => x.ToString())
        .Where(x => x.Length == 3).Select(x => new {x, sum=x.ToCharArray()
        .Select(c=>int.Parse(c.ToString())).Sum()}).Where(x=>x.sum == 9)
        .Select(x=>x.x).ToList().ForEach(Console.WriteLine);    
    

    Oki,尝试创建非通用但最快的解决方案。

    for (var i = 1; i <= 10; i++)
        for (var j = 0; j < 10; j++)
        {
            if ((i>1 && j == 0) || i < j)           
            {                   
                Console.WriteLine(i * 90 + j * 9);              
            }
        }
    

    【讨论】:

    • 第二个也是给喜欢自己程序运行速度慢1000倍的人哈哈
    • 依赖于模 10,然后除以 10 直到 0 的答案确实具有在需求发生变化时更容易扩展到更长数字的优势。
    • @PaulF 不同意。需求可以通过不同的方式改变,内循环可以是优势也可以是劣势
    • @PaulF,这在 LinQ 查询和传统除法技术之间没有任何区别。它们都需要几乎相同的更改。然而,主要关注的是速度。在这里,它创建了多个可枚举,这会花费大量时间,否则可以很容易地节省下来。无论如何,他这样做只是为了好玩
    • @AmmarSalman 认为 PaulF 回答了我的第一个问题 Why soo commplicated? => 这与 linq 无关,而是关于使用内部 while 循环(参见其他答案)而不是手动计算 3 个数字。跨度>
    【解决方案4】:

    我想你正在寻找这个:

        class Program
    {
        static void Main(string[] args)
        {
    
            for (int n = 100; n < 1000; n++)
                {
                    int sum = 0;
                    int num = n;
                    while (num != 0)
                    {
                        int r = num % 10;
                        sum += r;
                        num /= 10;
                    }
                    if (sum == 9)
                        Console.WriteLine(n);//.....Number whose all digit sum ==9
                }
        }
    }
    

    【讨论】:

    • ty 提供帮助,但它不会退出 while
    • @toni n /= 10 的输出是什么; ?
    • 如果您要更改 n,for 循环将如何正确执行?
    猜你喜欢
    • 2021-12-08
    • 2015-12-10
    • 2012-03-11
    • 2010-11-07
    • 2019-03-24
    • 1970-01-01
    • 2014-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多