Форум программистов, компьютерный форум, киберфорум
Наши страницы
Haskell
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
rapax_fox
0 / 0 / 0
Регистрация: 16.11.2017
Сообщений: 2
1

Написать программу для нахождения первых N самопорожденных чисел

23.12.2018, 20:24. Просмотров 922. Ответов 2

Прибавим к числу сумму его цифр. Полученное число называется порожденным, а исходное число – генератором порожденного числа. Порожденное число может иметь более одного генератора. Самопорожденное число - это число, у которого нет генератора.

Использовал вот этот алгоритм с просторов сети:

1. Находим цифровой корень числа N.
2. Если цифровой корень нечётный, то прибавим к нему 9 и разделим на 2. Если цифровой корень чётный, то разделим его на 2. Частное обозначим через C.
3. Вычтем C из N. Проверим, не порождает ли полученная разность число N. Если нет, то вычтем 9 из последнего результата и проверим снова. Продолжаем вычитать девятку k раз (k-число знаков в N). Если не получим генератор числа N за k шагов, то N-самопорождённое число.

Для первых 6 числе программа выдает верный результат

Haskell
1
2
Main> list 20
[20,9,7,5,3,1]
Не могу разобраться как организовать процедуру check
Вот мой код:

Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
----количество цифр в числе
numDig n   | (n<10) = 1
           | otherwise = 1 + numDig (n `div` 10) 
 
--сумма цифр в числе (123=1+2+3)
sumDig :: Int -> Int
sumDig n | (n < 10) = n
         | otherwise = (n `mod` 10) + sumDig (n `div` 10)
 
--Цифровой корень (грубо говоря остаток от деления на 9. вместо 0 выводит 9)
nroot :: Int -> Int
nroot n | (sd < 10) = sd
        | otherwise = nroot sd
          where sd = sumDig n
 
--самопорожденное число (123=123+1+2+3)
selfNum::Int->Int
selfNum n=sumDig(n)+n
 
 
--остаток от цифрового корня, нужно для того, чтобы определить, порожденное ли число
 
c n     | even ( nroot (n) ) = (nroot(n) `div` 2) --если цифровой корень четный, то просто разделим его на 2.
    | otherwise = (nroot(n)+9 `div` 2) --Если цифровой корень нечетный, то прибавим к нему 9 и разделим на 2. 
 
 
--проверка на самопорожденное
check n | (selfNum(n-c(n))/=n) && (numDig n==1) = 1
    | (selfNum(n-c(n))-9==n) && (selfNum(n-c(n))/=n) && (numDig n==2) = 1
    | otherwise = 0
 
--создание списка из самопорожденных
list::Int->[Int]
list 0=[]
list n  |(check (n)==1) =n:list(n-1)
    |otherwise = list(n-1)
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.12.2018, 20:24
Ответы с готовыми решениями:

Написать программу для нахождения произведения первых n четных чисел
Тоесть n=1 = 2 n=2 = 2*4 = 8 n=3 = 2*4*8 = .... n=4 = 2*4*6*8 = ..

Написать программу нахождения первых 50 простых чисел
Написать программу нахождения первых 50 простых чисел...Помогите пожалустно если можно то с...

Написать программу для нахождения максимального из n чисел
Помогите пожалуйста Написать программу в паскаль для нахождения максимального значения из n чисел

Написать программу нахождения суммы первых k слагаемых
Спецификация ввода: k x Спецификация вывода: значение суммы

Написать программу для поиска 100 первых простых чисел
2. Написать программу для поиска 100 первых простых чисел.

2
Catstail
Модератор
24829 / 12624 / 2305
Регистрация: 12.02.2012
Сообщений: 20,542
23.12.2018, 21:37 2
Лучший ответ Сообщение было отмечено rapax_fox как решение

Решение

Как вариант - несколько другая идея:

Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import Data.List
 
-- Генератор
 
gen :: Int -> Int
gen n = n + sumDig n
        where sumDig n = if (n < 10) then n else (n `mod` 10) + sumDig (n `div` 10)
 
-- Список генераторов
 
genList :: Int -> [Int]
genList n = sort $ nub $ map gen [1..n]
 
-- Список самопорожденных
                   
selfList' :: Int -> Int -> [Int]
selfList' n k = if (length s) >= n then take n s else selfList' n (n+k)
                where g=genList k
                      s=filter (\ k -> not $ k `elem` g) [1..k]
                      
-- Для удобного запуска
 
selfList n = selfList' n n
 
*Main Data.List> selfList 20
[1,3,5,7,9,20,31,42,53,64,75,86,97,108,110,121,132,143,154,165]
*Main Data.List> selfList 200
[1,3,5,7,9,20,31,42,53,64,75,86,97,108,110,121,132,143,154,165,
176,187,198,209,211,222,233,244,255,266,277,288,299,310,312,
323,334,345,356,367,378,389,400,411,413,424,435,446,457,468,
479,490,501,512,514,525,536,547,558,569,580,591,602,613,615,
626,637,648,659,670,681,692,703,714,716,727,738,749,760,771,
782,793,804,815,817,828,839,850,861,872,883,894,905,916,918,
929,940,951,962,973,984,995,1006,1021,1032,1043,1054,1065,
1076,1087,1098,1109,1111,1122,1133,1144,1155,1166,1177,1188,
1199,1210,1212,1223,1234,1245,1256,1267,1278,1289,1300,1311,
1313,1324,1335,1346,1357,1368,1379,1390,1401,1412,1414,1425,
1436,1447,1458,1469,1480,1491,1502,1513,1515,1526,1537,1548,
1559,1570,1581,1592,1603,1614,1616,1627,1638,1649,1660,1671,
1682,1693,1704,1715,1717,1728,1739,1750,1761,1772,1783,1794,
1805,1816,1818,1829,1840,1851,1862,1873,1884,1895,1906,1917,
1919,1930,1941,1952,1963,1974,1985,1996]
2
rapax_fox
0 / 0 / 0
Регистрация: 16.11.2017
Сообщений: 2
23.12.2018, 21:55  [ТС] 3
Спасибо большое за ответ!
0
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.12.2018, 21:55

Написать программу нахождения суммы первых k слагаемых ряда
Написать программу нахождения суммы первых k слагаемых. Спецификация ввода: k x Спецификация...

Цикл: Написать программу нахождения суммы первых k слагаемых...
Написать программу нахождения суммы первых k слагаемых. Спецификация ввода: k x Спецификация...

Написать программу для нахождения суммы большего и меньшего из трех чисел
Написать программу для нахождения суммы большего и мень*шего из трех чисел.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.