当用户输入数字时,例如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");
}
我可以找到所有数字的总和,但我在这里尝试的是我的知识范围。我走到了尽头。
答案 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。从5
到9
的{{1}} = 5 + 6 + 7 + 8 + 9
也是35
= (9 - 5 + 1) * (5 + 9) / 2
。
所以要找到你不需要循环的总和,你需要:
35
如果int sum = (max - min + 1) * (max + min) / 2;
为min
且-1024
为max
,这会对速度产生很大影响,因为您可以执行此计算并获得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)
问题在于您混淆了x
和min
的角色。用户输入min
作为方法的起点;你不应该改变它。但是,您在min
循环的每次迭代期间更改for
。首先,从所有三个min++
循环中删除for
。
x
是一个随着查找总和而变化的变量。因此,不是将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()));
}
这应该会给你一些事情。