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 И мне это в ПАСКАЛЕ надо А это на ЧЁМ?
|
нет доступа |
| |
kolum |
Дата: Пятница, 2009 Мар 20, 08:58 | Сообщение # 5 |
Новичок
Группа: Пользователи
Сообщений: 5
Награды: 0
Репутация: 0
Статус: Offline
| Скачал tp7, проверил.. фигня какая-то Если еще надо, то вечерком помозгую - нарисую.
|
нет доступа |
| |
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
| Ааааааааааа!!!!!!!!МОЗГИ!!!!!!!!!!!!!!!!!!!!*БДДЫДЫДЫЩЬ!!!!!!!!!!!*
я лучший, шикарный миллионер - молодец!
|
нет доступа |
| |
|