3和5的倍数之和不正确

时间:2014-07-01 12:20:54

标签: c#

尝试编写计算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();

    }
}

}

5 个答案:

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

虽然有一个更好的方法,但你应该真正找到自己(它的数学)