erdf99 发表于 2022-11-8 18:49:21

int find3or5(int n){//找出1000以下自然数中3和5的倍数之和
        int three = (n-1) / 3;
        int five = (n-1) / 5;
        int fifteen = (n-1) / 15;
        return 3* (1 + three)* three / 2 + 5 * (1 + five) * five / 2 - 15 * (1 + fifteen) * fifteen / 2;
}

元豪 发表于 2022-11-27 07:46:29

python一行:
print(sum())
C++:
#include <iostream>
using namespace std;

int main(){
        int num = 0;
        for (int i = 0; i < 1000; i++){
                if (i % 3 == 0 || i % 5 == 0){
                        num += i;
                }
        }
        cout << num << endl;

        return 0;
}

eyouyou1105 发表于 2022-11-27 22:34:13

sum()

r里鲁亚 发表于 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))
    if sum % 3 == 0:
      b.append(i)
    sum = 0
    if str(i) == '0' or str(i) == '5' :
      b.append(i)
for i in range(len(b)-1):
    if b.count(b) != 1:
      b=0
sum = 0
for i in b:
    sum += i
    if i == 1000:
      print(sum)

KeyError 发表于 2023-1-13 14:04:12

267,333

未泯 发表于 2023-4-6 10:27:19

add=0
for each in range(1000//3+1):
    add+=3*each
    if 5*each<1000 and each%3!=0:
      add+=5*each

叶落了 发表于 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即可,就可以减少次数

funcE 发表于 2024-6-3 23:48:29

#include<iostream>
#define RANGE 1000
using namespace std;

//枚举算法 1
int enumeration_1(int range);
//枚举算法2
int enumeration_2(int range);
//公式算法
int formula(int range);

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

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

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

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

输出:
enumeration_1:233168
enumeration_2:233168
formula:233168

--------------------------------
Process exited after 0.01357 seconds with return value 0
请按任意键继续. . .

Ian_Li 发表于 2024-9-5 12:56:41

C++练习打卡 Day1:
#include <iostream>

int main(void) {
    int sum = 0;
    for (int i = 1; i < 1000; i++) {
      if (i % 3 == 0 || i % 5 == 0) {
            sum += i;
      }
    }
    std::cout << "1000以下自然数中3和5的倍数之和为:" << sum << std::endl;
}

hqk770 发表于 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);
}

xiaosi4081 发表于 6 天前

直接容斥+等差即可:


#include<bits/stdc++.h>
using namespace std;
int n;
int f(int x){
        if(x > n) return 0;
        return (x+n/x*x)*(n/x)/2;
}
int main(){
        cin >> n; --n;
        int res = f(3)+f(5)-f(15);
        cout << res << endl;
        return 0;
}
页: 4 5 6 7 8 9 10 11 12 13 [14]
查看完整版本: 题目1:找出1000以下自然数中3和5的倍数之和