Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.01.2023, 03:57   #1
Asperatys
Новичок
Джуниор
 
Регистрация: 19.01.2023
Сообщений: 1
По умолчанию Описать функцию IsPowerN, с её помощью найти количество степеней числа N в наборе чисел

Описать функцию IsPowerN(K, N) логического типа, возвращающую True, если целый
параметр K (> 0) является степенью числа N (> 1), и False в противном случае. Дано
число N (> 1) и набор из 10 целых положительных чисел. С помощью функции IsPowerN
найти количество степеней числа N в данном наборе.
Pascal
Asperatys вне форума Ответить с цитированием
Старый 19.01.2023, 08:01   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Код:
program PowerN;

uses SysUtils;

function IsPowerN(K: Cardinal; N: Cardinal): Boolean;
var
   T: Extended;
begin
   T := ln(K) / ln(N);
   Result := (T - Round(T)) = 0;
end;

VAR
  N: Cardinal;
  K: Cardinal;
  P: Integer;

BEGIN
  P := 0;
  Write('Input N = ');
  ReadLn(N);
  if N > 1 then begin
     Write('Input K = ');
     repeat
        ReadLn(K);
        if (K <> 0) and (IsPowerN(K, N))
           then inc(P);
     until K = 0;
     WriteLn('Count = ', P);
  end else WriteLn('Invalid N!');
END.
Как-то так. Ввод K заканчивается при вводе 0.

Последний раз редактировалось macomics; 19.01.2023 в 08:22. Причина: Перепутал порядок имен аргументов для функции
macomics вне форума Ответить с цитированием
Старый 22.01.2023, 22:30   #3
Пётр Седов
Форумчанин
 
Регистрация: 26.10.2022
Сообщений: 119
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Код:
function IsPowerN(K: Cardinal; N: Cardinal): Boolean;
var
   T: Extended;
begin
   T := ln(K) / ln(N);
   Result := (T - Round(T)) = 0;
end;
Это не всегда работает правильно. Например код:
Код:
program test;

function IsPowerN(K: Cardinal; N: Cardinal): Boolean;
var
   T: Extended;
begin
   T := ln(K) / ln(N);
   Result := (T - Round(T)) = 0;
end;

begin
  WriteLn(IsPowerN(128, 2));
end.
Вывод на консоль (Free Pascal 3.2.2, win32, debug mode):
Код:
FALSE
Пётр Седов вне форума Ответить с цитированием
Старый 22.01.2023, 22:35   #4
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Тогда так
Код:
function IsPowerN(K: Cardinal; N: Cardinal): Boolean;
var
   T: Double;
begin
   T := ln(K) / ln(N);
   Result := (T - Round(T)) = 0;
end;
https://godbolt.org/z/EaaaEYTKq
macomics вне форума Ответить с цитированием
Старый 23.01.2023, 04:57   #5
Пётр Седов
Форумчанин
 
Регистрация: 26.10.2022
Сообщений: 119
По умолчанию

macomics, а я бы здесь не стал связываться с floating-point-арифметикой, а написал бы обычный цикл:
Код:
function IsPowerN(k, n: cardinal): boolean;
var
  p: cardinal;
begin
  p := 1; { n в степени 0 }
  while true do begin
    if p >= k then begin
      result := p = k;
      exit;
    end;
    if p > high(cardinal) div n then begin { если p * n вызовет переполнение (то есть не влезет в тип cardinal) }
      result := false;
      exit;
    end;
    p := p * n;
  end;
end;
Пётр Седов вне форума Ответить с цитированием
Старый 23.01.2023, 13:23   #6
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Тогда не стоит в цикле выполнять деление для вычисление константы
Код:
function IsPowerN(k, n: cardinal): boolean;
var
  p, x: cardinal;
begin
  p := 1; x := high(cardinal) div n + 1
  if k < x then while (p < k) and (p < x) do p := p * n;
  result := p = k;
end;

Последний раз редактировалось macomics; 23.01.2023 в 13:27.
macomics вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
9. Заполнить текстовый файл целыми числами, полученными с помощью генератора случайных чисел. Найти количество четных чисел среди элементов файла с нечетными номерами. -Alone Помощь студентам 4 08.06.2018 17:30
Описать функцию DigitCount(K) целого типа, находящую количество цифр цело-го положительного числа K - PascalABC.NET ParkerVans Помощь студентам 7 21.11.2017 15:50
Дана непустая последовательность целых чисел. Найти: Сумму чисел, больших числа x и количество всех чётных чисел maksim97maksim Паскаль, Turbo Pascal, PascalABC.NET 1 09.04.2014 13:59
текст. числа, разделённые пробелами. Найти количество положительных чисел. Удалить строку с min количеством чисел (на С) lady_koshe4ka Помощь студентам 0 30.06.2011 12:20