简单的算法。无法做到正确

时间:2016-11-22 14:48:10

标签: java algorithm

问题

  

Yraglac最近决定尝试使用Soylent,这是一种膳食替代饮品,旨在满足普通成年人的所有营养需求。 Soylent不仅味道好,而且价格低廉,这对Yraglac来说非常重要,因为他目前的预算有限。每瓶提供400卡路里,因此建议每个人每天应消耗5瓶,总热量为2000。然而,Yraglac想知道如果他的每日卡路里需求与普通成年人不同,他应该消耗多少瓶。他只能消耗整数瓶子,至少需要消耗他每日的卡路里需求。

Src: https://open.kattis.com/problems/soylent

输入

第一行包含一个整数T≤1000,给出了测试用例的数量。每个测试用例由一行整数N(0≤N≤100000)组成,Yraglac每天需要的卡路里数。

输出

对于每个测试用例,输出一行,其中包含Yraglac当天需要消耗的瓶数。

示例输入

2 2000 1600

示例输出

5 4

我的尝试

public Soylent() {

    Scanner scan = new Scanner(System.in);
    int iterations = scan.nextInt();

    for (int i = 0; i < iterations; i++) {
        int calories = scan.nextInt();
        System.out.println((int) (Math.ceil(calories / 400)));
    }
}

我做错了什么?

2 个答案:

答案 0 :(得分:2)

这是错误的,因为您在int电话中使用Math.ceil

例如,如果您运行此代码:

public class Main {

    public static void main(String[] args) {
        System.out.println(Math.ceil(2500/400));
        System.out.println(Math.ceil(2500/400.0));
    }
}

您将获得此输出:

6.0
7.0

在第二次Math.ceil通话中,您实际上使用双打,因此2500/400的小数不会丢失。

更清楚地说明:

int result1 = 2500 / 400; //6.0
int ceiling1 = Math.ceil(result1); //6

double result2 = 2500 / 400; //6.0
int ceiling2 = Math.ceil(result2); //6

double result3 = 2500 / 400.0; //6,25
int ceiling3 = Math.ceil(result3); //7

double result4 = (double) 2500 / 400; //6.25
int ceiling4 = Math.ceil(result4); //7

因此,要修复代码,请将calories设为加倍,除以400.0或将calories / 400的结果转换为double

答案 1 :(得分:0)

作为Michael_T。说,卡路里是一个双倍而不是整数。谢谢!

public class Soylent {

public Soylent() {

    Scanner scan = new Scanner(System.in);
    int iterations = scan.nextInt();

    for (int i = 0; i < iterations; i++) {
        double calories = scan.nextDouble();
        System.out.println((int) (Math.ceil(calories / 400)));
    }
}