鱼C论坛

 找回密码
 立即注册
楼主: 欧拉计划

题目1:找出1000以下自然数中3和5的倍数之和

  [复制链接]
发表于 2022-2-22 11:34:33 | 显示全部楼层
  1. #include <stdio.h>
  2. int num(int number);

  3. int num(int number)
  4. {
  5.         if(number%5==0||number%3==0)
  6.         {
  7.                 return number;
  8.         }else{
  9.                 return 0;
  10.         }
  11. }

  12. int main()
  13. {
  14.         int i,result=0;
  15.         for(i=0;i<1000;i++)
  16.         {
  17.                 result+=num(i);
  18.         }
  19.        
  20.         printf("%d",result);
  21.         return 0;
  22. }
复制代码


水一波
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-16 19:51:07 | 显示全部楼层
以下是我用Java写的 运行出来是:234168
int sum=0;
        for(int i=1;i<=1000;i++){
            if(i%3==0||i%5==0){
                sum+=i;
            }
        }
        System.out.print(sum);
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-17 09:34:41 | 显示全部楼层
这是我用java for循环、while循环分别做的
for循环:
public static void main(String[] args) {
        int sum=0;
        for(int i=1;i<=1000;i++){
            if(i%3==0||i%5==0){
                sum+=i;
            }
        }
        System.out.print(sum);
    }

while循环:
public static void main(String[] args) {
        int sum=0;
        int i=0;
        while(i<1001){
            if(i%3==0||i%5==0){
                sum+=i;
            }
            i++;
        }
        System.out.print(sum);
    }
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-6 10:32:26 | 显示全部楼层
一行流:
sum([n for n in range(1000) if (n % 3 == 0) or (n % 5 == 0)])
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-8 10:59:48 | 显示全部楼层
  1. use rayon::prelude::*;
  2. use std::time::Instant;


  3. fn main() {
  4.     let now = Instant::now();
  5.     let num: i32 = (1..1000)
  6.     .into_par_iter()
  7.     .filter(|x| x % 5 == 0 || x % 3 == 0)
  8.     .sum();
  9.     println!("{num}");
  10.     println!("耗时{}秒。", now.elapsed().as_secs_f32())
  11. }
复制代码

---
233168
耗时0.0004362秒。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-22 12:15:02 | 显示全部楼层
鸡汤不加盐 发表于 2015-12-22 00:05
def getSum():
    sum = 0
    for x in range (1,1000):

不知道你是不是用Python,如果是的话那就
      其实不用定义函数类型,直接输出就可以了
      你用了or就不用管重复了,他只会判断一次的,所以不用去刻意强调
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-8 18:49:21 | 显示全部楼层
  1. int find3or5(int n){//找出1000以下自然数中3和5的倍数之和
  2.         int three = (n-1) / 3;
  3.         int five = (n-1) / 5;
  4.         int fifteen = (n-1) / 15;
  5.         return 3* (1 + three)* three / 2 + 5 * (1 + five) * five / 2 - 15 * (1 + fifteen) * fifteen / 2;
  6. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-27 07:46:29 | 显示全部楼层
python一行:
  1. print(sum([i for i in range(1, 1000) if i % 3 == 0 or i % 5 == 0]))
复制代码

C++:
  1. #include <iostream>
  2. using namespace std;

  3. int main(){
  4.         int num = 0;
  5.         for (int i = 0; i < 1000; i++){
  6.                 if (i % 3 == 0 || i % 5 == 0){
  7.                         num += i;
  8.                 }
  9.         }
  10.         cout << num << endl;

  11.         return 0;
  12. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-27 22:34:13 | 显示全部楼层
sum([i for i in range(1,1001) if i%3==0 or i%5==0])
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-28 09:52:43 | 显示全部楼层
b = []
sum = 0
for i in range(1001):
    a = len(str(i))
    for k in range(a):
        sum += int(str(i)[k])
    if sum % 3 == 0:
        b.append(i)
    sum = 0
    if str(i)[a-1] == '0' or str(i)[a-1] == '5' :
        b.append(i)
for i in range(len(b)-1):
    if b.count(b[i]) != 1:
        b[i]=0
sum = 0
for i in b:
    sum += i
    if i == 1000:
        print(sum)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-13 14:04:12 | 显示全部楼层
267,333
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-6 10:27:19 | 显示全部楼层
  1. add=0
  2. for each in range(1000//3+1):
  3.     add+=3*each
  4.     if 5*each<1000 and each%3!=0:
  5.         add+=5*each
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-9 13:14:15 | 显示全部楼层
int main(void)
{
        int i,j,l;
        int s=0;
       
        for(i=3;i<=1000;i=i+3)
        {
                s=s+i;
        }
        for(j=5;j<=1000;j=j+5)
        {
                s=s+j;
        }
        for(l=15;l<=1000;l=l+15)
        {
                s=s-l;
        }
       
        printf("1000 以下的自然数中,属于 3 或 5 的倍数的数字之和为%d",s);
       
        return 0;
}
//满足x+y+1<=xy即可,就可以减少次数
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-3 23:48:29 | 显示全部楼层
  1. #include<iostream>
  2. #define RANGE 1000
  3. using namespace std;

  4. //枚举算法 1
  5. int enumeration_1(int range);
  6. //枚举算法2
  7. int enumeration_2(int range);
  8. //公式算法
  9. int formula(int range);

  10. int main(){
  11.         //分别输出由三种算法得到的结果
  12.         cout << "enumeration_1:" << enumeration_1(RANGE) << endl;
  13.         cout <<        "enumeration_2:" << enumeration_2(RANGE) << endl;
  14.         cout << "formula:" << formula(RANGE) << endl;
  15.         return 0;
  16. }

  17. int enumeration_1(int range){
  18.         int sum=0;
  19.         //枚举出范围内所有自然数,判断是否为
  20.         //3或者5的倍数,如果满足则累加进sum变量
  21.         //时间复杂度为 O(n)
  22.         for(int i=1;i<range;i++){
  23.                 sum += i%3==0 || i%5==0 ? i : 0;
  24.         }
  25.         return sum;
  26. }

  27. int enumeration_2(int range){
  28.         int sum=0;
  29.         //从0开始每次增加3必为3的倍数,无需判断直接累加进sum变量
  30.         for(int i=0;i<range;i+=3) sum+=i;
  31.         //同理,从0开始每次增加5必为5的倍数,但是要忽略掉那些同为
  32.         //3的倍数
  33.         //时间复杂度同为 O(n) 但对比枚举1有所减少
  34.         for(int i=0;i<range;i+=5){
  35.                 sum += i%3==0 ? 0 : i;
  36.         }
  37.         return sum;
  38. }

  39. int formula(int range){
  40.         int sum=0;
  41.         //使用等差数列求和公式 (begin + end) * count / 2
  42.         //分别求出3和5的倍数和累加进sum变量
  43.         //时间复杂度为 O(1)
  44.         sum += ((range-range%3)+3) * ((range-range%3)/3) / 2;
  45.         sum += ((range-range%5)+5) * ((range-range%5)/5) / 2;
  46.         //3和5的公倍数,也就是15的倍数被重复累加,所以要减去
  47.         sum -=  ((range-range%15)+15) * ((range-range%15)/15) / 2;
  48.         //因为题目表示为范围内,所以如果范围的数字正好是3或者5的倍数
  49.         //需要将范围数字本身减去
  50.         sum -= range%3==0 || range%5==0 ? range : 0;
  51.         return sum;
  52. }
复制代码


输出:
  1. enumeration_1:233168
  2. enumeration_2:233168
  3. formula:233168

  4. --------------------------------
  5. Process exited after 0.01357 seconds with return value 0
  6. 请按任意键继续. . .
复制代码

点评

等差数列最快,看来数学公式能够优化算法  发表于 2024-12-8 23:37
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-9-5 12:56:41 | 显示全部楼层
C++练习打卡 Day1:
  1. #include <iostream>

  2. int main(void) {
  3.     int sum = 0;
  4.     for (int i = 1; i < 1000; i++) {
  5.         if (i % 3 == 0 || i % 5 == 0) {
  6.             sum += i;
  7.         }
  8.     }
  9.     std::cout << "1000以下自然数中3和5的倍数之和为:" << sum << std::endl;
  10. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-12-8 22:59:02 | 显示全部楼层
本帖最后由 hqk770 于 2024-12-8 23:31 编辑

#include <stdio.h>

int k = 0;        //控制换行输出
int h = 0;        //记录行号
int n = 0;        //记录循环的次数

void put(int i)
{

        if (!(k % 10))
        {
                h++;
                printf("\n%d:\t", h);               
        }
        k++;
        printf("%d\t", i);
}

void main()
{
        int sum = 0;
        int i = 3;
        int j = 5;
        while (i < 1000) {       
                while (j <i)
                {
                        if (j % 3)
                        {
                                sum += j;
                                put(j);
                        }
                        j += 5;
                        n++;                       
                }
                put(i);
                n++;
                sum += i;
                i += 3;
        }
        printf("\n\n1000以内自然数中,3和5的所有倍数之和:%d\n",sum);
        printf("共循环%d次\n\n", n);
}
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-12-16 19:22:59 | 显示全部楼层
直接容斥+等差即可:


  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int n;
  4. int f(int x){
  5.         if(x > n) return 0;
  6.         return (x+n/x*x)*(n/x)/2;
  7. }
  8. int main(){
  9.         cin >> n; --n;
  10.         int res = f(3)+f(5)-f(15);
  11.         cout << res << endl;
  12.         return 0;
  13. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-10-5 02:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表