P5719 【深基4.例3】分类平均

P5719 【深基4.例3】分类平均


#include<bits/stdc++.h>

using namespace std;

int main(){
    int sum = 0;
    int n,k;
    cin >> n >> k;
    double a,b;
    for(int i = 0;i <= n;i ++){
        if(i % k == 0){
            sum += i;
        }
    }
    a = sum / (n / k);
    sum = (1 + n) * n / 2 - sum;
    b = sum / (n - n / k);
    cout << fixed << setprecision(1) << a << " " << b;
    return 0;
}

img

img


为什么最后B的那0.1没出来?

由于你的 sum,n,k 都是 int ,所以 a、b 会被强制转换成 int ,只要在sum前面加上 *1.0 就ok了
代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
    int sum = 0;
    int n, k;
    cin >> n >> k;
    double a, b;
    for(int i = 0; i <= n; i ++){
        if(i % k == 0){
            sum += i;
        }
    }
    a = sum * 1.0 / (n / k);
    sum = (1 + n) * n / 2 - sum;
    b = sum * 1.0 / (n - n / k);
    cout << fixed << setprecision(1) << a << " " << b;
    return 0;
}

因为a,b和sum的计算结果,都是用整数计算数来的,其小数部分会被忽略,在计算中转换下类型;

然后再将计算a和b的地方修改下即可。

修改如下:

参考链接:


【深基4.例3】分类平均 - 洛谷 https://www.luogu.com.cn/problem/P5719

 
  
  
 
 
#include<bits/stdc++.h>
 
using namespace std;
 // https://www.luogu.com.cn/problem/P5719
int main(){
    int sum = 0;
    int n,k;
    int knum=0; // 记录可以整除k的数的个数,初始赋值为0 
    cin >> n >> k;
    double a,b;
    
    for(int i = 1;i <= n;i ++){
        // 如果可以被区间[1,n]的数整除
        // 则将这个数累加到和sum中
        // 并且将可以整除的数量+1 
        if(i % k == 0){  
            sum += i;
            knum++;
        }
    }
    
    // 可以整除的数的平均数a 为 其和sum 除以 对应的数量knum 
    // sum乘以1.0,将整数转为double类型计算,以保留小数部分 
    a = sum*1.0 / knum;
    
    // https://zhidao.baidu.com/question/2274445572254343388.html
    // 不可以整除的数的平均值 为 1到n所有数的和 减去 可以整除的数的和sum 的差值, 除以 其数量 
    // 同上,乘以1.0,将整数转为double类型计算,以保留小数部分 
    b =  ((n*1+n*(n-1)*1.0/2)-sum)/(n-knum);
    
    cout << fixed << setprecision(1) << a << " " << b;
    return 0;
}
 
 
 
 

img

  • 建议你看下这篇博客👉 :洛谷【入门3】P5719 【深基4.例3】分类平均
  • 除此之外, 这篇博客: 洛谷 P5736 【深基7.例2】质数筛中的 输入输出样例 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 输入 #1复制

    5
    3 4 5 6 7

    输出 #1复制

    3 5 7

     方法一:数组运算

    #include<stdio.h>
    #include<math.h>
    int main()
    {
    	int n;
    	scanf("%d",&n);
    	int a[n];
    	int i,j;
    	for(i=0;i<n;i++){
    		scanf("%d",&a[i]);
    	}
    	for(i=0;i<n;i++){
    		int k=1;
    		for(j=2;j<=sqrt(a[i]);j++){
    			if(a[i]%j==0){
    				k=0; 
    				break;
    			}
    		}
    		if(k==1&&a[i]!=1){//注意排除1的情况
    			printf("%d ",a[i]);
    		}
    	}
    	return 0;
    }

     方法二:函数运算

    #include<stdio.h>
    #include<math.h>
    int search(int n)
    {
    	int i,k=1;
    	for(i=2;i<=sqrt(n);i++){
    		if(n%i==0){
    			k=0;
    			break;
    		}
    	}
    	if(k==1&&n!=1){
    		return n;
    	}
    	else{
    		return 0;
    	}
     } 
    int main()
    {
    	int n,m;
    	scanf("%d",&n);
    	int i=1;
    	while(i<=n){
    		scanf("%d",&m);
    		int k=search(m);
    		if(k!=0){
    			printf("%d ",k);
    		}
            i++;
    	}
    	return 0;
    }

    方法三:函数+数组运算 

    #include<stdio.h>
    #include<math.h>
    int search(int n)
    {
    	int i,k=1;
    	for(i=2;i<=sqrt(n);i++){
    		if(n%i==0){
    			k=0;
    			break;
    		}
    	}
    	if(k==1&&n!=1){
    		return n;
    	}
    	else{
    		return 0;
    	}
     } 
    int main()
    {
    	int n;
    	scanf("%d",&n);
    	int a[n];
    	int i,j;
    	for(i=0;i<n;i++){
    		scanf("%d",&a[i]);
    	}
    	int k;
    	for(i=0;i<n;i++){
    		k=search(a[i]);
    		if(k!=0){
    			printf("%d ",k);
    		}
    	}
    	return 0;
    }