В мире программирования существует множество увлекательных и интересных задач, и одной из них является создание программ, способных угадать число, задуманное человеком. Эта задача не только проверяет навыки программиста в разработке логики и алгоритмов, но также делает программу интерактивной и увлекательной для пользователей. В данной статье мы рассмотрим процесс создания программы, угадывающее число, выбранное пользователем из заданного диапазона.
Теория
Метод бинарного поиска — это эффективный алгоритм поиска элемента в отсортированном массиве или списке данных. Он работает путем деления массива или списка на две равные части и сравнения искомого элемента с элементом в середине. Если элемент найден, поиск завершается. В противном случае выбирается одна из двух подмассивов для дальнейшего поиска, и процесс повторяется до тех пор, пока элемент не будет найден или пока не останется один элемент в массиве.
Алгоритм метода бинарного поиска:
- Задать левую (left) и правую (right) границы поиска в массиве (или списке). Начальные значения будут равны 0 и длине массива минус 1.
- Пока левая граница (left) меньше или равна правой границе (right), выполняй следующие шаги:
- a. Вычислить средний индекс (middle) как (left + right) / 2.
- b. Сравнить элемент в среднем индексе (array[middle]) с искомым элементом.
- c. Если элемент в среднем индексе равен искомому элементу, то элемент найден, и поиск завершается. Вернуть middle.
- d. Если элемент в среднем индексе больше искомого элемента, обновить правую границу (right) на (middle — 1).
- e. Если элемент в среднем индексе меньше искомого элемента, обновить левую границу (left) на (middle + 1).
- Если элемент не был найден после завершения цикла, вернуть -1 (или другое значение, которое указывает на отсутствие элемента).
Этот алгоритм обеспечивает эффективный поиск в упорядоченных данных, и его сложность составляет O(log n), где n — количество элементов в массиве или списке.
C++
Пример программы на C++, которая отгадывает число, задуманное пользователем от 1 до 100, используя не более семи попыток:
#include <iostream> int main() { int min = 1; int max = 100; int attempts = 0; char answer; std::cout << "Загадайте число от 1 до 100." << std::endl; while (true) { int guess = (min + max) / 2; attempts++; std::cout << "Ваше число " << guess << "? (y/n): "; std::cin >> answer; if (answer == 'y' || answer == 'Y') { std::cout << "Программа угадала ваше число " << guess << " за " << attempts << " попыток." << std::endl; break; } else if (answer == 'n' || answer == 'N') { std::cout << "Ваше число меньше " << guess << "? (y/n): "; std::cin >> answer; if (answer == 'y' || answer == 'Y') { max = guess - 1; } else { min = guess + 1; } } else { std::cout << "Пожалуйста, ответьте 'y' (да) или 'n' (нет)." << std::endl; } if (attempts >= 7) { std::cout << "Программа не смогла угадать число. Попробуйте еще раз." << std::endl; break; } } return 0; }
Эта программа использует метод бинарного поиска для угадывания числа, задуманного пользователем. Она задает вопросы и определяет, больше или меньше задуманное число, чем текущее предположение. Программа завершает выполнение, когда угадывает число или количество попыток достигает семи.
C#
using System; namespace GuessTheNumber { class Program { static void Main(string[] args) { int min = 1; int max = 100; int attempts = 0; string answer; Console.WriteLine("Загадайте число от 1 до 100."); while (true) { int guess = (min + max) / 2; attempts++; Console.Write($"Ваше число {guess}? (y/n): "); answer = Console.ReadLine(); if (answer.Equals("y", StringComparison.OrdinalIgnoreCase)) { Console.WriteLine($"Программа угадала ваше число {guess} за {attempts} попыток."); break; } else if (answer.Equals("n", StringComparison.OrdinalIgnoreCase)) { Console.Write($"Ваше число меньше {guess}? (y/n): "); answer = Console.ReadLine(); if (answer.Equals("y", StringComparison.OrdinalIgnoreCase)) { max = guess - 1; } else { min = guess + 1; } } else { Console.WriteLine("Пожалуйста, ответьте 'y' (да) или 'n' (нет)."); } if (attempts >= 7) { Console.WriteLine("Программа не смогла угадать число. Попробуйте еще раз."); break; } } } } }
Python
def main(): min_num = 1 max_num = 100 attempts = 0 print("Загадайте число от 1 до 100.") while True: guess = (min_num + max_num) // 2 attempts += 1 print(f"Ваше число {guess}? (y/n): ") answer = input().strip().lower() if answer == 'y': print(f"Программа угадала ваше число {guess} за {attempts} попыток.") break elif answer == 'n': print(f"Ваше число меньше {guess}? (y/n): ") answer = input().strip().lower() if answer == 'y': max_num = guess - 1 else: min_num = guess + 1 else: print("Пожалуйста, ответьте 'y' (да) или 'n' (нет).") if attempts >= 7: print("Программа не смогла угадать число. Попробуйте еще раз.") break if __name__ == "__main__": main()
Java
import java.util.Scanner; public class GuessTheNumber { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int min = 1; int max = 100; int attempts = 0; String answer; System.out.println("Загадайте число от 1 до 100."); while (true) { int guess = (min + max) / 2; attempts++; System.out.print("Ваше число " + guess + "? (y/n): "); answer = scanner.nextLine().trim().toLowerCase(); if (answer.equals("y")) { System.out.println("Программа угадала ваше число " + guess + " за " + attempts + " попыток."); break; } else if (answer.equals("n")) { System.out.print("Ваше число меньше " + guess + "? (y/n): "); answer = scanner.nextLine().trim().toLowerCase(); if (answer.equals("y")) { max = guess - 1; } else { min = guess + 1; } } else { System.out.println("Пожалуйста, ответьте 'y' (да) или 'n' (нет)."); } if (attempts >= 7) { System.out.println("Программа не смогла угадать число. Попробуйте еще раз."); break; } } scanner.close(); } }
Pascal
program GuessTheNumber; var min, max, guess, attempts: Integer; answer: Char; begin min := 1; max := 100; attempts := 0; Writeln('Загадайте число от 1 до 100.'); while True do begin guess := (min + max) div 2; Inc(attempts); Write('Ваше число ', guess, '? (y/n): '); Readln(answer); if (answer = 'y') or (answer = 'Y') then begin Writeln('Программа угадала ваше число ', guess, ' за ', attempts, ' попыток.'); Break; end else if (answer = 'n') or (answer = 'N') then begin Write('Ваше число меньше ', guess, '? (y/n): '); Readln(answer); if (answer = 'y') or (answer = 'Y') then max := guess - 1 else min := guess + 1; end else begin Writeln('Пожалуйста, ответьте ''y'' (да) или ''n'' (нет).'); end; if attempts >= 7 then begin Writeln('Программа не смогла угадать число. Попробуйте еще раз.'); Break; end; end; end.
JavaScript
function guessTheNumber() { let min = 1; let max = 100; let attempts = 0; alert("Загадайте число от 1 до 100."); while (true) { let guess = Math.floor((min + max) / 2); attempts++; let answer = prompt(`Ваше число ${guess}? (y/n):`).toLowerCase(); if (answer === 'y') { alert(`Программа угадала ваше число ${guess} за ${attempts} попыток.`); break; } else if (answer === 'n') { let hint = prompt(`Ваше число меньше ${guess}? (y/n):`).toLowerCase(); if (hint === 'y') { max = guess - 1; } else { min = guess + 1; } } else { alert("Пожалуйста, ответьте 'y' (да) или 'n' (нет)."); } if (attempts >= 7) { alert("Программа не смогла угадать число. Попробуйте еще раз."); break; } } } guessTheNumber();
PHP
<!DOCTYPE html> <html> <head> <title>Угадай число</title> </head> <body> <p>Угадайте число от 1 до 100</p> <p>Загадайте число, и программа будет пытаться угадать его.</p> <?php $min = 1; $max = 100; $attempts = 0; echo '<p>Загадайте число от ' . $min . ' до ' . $max . '.</p>'; while (true) { $guess = floor(($min + $max) / 2); $attempts++; echo '<p>Ваше число ' . $guess . '? (y/n):</p>'; $answer = strtolower(trim(fgets(STDIN))); if ($answer === 'y') { echo '<p>Программа угадала ваше число ' . $guess . ' за ' . $attempts . ' попыток.</p>'; break; } elseif ($answer === 'n') { echo '<p>Ваше число меньше ' . $guess . '? (y/n):</p>'; $hint = strtolower(trim(fgets(STDIN))); if ($hint === 'y') { $max = $guess - 1; } else { $min = $guess + 1; } } else { echo '<p>Пожалуйста, ответьте "y" (да) или "n" (нет).</p>'; } if ($attempts >= 7) { echo '<p>Программа не смогла угадать число. Попробуйте еще раз.</p>'; break; } } ?> </body> </html>