首页 > 试题广场 >

小美的评分计算器

[编程题]小美的评分计算器
  • 热度指数:4102 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

美团对于商家的评价体系是1-5星评价体系,用户在完成订单之后可以对商家打1/2/3/4/5星,而在客户端上,商家的评级却不一定是整数,而是会显示小数点后的一位。很显然这就需要一个计算器了,小美拥有了一些商户的评价数据,希望可以计算出商家在客户端上显示出的评分。

这个评分的计算非常简单,就是对该商家的所有客户的星级评价做求一个平均,然后去尾法显示小数点后的一位即可,例如平均得分是3.55,则显示的是3.5。例如某商家获得了1-5星评价各一个,则显示的评分是(1+2+3+4+5)/5=3.0

如果商家没有获得评价,则显示0.0


输入描述:
输入包含5个整数,依次分别表示商家获得1星到5星的评价数量,每一种评价的数量都不大于1000。


输出描述:
输出仅包含一个保留一位的小数,表示商家在客户端上显示的评级。
示例1

输入

2 2 1 1 2

输出

2.8
直接把评分加起来求平均就行,然后通过字符串操作达到去尾法的效果
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] starCounter = br.readLine().trim().split(" ");
        int stars = 0;
        int starNum = 0;
        int count = 0;
        for(int i = 0; i < starCounter.length; i++){
            starNum = Integer.parseInt(starCounter[i]);
            stars += (i + 1)*starNum;
            count += starNum;
        }
        // 通过字符串操作达到去尾法的效果
        String content = stars*1.0 / count + "";
        content = content.substring(0, content.indexOf('.') + 2);
        System.out.println(content);
    }
}


发表于 2021-02-28 10:28:19 回复(0)
这个题目简单来说就是求平均数,然后只取到小数点第一位。所以,首先需要计算总人数,其次再计算总分数。然后相除即可。但是只获取第一位小数,可以先将数字转化为字符串,然后获取到小数点的下标,然后从0截取到下标的后一位即可。
import java.util.*;
import java.lang.*;
 
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        float count = 0;//总人数
        float score = 0;//总分数
         
         
        for (int i = 0; i < 5; i++) {
            int num= sc.nextInt();
            count += num;
            score += num*(i+1);
        }
         
        float x = score/count;
        String str = String.valueOf(x);
        int index = str.indexOf(".");
        str = str.substring(0,index+2);
        System.out.println(str);
    }
}


发表于 2022-07-21 13:38:42 回复(0)
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void (async function () {
    // Write your code here
    while ((line = await readline())) {
        let tokens = line.split(" ");
        let num = 0;
        let len = 0;
        tokens.map((item, index) => {
            len += Number(item);
            if (index == 0) {
                num += Number(item) * 1;
            }
            if (index == 1) {
                num += Number(item) * 2;
            }
            if (index == 2) {
                num += Number(item) * 3;
            }
            if (index == 3) {
                num += Number(item) * 4;
            }
            if (index == 4) {
                num += Number(item) * 5;
            }
        });
        let avg = num / len;
        let avg2 = avg.toString();
        avg2 = avg2.slice(0, avg2.indexOf(".") + 2);
        console.log(avg2);
    }
})();
javaScript的做法
发表于 2023-03-16 16:34:53 回复(0)

用java自带的DecimalFormat类,可以格式化输出任意浮点数。

import java.util.*;
import java.text.DecimalFormat;
import java.math.RoundingMode;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int one = sc.nextInt();
        int two = sc.nextInt();
        int three = sc.nextInt();
        int four = sc.nextInt();
        int five = sc.nextInt();
        int sum = one+two+three+four+five;
        int score = one+2*two+3*three+4*four+5*five;
        // 格式化为整数+小数点后一位
        DecimalFormat formater = new DecimalFormat("#.0");
        // 不要四舍五入
        formater.setRoundingMode(RoundingMode.FLOOR);
        double res = 0;
        if(sum != 0){
            res = 1.0*score/sum;
        }
        System.out.println(formater.format(res));
    }
}
发表于 2022-03-11 17:03:42 回复(2)
Java:题目最大的难点就是如何实现去尾法,提供两种思路
(1)先乘再除,利用floor函数达到去尾目的;
(2)利用BigDecimal类的setScale方法,通过设置ROUND_DOWN关键字实现去尾。
import java.util.Scanner;
import java.math.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int sum = 0;
        int num = 0;
        int arr[] = new int[5];
        int i = 0;
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextInt()) { // 注意 while 处理多个 case
            arr[i] = in.nextInt();
            i++;
        }

        for(int j = 0; j < 5; j++)
        {
            sum += ( j + 1) * arr[j];
            num += arr[j];
        }
        double ans = (double)sum / num;
        // BigDecimal b = new BigDecimal(ans);
        // ans = b.setScale(1, BigDecimal.ROUND_DOWN).doubleValue();  
        ans = (double) Math.floor(ans * 10) / 10;

        System.out.printf("%.1f", ans);
    }
}


发表于 2023-04-20 00:38:44 回复(0)
package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {
	reader := bufio.NewReader(os.Stdin)
	str, _ := reader.ReadString('\n')
	str = str[:len(str)-1]
	strSlice := strings.Split(str, " ")
	arr := make([]int, 5)
	count := 0
	sum := 0
	for i := 0; i < 5; i++ {
		arr[i], _ = strconv.Atoi(strSlice[i])
		count += arr[i]
		sum += arr[i] * (i + 1)
	}
	fsum := float64(sum) / float64(count)
	ans := int(fsum * 10)
	fans := fmt.Sprintf("%.1f", float64(ans)/10)
	fmt.Println(fans)
}

发表于 2022-08-05 16:57:52 回复(0)
#include<iostream>
#include<sstream>
#include<iomanip>
using namespace std;

int main() 
{
    int i = 1;
    int num = 0; // 数量
    int sum_num1 = 0; // 总分级
    int sum_num2 = 0; // 总数量
    while(i<6)
    {
        cout << "请输入第" << i << "个整数" << endl;
        cin >> num;
        sum_num1 += num * i;
        sum_num2 += num;
        i++;
    }
    string str_num1, str_num2;
    str_num1 = to_string( sum_num1);
    str_num2 = to_string(sum_num2);
    float num1 = atof(str_num1.c_str());
    float num2 = atof(str_num2.c_str());
    cout << fixed << setprecision(1);
    cout <<  (float)((int)(10 *num1 / num2)) / 10;

}
发表于 2022-08-04 09:21:23 回复(0)
js解法
let arr = readline().split(' ').map(Number);
let test = (arr) => {
  let sum = 0,
      count = arr.reduce((prev, cur) => prev+cur),
      res;
  for (let i = 0; i < arr.length; i++) {
    sum += arr[i] * (i + 1);
  }
  res = sum/count;
  return res.toString().slice(0, 3);
};

console.log(test(arr));


发表于 2022-07-30 17:01:22 回复(0)
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        float[] n = new float[5];
        int peopleNum = 0;
        float ans = 0;
        float sum = 0;
        for (int i = 0; i < 5; i++) {
            n[i] = sc.nextInt();
            peopleNum+=n[i];//人数
            sum+=(n[i]*(i+1));//总分
        }
        ans = sum/peopleNum;
        System.out.println(String.format("%.1f",ans-0.05));//舍去后面的数字
    }
}

发表于 2022-04-09 01:46:30 回复(0)
level = [1,2,3,4,5]  #评分等级
input_1 = list(map(int, input().split(" ")))    #输入
score = [level[i]*input_1[i] for i in range(5)]    #评分等级与数量相乘
if sum(score) == 0:    #若无评分,输出为0.0
    print(0.0)
else:
    print(int(sum(score)/sum(input_1)*10)/10)

发表于 2022-03-12 11:07:05 回复(1)
#include<bits/stdc++.h>
using namespace std;
int main()
{
    string line,temp;
    vector<int> vec;
    while(getline(cin, line))
    {
        if(line.size()==0)
        {
            cout<<"0.0"<<endl;
        }
        istringstream record(line);
        while(record>>temp)
        {
            vec.push_back(stoi(temp));
        }
    }
    int totalnum=0;
    int sumSorce=0;
    for(int i=0;i<vec.size();i++)
    {
        totalnum+=vec[i];//总次数
        sumSorce+=(i+1)*vec[i];//总分
    }
   // cout<<totalnum<<" "<<sumSorce<<endl;
    double tem=(double)sumSorce/totalnum;
    string str=to_string(tem);
    cout<<str.substr(0,3)<<endl;
   
    return 0;

}
发表于 2021-09-15 20:09:52 回复(0)
int, double转换
import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int add = 0;
        int cnt = 0;
        for(int i=1;i<=5;i++){
            int n = sc.nextInt();
            cnt = cnt+n;
            add = add+i*n;
        }
        int r1 = add/cnt;
        double t = (double)add;
        int r2 = (int)((t/cnt-r1)*10);
        System.out.println(r1+"."+r2);
    }
}
发表于 2021-08-13 20:49:28 回复(0)

import java.util.*;



public class Main 
{    
    
    public static void main(String[] args) 
        {
            Scanner sc = new Scanner(System.in);
            int num = 0;
            int one = sc.nextInt();
            int two = sc.nextInt();
            int three = sc.nextInt();
            int four = sc.nextInt();
            int five = sc.nextInt();
            num = one + two + three + four + five;
            double result = (double)(one + 2 * two + 3 * three + 4 * four + 5 * five)/num;
            String format = String.format("%.2f", result);
            System.out.println(format.substring(0, format.length() - 1));
            
        }

}

发表于 2021-05-09 00:10:08 回复(0)
import java.util.Scanner; public class Main { public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);  int sum = 0;  int in, x;  float num = 0;  for (int i = 1; i < 6; i++) {
            in = sc.nextInt();
            x = in * i;
            sum += x;
            num = num + in;
        }  float zhi = sum / num;
        String s = String.valueOf(zhi);
        System.out.println(s.substring(0,s.indexOf(".")+2));
    }
}

发表于 2021-04-17 17:28:56 回复(0)
import java.util.Scanner; public class Main { public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);  int sum = 0;  int in, x;  float num = 0;  for (int i = 1; i < 6; i++) {
            in = sc.nextInt();
            x = in * i;
            sum += x;
            num = num + in;
        }  float zhi = sum / num;
        String s = String.valueOf(zhi);
        System.out.println(s.substring(0,s.indexOf(".")+2));
    }
}

发表于 2021-04-17 17:28:56 回复(0)
挺简单的,加起来求平均就行,直接暴力X10转int再除10去尾,python很适合这种
a, b, c, d, e =map(int, input().split())
ifa ==b ==c ==d ==e ==0:
    print(0.0)
else:
    s =a +(2*b) +(3*c) +(4*d) +(5*e)
    s =s /(a +b +c +d +e)
    s =int(s *10) /10
    print('{:.1f}'.format(s))

编辑于 2021-03-26 22:33:42 回复(0)
  • java的大数可以解决很多问题
    import java.util.*;
    import java.math.*;
    public class Main{
      public static void main(String[] args) {
          Scanner sc = new Scanner(System.in);
          double ans = 0;
          int num = 0;
          for (int i = 1; i < 6; i++) {
              int cur = sc.nextInt();
              num += cur;
              ans += (cur * i); 
          }
          ans = ans / num;
          BigDecimal bg = new BigDecimal(ans).setScale(1, RoundingMode.DOWN);
          System.out.println(bg.doubleValue());
      }
    }
编辑于 2021-03-19 22:21:38 回复(0)
score = list(map(int, input().split()))
ans = str((1 * score[0] + 2 * score[1] + 3 * score[2] + 4 * score[3] + 5 * score[4]) / sum(score))
ans = float(ans[:ans.index('.') + 2])

print(ans)

发表于 2021-03-12 17:07:25 回复(0)
public static void main(String[] args) throws IOException {
    BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
    String[] s = bf.readLine().trim().split(" "); //String[] s ={"31","40","64","100","35"};  double avg=getres(s);
    System.out.println((float) (avg/10));//先乘以10,再除以10,达到去尾
} public static double getres(String[] s){ int total=0,size=0; for(int i=0;i<s.length;i++){
        total+=Integer.parseInt(s[i])*(i+1);
        size+=Integer.parseInt(s[i]);
    } double avg=(double)total/size;
    avg=(int)(avg*10); return avg;
}

发表于 2021-03-07 20:40:03 回复(0)
#include <bits/stdc++.h>
 
using namespace std;
 
int main() {
    int totalStar = 0, totalNum = 0;
    for (int i = 1; i <= 5; ++i) {
        int num;
        cin >> num;
        totalNum += num;
        totalStar += (i * num * 10);
    }
    if (!totalNum) {
        printf("0.0\n");
        return 0;
    }
    float res = totalStar / totalNum;
    res /= 10;
    //printf("%.1f\n", res);
    cout << fixed << setprecision(1) << res << endl;
    return 0;
}

发表于 2021-03-02 11:38:14 回复(2)