尝试编写计算3&的倍数之和的代码。 5在用户输入的值下。 问题是代码添加了两次公共倍数,最后给出了错误的答案。我怎么解决这个问题?
class Program
{
public static void Main(string[] args)
{
String userenter;
System.Console.WriteLine("Enter the value you want for the sum of multiples of 3 and 5 to be below of: ");
userenter = Console.ReadLine();
int n;
int.TryParse(userenter, out n);
int i, sum2=0;
for (i = 1; i < n / 3.0; i++)
{
Console.WriteLine("\n" + "3*" + i + "=" + 3 * i);
Console.WriteLine(sum2 += 3 * i);
}
for (i = 1; i < n / 5.0; i++)
{
Console.WriteLine("\n"+"5*"+i+"="+5 * i);
Console.WriteLine(sum2 += 5 * i);
}
//Console.WriteLine("The sum of multiples of 3 under "+"n "+ "is ");
Console.Read();
}
}
}
答案 0 :(得分:2)
问题是你在n中循环两次,因此任何5和3的倍数都将被命中并添加/打印两次。尝试只循环n次:
int sum = 0;
for (i = 1; i < n; i++)
if (i%3 == 0 || i%5 == 0)
sum += i;
return sum;
答案 1 :(得分:2)
你可以尝试这个:
int upperBound = 1000;
var sum = Enumerable.Range(1,upperBound)
.Where(x=>x%3==0 || x%5==0)
.Sum();
答案 2 :(得分:1)
极简主义改变可能会改变:
for (i = 1; i < n / 5.0; i++)
{
Console.WriteLine("\n"+"5*"+i+"="+5 * i);
Console.WriteLine(sum2 += 5 * i);
}
成像:
for (i = 1; i < n / 5.0; i++)
{
if ((i * 5) % 3 != 0)
{
Console.WriteLine("\n"+"5*"+i+"="+5 * i);
Console.WriteLine(sum2 += 5 * i);
}
}
以免重复计算十五的多数。
然而,使用能够检查范围内所有数字上的任何一种情况的东西可能更容易,因为计算机可能会在您完全脱掉之前完成此操作输入键:
sum = 0
for i in range 1..whatever:
if num % 3 == 0 or num % 5 == 0:
sum = sum + num
我把它作为伪代码放入,因为Euler的重点是弄清楚如何自己做,所以你应该做一些的工作: - )< / p>
请记住,这种蛮力方法可能适用于Euler#1,但它对后来的问题不会有好处。
为了它的价值,我最近写了一篇博客文章,为这个确切的问题提供了O(1)解决方案,但是它没有被安排发布很长一段时间。
它需要一些数学知识,但是,即使限制为10 100 ,Python代码仍然在CygWin下运行不到半秒,在Linux下可能更快#34;适当&#34;
您必须等待实际文章才能解释数学,但以下预告片会说明它是如何完成的:
limit = 10 * 10 * 10 * 10 * 10 # 10^5 = 10^5
limit = limit * limit * limit * limit # (10^5)^4 = 10^20
limit = limit * limit * limit * limit * limit # (10^20)^5 = 10^100
sum = 0
fullGroups = int((limit - 1) / 15)
sum = fullGroups * (fullGroups - 1) * 105 / 2 + fullGroups * 60
for num in xrange(fullGroups * 15 + 1, limit):
if num % 3 == 0 or num % 5 == 0:
sum = sum + num
print sum
如果有足够的人要求它(不太可能),我可以重新安排将其推进。
当然,除了计算小数的能力之外,还有一种方法可以做到这一点(对于十次幂限制)而不用任何计算。
看看你得到的限量为一千,一万,十万等等,看看你是否能看到这种模式: - )
答案 3 :(得分:0)
您应该使用一个循环并检查是否满足其中一个条件:
int sum = 0;
for (int i = 1; i < n; ++i)
{
if (i % 3 == 0 || i % 5 == 0)
sum += i;
}
使用LINQ的或“one-liner”(但由于创建了可枚举的内容,因此速度较慢):
int sum = Enumerable.Range(1, n - 1).Sum(v => v % 3 == 0 || v % 5 == 0 ? v : 0);
答案 4 :(得分:0)
你说的是:&#34;问题是代码是两次加入公共倍数&#34;。所以,你必须删除它们或者根本不计算它们两次。
for (int i = 1; i < n; ++i) {
if (i % 3 == 0 || i % 5 == 0) sum += i;
}
虽然有一个更好的方法,但你应该真正找到自己(它的数学)