Экономия 1 доллар Каждый день недели, но каждую неделю сумма увеличивается на 1 доллар [Назначение]

#java

Вопрос:

Допустим, вы копите деньги на покупку нового телефона. В течение первой недели вы экономите 1 доллар каждый день. В течение второй недели вы экономите по 2 доллара каждый день, и поэтому каждую неделю подряд вы добавляете еще 1 доллар. Это означает, что в течение 3-й недели вы будете экономить 3 доллара в день. Например, через 16 дней вы сэкономили бы 27 долларов (7 долларов за первую неделю, 14 долларов за вторую и 6 долларов за эти два дня третьей недели). Смотрите изображение ниже для более четкого объяснения: введите описание изображения здесь

Я хочу написать программу, которая вычислит общую сумму денег, которая была сохранена через N дней. Где N-количество дней, введенных пользователем. Ниже приведен мой код, но я не уверен, как его оптимизировать. Это работает при условии, что максимальное количество введенных дней-14, но, конечно, я хочу написать программу, чтобы она могла занять любое количество дней. Во время моего исследования я наткнулся на формулу n*(n 1)/2, но она работает только в том случае, если деньги откладывались еженедельно (например, 1 доллар за первую неделю, 2 доллара за вторую и т. Д.). Как объяснялось ранее, в моей проблеме деньги экономятся ежедневно. Мой код ниже: (Я новичок в Java, поэтому синтаксис может быть не идеальным)

 import java.util.Scanner;

public class App {
    public static void main(String[] args) throws Exception {
        
        int days;
        int savings = 0;

        Scanner input = new Scanner(System.in);
        
        System.out.print("Enter the number of days: ");
        days = input.nextInt();

        for(int i = 0; i < days; i  ){
            if(i < 7){
                savings  ;
            }
            if(7 <= i amp;amp; i <=14){
                savings  ;
                savings  ;
            }
    }

    System.out.println("Total Frank's savings (after "   days  " days): "   savings);
}

}

 

Комментарии:

1. На самом деле вы спрашиваете здесь о том, как преобразовать (математически сложное) рекуррентное отношение в выражение замкнутой формы . Это, по сути, математическая проблема, а не вопрос программирования.

2. Мой совет: 1) Если вам действительно нужно решение, сделайте математику самостоятельно. 2) Если вы не можете выполнить математику, спросите на сайте Maths stack exchange. 3) Не беспокойтесь. Предполагая, что ваш код дает правильный ответ, это просто прекрасно. (Это пустая трата времени на оптимизацию кода, который не нуждается в оптимизации.)

3. Можете ли вы придумать математическую операцию, которая превратила бы число дня в число недели? Так что дни 0..6 на 1-й неделе, 7..13 на 2-й неделе и т. Д.? Может быть, будет проще, если вы будете думать о неделях под номером 0..n

4. Хорошо, вот тебе подсказка. 7*1 7*2 7*3 ... 7*N = 7(1 2 3 ... N) . Как вы вычисляете сумму из 1 to N ? Теперь все, что вам нужно сделать, это беспокоиться о последней неполной неделе (если таковая существует).

5. @StephenC, ты совершенно прав. Надо было разместить это в математической стопке. Если бы я знал, как это решить, то написание кода не было бы проблемой.

Ответ №1:

 public static void main(String[] args) {
        int days = 16;
        int weeks = days / 7; // '/' means get the divider
        int savings = 0;
        int ans = 0;
        if (days % 7 == 0) {  // '%' means get the divider, when there's no reminder for day / 7
            for (int i = 1; i <= weeks; i  ) {
                savings  = 7 * i;
            }
        }
        else { // when there is reminder for day / 7
            for (int i = 1; i <= weeks; i  ) {
                int left = days % 7;
                ans  = 7 * i;
                savings = ans   (weeks   1) * left;
            }
        }
        
        System.out.println("saving is "   savings);
    }
 

Комментарии:

1. Дружеское напоминание от студента 4 курса CS: иногда вы можете распечатать значения параметров с каждого шага, чтобы проверить, получаете ли вы правильный результат или нет.

2. Для этого вам не нужны никакие петли. Это математическая задача.

3. Я не думаю, что ему/ей нужно учитывать сложность во времени, так что до тех пор, пока он/она получит ответ.

4. @Апрель — Абсолютно верно. Судя по всему, операция была задана как задание по программированию , а не по математике . Похоже, он был создан для того, чтобы научить операционную систему писать циклы. Поэтому, если в требованиях к заданию на самом деле не указано, что требуется O(1) решение, то O(N) решение 1) прекрасно и 2) вероятно, то, что ищет учитель.

5. (Похоже, у OP возникли проблемы с выяснением того, как заставить циклы работать, и они подумали, что могут сократить отладку своего циклического кода, найдя и реализовав уравнение замкнутой формы. Но это самый трудный способ решить проблему … для человека со средними математическими навыками.)