如果我们列出10以下的所有自然数是3或5的倍数,我们得到3,5,6和9.这些倍数的总和是23.我有以下代码,但答案不匹配.
#include<stdio.h>
int main()
{
long unsigned int i,sum=0;
clrscr();
for(i=0;i<=1000;i++)
{
if((i%5==0)||(i%3==0))
{
sum=sum+1;
}
}
printf("%d\n",sum);
getchar();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
小智 20
而不是使用基于范围/循环的解决方案,您可能希望利用更多的数学而不是暴力.
有一种简单的方法可以得到一个数的倍数之和,小于一个数.
例如,3到1000的倍数之和为:3 + 6 + 9 + ... + 999可以改写为:3*(1 + 2 + 3 + ... + 333)
有一种简单的方法来总结所有数字1-N:
Sum(1,N) = N*(N+1)/2
Run Code Online (Sandbox Code Playgroud)
所以样本函数就是
unsigned int unitSum(unsigned int n)
{
return (n*(n+1))/2;
}
Run Code Online (Sandbox Code Playgroud)
因此现在将所有3的倍数小于1000(也就是999)减少到:
3*unitSum((int)(999/3))
Run Code Online (Sandbox Code Playgroud)
您可以对5的倍数执行相同的操作:
5*unitSum((int)(999/5))
Run Code Online (Sandbox Code Playgroud)
但有一个警告!这两个都计算两者的倍数,例如15,30等等.它们计算两次,每次一个.因此,为了平衡这一点,你减去一次.
15*unitSum((int)(999/15))
Run Code Online (Sandbox Code Playgroud)
所以总的来说,等式是:
sum = 3*unitSum((int)(999/3)) + 5*unitSum((int)(999/5)) - 15*unitSum((int)(999/15))
Run Code Online (Sandbox Code Playgroud)
所以现在而不是循环遍历大量数字,并进行比较,你只是做一些简单的乘法!
mar*_*ton 18
两件事情:
将循环更改为
for(i=0;i<1000;i++)
Run Code Online (Sandbox Code Playgroud)
和总和来
sum=sum+i;
Run Code Online (Sandbox Code Playgroud)
也许你应该这样做
sum += i // or sum = sum + i
Run Code Online (Sandbox Code Playgroud)
代替
sum = sum + 1
Run Code Online (Sandbox Code Playgroud)
另外,long unsigned int使用printf 打印时要小心.我想正确的说明符是%lu.