来自洛谷网校:
https://www.luogu.com.cn/problem/P5719
思路一:
一个循环求出:1、能被16整除的数的和以及个数,2、不能被16整除的数的和以及个数。
代码如下:
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
int n,k,total1=0,sum1=0,total2=0,sum2=0;
cin>>n>>k;
for(int i=1;i<=n;i++){
if(i%k==0){
total1++;
sum1+=i;
}
else{
total2++;
sum2+=i;
}
}
printf("%.1lf %.1lf",1.0*sum1/total1,1.0*sum2/total2);
return 0;
}
但是像上面这样,程序的效率似乎并不高——循环要执行n次。
所以稍微改进一下,不要循环那么多次。
前面直接让它做k的倍数的加法,得到倍数的和sum1和个数total1。然后用数学的计算方法求出1到n的和,再减去sum1,由此得到的值是不能被k整除的数的和,至于不能被k整除的数的个数,那就是(n-total1)了。
代码如下:
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
int n,k,total1=0,sum1=0,total2=0,sum2=0;
cin>>n>>k;
for(int i=k;i<=n;i+=k){
total1++;
sum1+=i;
}
sum2=(1+n)*n/2-sum1;
total2=n-total1;
printf("%.1lf %.1lf",1.0*sum1/total1,1.0*sum2/total2);
return 0;
}