Главная страница · Вход· Регистрация· Новые сообщения · Участники · Общие Правила · Поиск · RSS · ]

  • Страница 1 из 1
  • 1
HELP!!! HELP!!
Trinux Дата: Пятница, 2009 Мар 13, 18:28 | Сообщение # 1
Старожил
Группа: Проверенные
Сообщений: 301
Награды: 0
Репутация: 12
Статус: Offline
Короче кому не лень, и кто знает как это делать, подскажите плиззз))

1. Написать программу, вычисляющую целую отрицательную степень числа.

2. Натуральное число, в записи которого N цифр, называется числом Армстронга. Если сумма его цифр возведённая в степень N, равна самому числу. Найти все такие числа от 1 до K.

Вот такая пижня...


Делай сегодня то, что другие не хотят, завтра будешь жить так, как другие не могут.
нет доступа
kolum Дата: Понедельник, 2009 Мар 16, 12:31 | Сообщение # 2
Новичок
Группа: Пользователи
Сообщений: 5
Награды: 0
Репутация: 0
Статус: Offline
2.
Quote
данную задачу можно было решить "в лоб", т.е. сделать простой перебор всех чисел и каждое число проверить. При этом на весьма солидной машине программа могла бы работать достаточно долго. Если бы цель задания заключалась только в нахождении чисел Армстронга, а не в составлении универсальной программы, разработка которой могла бы занимать большое время, то конечно, лучше было бы за 10 минут написать и 3 часа подождать.

Идея уменьшения класса исследуемых чисел заключается в следующем : можно делать перебор не самих чисел, а значений, которые могут получаться в результате степенной суммы ( т.е. суммы цифр числа, возведенных в степень числа цифр этого числа ). Здесь используется следующее свойство : от перемены цифр местами в числе степенная сумма не меняется. Т.е. например, незачем рассматривать все числа из класса : 135, 153, 315, 351, 531 и 513; достаточно рассмотреть одно из них, например, число 135; вычислить его степенную сумму : (135)ст = 153, а потом лишь убедиться в том что число 153 - это число Армстронга. Этот метод снижает число перебираемых чисел почти в N! раз. Сам же перебор осуществляется довольно просто : рассматриваются все числа, у которых любая цифра не меньше предыдущей и не больше последующей. Например: 12, 1557, 333 и т.д.

Итак, вышеописанный метод снизил число перебираемых чисел с 109 до приблизительно 200000. Но это не все на чем стоит остановливаться. Можно применить еще одну хитрость, которая заключается в следующем : можно значительно ускорить вычисление степенной суммы. Можно заметить, что при вычислениях часто приходится многократно возводить некоторое число в некоторую степень. Чтобы это оптимизировать вводится двухмерный массив, в i-ой строке и j-ом столбце которого находится значение степенной суммы i с основанием j (например, Degree[123,j] = 1j + 2j + 3j ). Таким образом , используется значение массива Degree[i,j]. Это существенно ускоряет процесс вычисления, если это сравнивать с некоторым процессом, в котором используется функция Degree(i,j), каждый раз вычисляющая значение ij. Для вычисления выражения 10j аналогичнo используется массив Degree10. Нужно заметить, что такая операция возведения в степень в программе вы полняется более 10000 раз; матрица Degree заполняется в начале программы, где операция возведения i в степень j выполняется около 8000 раз.

Code
PROGRAM Primer_1;     
var i,k,s,p,n: Integer;     
       BEGIN     
         Write('Введите M '); Readln(m);     
          For i:=1 to M do     
            begin     
              s:=0; k:=i; n:=0;     
              While k<>0 do     
                begin k:=k DIV 10; n:=n+1 end;     
                  k:=i;     
                  While k<>0 do     
                  begin p:=k MOD 10; k:=k DIV 10;     
                    If p<>0 then s:=Trunc (s+Exp(n*Ln(p)))     
                  end;     
                  If s=f then WriteLn (f)
           end;     
END.

1. этож элементарно.. http://www.rsdn.ru/article/alg/fastpow.xml

Сообщение отредактировал kolum - Понедельник, 2009 Мар 16, 12:40
нет доступа
Trinux Дата: Четверг, 2009 Мар 19, 20:34 | Сообщение # 3
Старожил
Группа: Проверенные
Сообщений: 301
Награды: 0
Репутация: 12
Статус: Offline
Чувак ты пробывал проверять эту прогу? И мне это в ПАСКАЛЕ надо

Делай сегодня то, что другие не хотят, завтра будешь жить так, как другие не могут.
нет доступа
kolum Дата: Пятница, 2009 Мар 20, 08:04 | Сообщение # 4
Новичок
Группа: Пользователи
Сообщений: 5
Награды: 0
Репутация: 0
Статус: Offline
проверять не пробовал, нет у меня паскаля, но алгоритм понятен.

Quote
И мне это в ПАСКАЛЕ надо

А это на ЧЁМ? wacko
нет доступа
kolum Дата: Пятница, 2009 Мар 20, 08:58 | Сообщение # 5
Новичок
Группа: Пользователи
Сообщений: 5
Награды: 0
Репутация: 0
Статус: Offline
Скачал tp7, проверил.. фигня какая-то smile Если еще надо, то вечерком помозгую - нарисую.
нет доступа
kolum Дата: Пятница, 2009 Мар 20, 09:06 | Сообщение # 6
Новичок
Группа: Пользователи
Сообщений: 5
Награды: 0
Репутация: 0
Статус: Offline
А вобще, вот нашел, проверил все рабочее

Function IsArmstrong(n: LongInt): Boolean;
Возвращает True если переданное ей в качестве аргумента число является числом Армстронга
Procedure GetArmstrongs(n: integer);
Распечатывает все n-значные числа Армстронга

Code

function Power(n, k: Integer): LongInt;
var
  p: LongInt; i: Word;
begin
  p := 1;
  for i := 1 to k do p := p * n;
  Power := p
end;

function IsArmstrong(n: LongInt): Boolean;
var
  Weight: array[0 .. 9] of LongInt;
  i, j: Integer; s: LongInt;
begin
  i := -1; s := n;
  while s > 0 do begin
   Inc(i);
   Weight[i] := s mod 10;
   s := s div 10
  end;
   
  for j := 0 to i do
   s := s + Power(Weight[j], Succ(i));
   
  IsArmstrong := (s = n)
end;
   
procedure GetArmstrongs(n: integer);
var
  Weight: array[0 .. 9] of LongInt;
  k, x, min, max, s, p: LongInt;
begin
  for k := 0 to 9 do
   Weight[k] := Power(k, n);
  min := Power(10, Pred(n));
  max := Pred(10 * min);
   
  for x := min to max do begin
   p := x; s := 0;
   for k := 1 to n do begin
    Inc(s, Weight[p mod 10]);
    p := p div 10
   end;
    
   if s = x then WriteLn(x, ' - Armstrong')
  end;
end;

{
  Пример использования
}
var
  n: 1 .. 9;
begin
  repeat
   Write('n [1 .. 9] = '); ReadLn(n)
  until n in [1 .. 9];
  GetArmstrongs(n);
    
  WriteLn('1741725: ', isArmstrong(1741725))
end.
нет доступа
Trinux Дата: Пятница, 2009 Мар 20, 20:40 | Сообщение # 7
Старожил
Группа: Проверенные
Сообщений: 301
Награды: 0
Репутация: 12
Статус: Offline
=) эт тоже нашёл =) но всё равно спасибо!
а вот это про отрицательную степень чёт ваще немогу понять...


Делай сегодня то, что другие не хотят, завтра будешь жить так, как другие не могут.
нет доступа
kolum Дата: Вторник, 2009 Мар 24, 12:26 | Сообщение # 8
Новичок
Группа: Пользователи
Сообщений: 5
Награды: 0
Репутация: 0
Статус: Offline
Code
program stepen;
function Power(Base, Exponent: real): real;

begin
   if Exponent = 0 then
     power := 1               { n**0 = 1 }
   else if (Base = 0) and (Exponent > 0) then
     power := 0               { 0**n = 0, n > 0 }
   else if (Exponent > 0) then
     power := Exp(Exponent * Ln(Base))
   else
     power := 1 / Exp(Exponent * Ln(Base))
end;

begin
writeln(power(10,-2));
readln;
end.
нет доступа
DeathCloun Дата: Вторник, 2009 Мар 24, 19:23 | Сообщение # 9
Клоун Форума
Группа: Проверенные
Сообщений: 1888
Награды: 8
Репутация: 57
Статус: Offline
Ааааааааааа!!!!!!!!МОЗГИ!!!!!!!!!!!!!!!!!!!!*БДДЫДЫДЫЩЬ!!!!!!!!!!!*

я лучший, шикарный миллионер - молодец!
нет доступа
  • Страница 1 из 1
  • 1
Поиск:

 
Информационный Интернет портал города Советская Гавань 2006-2024 ©
Перепечатка материалов допускается только со ссылкой на сайт,
www.sovgavan.ru, если не указана иная
Copyright: Арсений Вотинцев 2006-2024; Site development and support: Арсений Вотинцев & Виктор Семенов;  Logo design: ID; Администрация сайта | Хостинг от uCoz