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

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

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.12.2010, 17:41   #1
kabum13
 
Регистрация: 10.12.2010
Сообщений: 7
По умолчанию нахождение чисел Армстронга

Задача: Натуральное число из N цифр является числом Армстронга, если сумма его цифр, взведенных в N-ю степень, равна самому числу (как, например, 153 = 1^3 + 5^3 + 3^3). Получить все числа Армстронга, состоящие из двух, трех и четырех цифр.
Преподавателю нужно чтоб в задаче присутствовала работа только с числами, то есть, чтобы она работала без таких функций как Len, Left, Right и т.д. Только совершенно не зню как это число армстронга правильно сформулировать в коде.

Есть вот такой вариант, но он не работает

Private Sub CommandButton1_Click()
Dim q, L, S, N, k, a As Integer
q = 0
k = 0
While N > 0
N = N \ 10
k = k + 1
Wend
While N > 0
a = N Mod 10
S = S + a ^ k
N = N \ 10
Wend
If N = S Then
Cells(q, 1) = S
q = q + 1
End If
End Sub

Исправьте пожалуйста что не так, или предложите более правильный вариант кода, пожалуйста
kabum13 вне форума Ответить с цитированием
Старый 28.12.2010, 18:48   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Код:
Sub ОсновнойМакрос()
    For i = 10 To 9999
        If ArmstrongNumber(i) Then Debug.Print i
    Next
End Sub

Function ArmstrongNumber(ByVal Число As Long) As Boolean
    For Степень = 1 To 15
        Сумма = 0
        For j = 1 To 1 + Log(Число) / Log(10)
            Цифра = (Число - (10 ^ j) * (Число \ (10 ^ j))) \ 10 ^ (j - 1)
            Сумма = Сумма + Цифра ^ Степень
        Next j
        If Сумма = Число Then ArmstrongNumber = True: Exit Function
    Next Степень
End Function
Результат:
Цитата:
153
370
371
407
1634
4150
4151
8208
9474
EducatedFool вне форума Ответить с цитированием
Старый 28.12.2010, 19:55   #3
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

или так, кода чуть побольше, но алгоритм намного быстрее
Код:
Function ArmDig(dg As Long) As Integer
  Dim dt(10) As Long
  d = dg
  m = 0
  ArmDig = -1
  For i = Int(Log(dg) / Log(10)) To 0 Step -1
    If d >= 10 ^ i Then dt(i) = d \ 10 ^ i: d = d - dt(i) * 10 ^ i Else dt(i) = 0
    If dt(i) > m Then m = dt(i)
  Next
  sd = 0
  If m = 1 Then
    If dg = 1 Then ArmDig = 0
    Exit Function
  End If
  For s = Int(Log(dg) / Log(m)) To 0 Step -1
    For i = 0 To Int(Log(dg) / Log(10)): sd = sd + dt(i) ^ s: Next
    If sd = dg Then ArmDig = s: Exit Function
    If sd < dg Then Exit Function
  Next
End Function


Sub Arm()
  Dim i As Long
  tm = Timer
  For i = 10 To 99999
    r = ArmDig(i)
    If r >= 0 Then Debug.Print i, r
  Next
  Debug.Print Timer - tm
End Sub
на моей системе для чисел от 2 до 5 знаков результат получен за 2.03 секунд.
не оптимизированный алгоритм, предложенный Игорем, выдал тот же результат за 14.95 секунд.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 29.12.2010, 01:26   #4
MCH
Форумчанин
 
Регистрация: 21.11.2010
Сообщений: 326
По умолчанию

По моему число Армстронга считается несколько по другому:
"...число Армстронга — натуральное число, которое в данной системе счисления равно сумме своих цифр, возведённых в степень, равную количеству его цифр." - Википедия
и соответственно достаточно быстрый код:
Код:
Sub ОсновнойМакрос()
    For i = 10 To 99999
        If ArmstrongNumber(i) Then Debug.Print i
    Next
End Sub

Function ArmstrongNumber(ByVal Число As Long) As Boolean
    Степень = Int(Log(Число) / Log(10)) + 1
    Сумма = 0
    Число2 = Число
    For j = 1 To Степень
        Цифра = Число2 Mod 10
        Сумма = Сумма + Цифра ^ Степень
        If Сумма > Число Then Exit Function
        Число2 = Число2 \ 10
    Next j
    If Сумма = Число Then ArmstrongNumber = True
End Function
Результат:
Цитата:
153
370
371
407
1634
8208
9474
54748
92727
93084
MCH вне форума Ответить с цитированием
Старый 29.12.2010, 02:06   #5
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

кстати, да. степень должна соответствовать количеству цифр в числе.
153 3
370 3
371 3
407 3
1634 4
4150 5
4151 5

8208 4
9474 4
54748 5
92727 5
93084 5
красные не числа Армстронга. не то мы с Игорем считали... я еще степени показывал в результатах... очередная штанга. когда в школе проходили числа Армстронга, я, видимо, прогулял урок.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 29.12.2010, 14:45   #6
MCH
Форумчанин
 
Регистрация: 21.11.2010
Сообщений: 326
По умолчанию

А можно и формулками порешать, тоже достаточно быстро считает от 10 до 99999 (правда только в 2007/2010):
Код:
=НАИМЕНЬШИЙ(ЕСЛИ(МУМНОЖ(ОСТАТ(ОТБР(СТРОКА($10:$99999)/{1;10;100;1000;10000});10)^ОТБР(LOG(СТРОКА($10:$99999))+1);{1:1:1:1:1})=СТРОКА($10:$99999);СТРОКА($10:$99999));СТРОКА())
Вложения
Тип файла: rar Armstrong.rar (5.6 Кб, 13 просмотров)
MCH вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нахождение натуральных чисел neomax38 Помощь студентам 1 28.10.2010 09:33
Нахождение натуральных чисел:) neomax38 Помощь студентам 0 15.10.2010 14:46
Нахождение простых чисел. Lunex.08 Общие вопросы C/C++ 7 10.04.2009 17:01
Нахождение чисел в матрице bpystep Помощь студентам 12 23.03.2009 00:31
нахождение полных чисел Juhn Паскаль, Turbo Pascal, PascalABC.NET 6 09.12.2007 13:14