低效方式(人工注解)-适用新人
2026-01-02 12:09:00
发布于:重庆
28阅读
0回复
0点赞
首先需知道解题方式
再次说明题目描述
- 给定两个正整数 n 与 k
则:首先获取两个数
long long a;//用 long long 防止数值溢出
int b;
cin>>a>>b;//获取两个数
- 将从 1 到 n 之间的正整数
则:我们可以使用 for
for(int i=1;i<=n;i++){/* 历遍 1 到 n 之间的所有正整数 */}
- 所有 正整数 分为两类:
A 类:可以被 k 整除(即是 k 的倍数)的数
B 类:不能被 k 整除的数
则: 需要判断类型
| 类型 | 判断条件 |
|---|---|
| 被 k 整除的数 | 数值 % k == 0 |
| 不能被 k 整除的数 | 数值 % k != 0 |
- !: 当然有更好的方式 只要 判断 是否是 被 k 整除的数
if(i%k==0){ /* A 类 */ ;}else{ /* B 类 */;}
- 请分别输出 A 类与 B 类数的平均数
则:我们需要 A 类 的所有数值之和 和 A 类 的所有数值的数量(数组长度)
because: A 类 的所有数值之和 / A 类 的所有数值的数量(数组长度) = A 类 平均值
同理:我们还需要 B 类 的所有数值之和 和 B 类 的所有数值的数量(数组长度)
- 输出格式
一行输出两个实数,分别为 A 类与 B 类的平均数,保留 1 位小数,以一个空格分隔
printf("%.1lf",/*A 类 平均值*/);cout<<" ";printf("%.1lf",/*A 类 平均值*/);
- printf("%.1lf",): "%.1lf" 是 保留 1 位小数
- cout<<" "; 一个空格分隔
思路介绍完,接下来是完整代码
#include <cstdio>
#include<iostream>
using namespace std;
int main(){
long long n,nn=0,kk=0;/*nn 是A类的目前数值之和,kk 是B类的目前数值之和
n 是数组遍历范围(1 到 n 之间的所有正整数)*/
int k,A=0,B=0;// k 做 除数,A 是A类的目前数值的数量(数组长度),B 是B类的目前数值的数量
cin>>n>>k;//获取 数组长度 和 除数
for(int i=1;i<=n;i++){ //历遍 1 到 n 之间的所有正整数
if(i%k==0){//判断是否是 A 类 满足则执行
nn+=i;A++;
//增加 i 为A类的目前数值之和,增加 1 为A类的目前数值的数量(数组长度)
}else{//若不是 A 类 则是 B 类,不是 A 类 则执行
kk+=i;B++;
//增加 i 为B类的目前数值之和,增加 1 为B类的目前数值的数量(数组长度)
}}
double u=nn,m=kk;//转换方便做除
printf("%.1lf",u/A);cout<<" ";printf("%.1lf",m/B);}
// u/A = A 类数的平均数, m/B = B 类数的平均数
这里空空如也




有帮助,赞一个