如何只取偶数和奇数的总和? C#

时间:2016-02-14 03:06:57

标签: c#

当用户输入数字时,例如3和7,程序会在中间添加所有数字以及用户输入的数字。现在我需要让它只添加数字之间的偶数和赔率。这就是我到目前为止所做的:

static void Exercise1()
    {
        int min;
        int max;
        int sum = 0;
        int odd = 0;
        int even = 0;

        Console.WriteLine("Enter minimum integer: ");
        min = int.Parse(Console.ReadLine());
        Console.WriteLine("Enter maximum integer: ");
        max = int.Parse(Console.ReadLine());
       //Sum of all
        Console.Write("All: ");
         for (int x = min; x <= max; x++)
            {
                Console.Write(min);
                min++;
                Console.Write(" + ");
                sum += x;
            }
         Console.Write("= ");
         Console.Write(sum + "\n");

        //Odd Numbers
         Console.Write("Odd: ");
         for (int x = min; x <= max; x++)
         {
             if (min % 2 != 0)
             {
                 Console.Write(min);
                 min++;
                 Console.Write(" + ");
                 odd += x;
             }

         }
         Console.Write("= ");
         Console.Write(odd + "\n");

        //Even Numbers
         Console.Write("Even: ");
         for (int x = min; x <= max; x++)
         {

             if (min % 2 == 0)
             {
                 Console.Write(min);
                 min++;
                 Console.Write(" + ");
                 even += x;
             }   

         }
         Console.Write("= ");
         Console.Write(even + "\n");

        }

我可以找到所有数字的总和,但我在这里尝试的是我的知识范围。我走到了尽头。

3 个答案:

答案 0 :(得分:3)

你在循环中正在做min++,这意味着min不是它应该是的。有时候++min进行合理的微优化并且根本没有x,但前提是你再也不需要那个值了。

你可以通过在找到奇数(甚至相应)后在每个循环中跳过x += 2来加快速度,但通过一个循环可以加快速度:

int sum = 0;
int odd = 0;
int even = 0;
for (int x = min; x <= max; x++)
{
    sum += x;
    if (x % 2 == 0)
        even += x;
    else
        odd += x;
}

然而,你可以通过一些数学思考来做得更好。

Σ[x,y] =(y-x + 1)(y + x)/ 2

E.g。从59的{​​{1}} = 5 + 6 + 7 + 8 + 9也是35 = (9 - 5 + 1) * (5 + 9) / 2

所以要找到你不需要循环的总和,你需要:

35

如果int sum = (max - min + 1) * (max + min) / 2; min-1024max,这会对速度产生很大影响,因为您可以执行此计算并获得8980而不是必须循环10005个不同的值。

同样,如果您找到最小偶数(39799890)和最大偶数(minEven = min % 2 == 0 ? min : min + 1),那么您可以找到平均值的总和:

maxEven = max % 2 == 0 ? max : max - 1

确实,完全相同的公式适用于奇数:

int sumEven = ((maxEven - minEven) / 2 + 1) * (maxEven + minEven) / 2;

在那里,根本不需要进行任何循环,并且你的Θ(n)方法可以用Θ(1)方法替换。

答案 1 :(得分:1)

问题在于您混淆了xmin的角色。用户输入min作为方法的起点;你不应该改变它。但是,您在min循环的每次迭代期间更改for。首先,从所有三个min++循环中删除forx是一个随着查找总和而变化的变量。因此,不是将min的值写入控制台(此值应该是常量,您实际上是在尝试找出x的值是什么......所以,更改您的Console.Write(min)Console.Write(x)

同时更改<{1}} - 来自

的声明
if

 if (min % 2 != 0)

您可以通过阅读this lesson或观看this video来了解 if (x % 2 != 0) - 循环(和其他)控制语句。

答案 2 :(得分:0)

这是一种值得关注的方式:

static void Exercise1()
{
    Console.WriteLine("Enter minimum integer: ");
    int min = int.Parse(Console.ReadLine());
    Console.WriteLine("Enter maximum integer: ");
    int max = int.Parse(Console.ReadLine());

    IEnumerable<int> all = Enumerable.Range(min, max - min + 1);
    IEnumerable<int> odds = all.Where(n => n % 2 == 1);
    IEnumerable<int> evens = all.Where(n => n % 2 == 0);

    Console.WriteLine(String.Format("All: {0} = {1}", String.Join(" + ", all), all.Sum()));
    Console.WriteLine(String.Format("Odd: {0} = {1}", String.Join(" + ", odds), odds.Sum()));
    Console.WriteLine(String.Format("Even: {0} = {1}", String.Join(" + ", evens), evens.Sum()));
}

这应该会给你一些事情。