c语言题 求助

 我来答
xgn911
2022-09-26 · TA获得超过1359个赞
知道小有建树答主
回答量:1493
采纳率:96%
帮助的人:625万
展开全部

这道题中n的最大取值为10⁹,所以直接遍历依次判断再求和会超时

注意到1~n所有数的和容易求得,为sum=n(n+1)/2

可以采用容斥原理,即先求出总体的和sum

减去其中所有a的倍数的和suma和b的倍数的和sumb

再加上所有同时能被a和b整除的数的和sumab即可

1~n中能被a整除的最大数为[n/a]*a,能被b整除的最大数为[n/b]*b([ ]表示下取整)

又a和b互质,所以能同时被a和b整除的数为[n/(a*b)]*(a*b)

再通过求和公式就可以直接计算出suma、sumb和sumab

具体代码如下:

#include<stdio.h>

typedef long long int ll; // 定义长整型别名为ll,防止溢出

int main() {

    int n, a, b;

    scanf("%d %d %d", &n, &a, &b);

    ll sum = (ll)n * (n + 1) / 2; // 1~n所有数之和

    int ka = n / a, kb = n / b, kab = n / (a * b);

    ll suma = (ll)a * ka * (ka + 1) / 2; // a的倍数之和

    ll sumb = (ll)b * kb * (kb + 1) / 2; // b的倍数之和

    ll sumab = (ll)a * b * kab * (kab + 1) / 2; // ab的倍数之和

    printf("%lld\n", sum - suma - sumb + sumab);

    return 0;

}

运行结果如下:

符合示例输出,望采纳~

zhangsonglin_c
高粉答主

2022-09-26 · 醉心答题,欢迎关注
知道大有可为答主
回答量:3.7万
采纳率:83%
帮助的人:6693万
展开全部
int i,s=0;
for(i=1;i〈=n;i十十)
{if((i%a)&&(i%b))s十=i;}
printf("%d\n",s);
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式