当前位置:新励学网 > 秒知问答 > c语言题求助

c语言题求助

发表时间:2024-07-21 05:45:59 来源:网友投稿

这道题中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

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

intmain(){

intn,a,b;

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

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

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

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

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

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

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

return0;

}

运行结果如下:

符合示例输出,望采纳~

免责声明:本站发布的教育资讯(图片、视频和文字)以本站原创、转载和分享为主,文章观点不代表本网站立场。

如果本文侵犯了您的权益,请联系底部站长邮箱进行举报反馈,一经查实,我们将在第一时间处理,感谢您对本站的关注!