Программа, которая подсчитывает максимальное количество орлов и решек

#java #for-loop #if-statement #nested-if

#java #for-цикл #if-оператор #вложенный — если

Вопрос:

Это то, что у меня есть до сих пор, но я не могу понять, как это сделать. Пока я могу хранить только общее количество перевернутых орлов и решек.

 import java.util.*;
class Main {
    public static void main(String[] args) {
        int heads = 0, tails = 0;
        int usernum;
        int hc=0;

        Scanner scan = new Scanner(System.in);
        Coin myCoin = new Coin();
        System.out.println("The number flips: ");
        usernum=scan.nextInt();
        for (int count = 1; count <= usernum; count  )//this is where I'm having the most trouble, as I can't figure out how to store the greatest streak for heads and tails.
        {
            myCoin.flip();//generates either 1 or 0
            if (myCoin.isHeads())//checks if the integer is equal to 1 (which is heads in this case)
            {
                heads  ;
                System.out.println("Heads");
                if (heads>=hc)
                   hc  ;
            }else{
                tails  ;
                hc=0;
                System.out.println("Tails");
            }
        }
        System.out.println("Heads: "   heads);
        System.out.println("Tails: "   tails);
    }
}
 

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

1. johndoe123 — Есть какие-либо обновления?

2. Спасибо, некоторое время назад я наконец-то приступил к работе.

Ответ №1:

Следите за тремя переменными: headStreak , tailStreak , и maxStreak , все инициализированы как 0. Внутри вашего цикла for, когда вы сталкиваетесь с головой, вам нужно сделать 3 вещи:

  1. увеличить headStreak
  2. Если tailStreak больше maxStreak , установите maxStreak значение tailStreak
  3. установите tailStreak значение 0.

Сделайте то же самое, когда столкнетесь с хвостами, за исключением замены headStreak на tailStreak и наоборот.

После цикла for: System.println(Math.max(Math.max(headStreak, tailStreak), maxStreak)) . Если вы правильно выполнили шаги, это должно сработать.

Ответ №2:

Для решения этой проблемы вы можете применить следующий алгоритм:

  1. Вы можете использовать две переменные, скажем headStreak , и tailStreak для отслеживания соответствующих полос. Когда полоса прерывается, сбросьте их на 1 .
  2. Вы можете использовать две переменные, скажем maxTailStreak , и maxHeadStreak для отслеживания максимального количества соответствующих полос.
  3. Вы можете использовать переменную, скажем last , для отслеживания результата последнего переворота. Начните с last = -1 и установите для него значение 1 в случае Heads , и 0 в случае Tails .

ДЕМОНСТРАЦИЯ:

 import java.util.Random;
import java.util.Scanner;

class Coin {
    Random random = new Random();
    int resu<

    public void flip() {
        result = random.nextInt(2);
    }

    public boolean isHeads() {
        return result == 1;
    }
}

public class Main {
    public static void main(String[] args) {
        int heads = 0, tails = 0;
        int usernum;
        int headStreak = 0, tailStreak = 0, last = -1, maxTailStreak = 0, maxHeadStreak = 0;

        Scanner scan = new Scanner(System.in);
        Coin myCoin = new Coin();
        System.out.print("The number flips: ");
        usernum = scan.nextInt();
        for (int count = 1; count <= usernum; count  ) {
            myCoin.flip();
            if (myCoin.isHeads()) {
                heads  ;
                System.out.println("Heads");
                if (last == 1 || last == -1) {
                    headStreak  ;
                    if (headStreak >= maxHeadStreak) {
                        maxHeadStreak = headStreak;
                    }
                } else {
                    headStreak = 1;
                }
                last = 1;
            } else {
                tails  ;
                System.out.println("Tails");
                if (last == 0 || last == -1) {
                    tailStreak  ;
                    if (tailStreak >= maxTailStreak) {
                        maxTailStreak = tailStreak;
                    }
                } else {
                    tailStreak = 1;
                }
                last = 0;
            }
        }
        System.out.println("Heads: "   heads);
        System.out.println("Tails: "   tails);
        System.out.println("The longest streak of Heads: "   maxHeadStreak);
        System.out.println("The longest streak of Tails: "   maxTailStreak);
    }
}
 

Пробный запуск:

 The number flips: 10
Tails
Tails
Tails
Tails
Tails
Heads
Heads
Heads
Tails
Tails
Heads: 3
Tails: 7
The longest streak of Heads: 3
The longest streak of Tails: 5
 

Ответ №3:

Вам нужно установить счетчик для каждой серии и получить максимум примерно так:

 public static void main(String[] args) {

    
    int heads = 0, tails = 0;
    int usernum;
    int longestHeadStreak = 0, currentHeadStreak = 0, longestTailStreak = 0, currentTailStreak = 0  ;

    Scanner scan = new Scanner(System.in);
    Coin myCoin = new Coin();
    System.out.println("The number flips: ");
    usernum=scan.nextInt();
    for (int count = 1; count <= usernum; count  )//this is where I'm having the most trouble, as I can't figure out how to store the greatest streak for heads and tails.
    {
        myCoin.flip();//generates either 1 or 0
        if (myCoin.isHeads())//checks if the integer is equal to 1 (which is heads in this case)
        {
            currentTailStreak = 0;
            currentHeadStreak   ;
            System.out.println("Heads");
            if (currentHeadStreak>longestHeadStreak)
               longestHeadStreak=currentHeadStreak;
        }else{
            if (currentTailStreak>longestTailStreak) {
                longestTailStreak=currentTailStreak;
            }
            currentHeadStreak = 0;
            currentTailStreak  ;
            System.out.println("Tails");
        }
    }
    System.out.println("Max streak of Heads: "   longestHeadStreak);
    System.out.println("Max streaks of Tails: "   longestTailStreak);
}