3和5的倍数和不正确
本文关键字:不正确 | 更新日期: 2023-09-27 18:11:10
尝试编写计算3的倍数和的代码&5在user输入的值下。问题是代码把公倍数加了两次最后给出了错误的答案。我怎么解决这个问题?
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();
}
}
}
问题是你循环了n两次,因此5和3的任何倍数都将被击中并添加/打印两次。试着只循环n一次:
int sum = 0;
for (i = 1; i < n; i++)
if (i%3 == 0 || i%5 == 0)
sum += i;
return sum;
你可以试试这个:
int upperBound = 1000;
var sum = Enumerable.Range(1,upperBound)
.Where(x=>x%3==0 || x%5==0)
.Sum();
最简单的改变可能是:
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);
}
}
以避免重复计算十五的倍数
然而,检查范围内所有数字的任一条件可能会更容易,因为计算机可能会在您的手指完全离开ENTER键之前完成此操作:
sum = 0
for i in range 1..whatever:
if num % 3 == 0 or num % 5 == 0:
sum = sum + num
我把它作为伪代码写在这里因为欧拉的全部意义就是要找出如何自己做,所以你应该做一些的工作:-)
请记住,这种蛮力方法可能适用于欧拉#1,但它不会对以后的问题很好。
为了它的价值,我最近写了一篇博客文章,给出了这个问题的O(1)解决方案,但这篇文章暂时不会发表。
这需要一些数学知识,但是,即使有10100的限制,Python代码在CygWin下仍然可以在半秒内运行,并且可能在Linux"适当"下更快。
您必须等待真正的文章来解释数学,但下面的预告片展示了它是如何完成的:
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
如果有足够多的人要求(不太可能),我可能会重新安排时间,把它提前。
当然,有一种方法可以做到这一点(对于10的幂限制),而不需要任何计算,除了能够计数到小数字。
看看你得到的限制是一千,一万,十万等等,看看你是否能看到模式:-)
您应该使用一个循环并检查是否满足其中一个条件:
int sum = 0;
for (int i = 1; i < n; ++i)
{
if (i % 3 == 0 || i % 5 == 0)
sum += i;
}
或使用LINQ的"一行"(但这会比较慢,因为创建了可枚举对象):
int sum = Enumerable.Range(1, n - 1).Sum(v => v % 3 == 0 || v % 5 == 0 ? v : 0);
你说过:"问题是代码将公倍数加了两次"。因此,您必须删除它们或简单地不计算它们两次。
for (int i = 1; i < n; ++i) {
if (i % 3 == 0 || i % 5 == 0) sum += i;
}
有一个更好的方法,但你应该自己去发现(这是数学)