Регистрирайте сеРегистрирайте се

Програма намираща сумата на факториелите на цифрите на число


 
   Форум за математика Форуми -> Информатика/Компютри
Предишната тема :: Следващата тема  
Автор Съобщение
rytimid
Редовен


Регистриран на: 14 Oct 2007
Мнения: 110

Репутация: 13.3
гласове: 4

МнениеПуснато на: Thu Nov 08, 2007 12:08 am    Заглавие: Програма намираща сумата на факториелите на цифрите на число

Та задачата изисква програма която да намери висчки числа, равни на сумата на факториелите на своите цифри. Има и упътване, че би било добре да се намери горна граница до която да се търсят такива числа, и за пример се дава 9*9!=3265920, което очевидно е по-малко от произволно 9 цифрено число.
След кратък размисъл върху упътването, достигнах до извода, че числата са само 1!=1 и 2!=2, което пък ме доведе на мисълта, че нещо не съм видял нещата като трябва и така се стигна да питам тук. Smile
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Реклама







Пуснато на:     Заглавие: Реклама

Върнете се в началото
v1rusman
Напреднал


Регистриран на: 18 Jul 2007
Мнения: 318

Репутация: 39.5Репутация: 39.5Репутация: 39.5Репутация: 39.5
гласове: 10

МнениеПуснато на: Thu Nov 08, 2007 2:08 pm    Заглавие:

Задачата от олимпиадата по информатика за 10 клас ли е ?Или е от "Димо Малешков" ?
Един приятел ми я беше казал преди година,като от казаното си спомням само,че 1! и 2! отговарят на условието(не знам дали наистина е така,защото беше отдавна).
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Irrefutable
Напреднал


Регистриран на: 15 Jul 2007
Мнения: 298
Местожителство: София
Репутация: 28.8Репутация: 28.8Репутация: 28.8
гласове: 5

МнениеПуснато на: Thu Nov 08, 2007 2:10 pm    Заглавие:

1 2 145 40585

Ограничението е грубо до 3628800, защото при над 10 цифрено число сумата от факториела на цифрите винаги ще е по-малак от числото.

Код:

#include <iostream>

using namespace std;

int facts[10];
int make_facts(){
    facts[0] = 1;
    for(int i = 1 ; i < 10 ; i++)
            facts[i] = facts[i-1]*i;
};

int main(){
    make_facts();   
    for(int num = 1 ; num < 3628800 ; num++)
    {
            int sum = 0;
            int tmp = num;
            while(tmp>0)
            {
                sum+=facts[tmp%10];
                tmp/=10;
            };
           
            if ( num == sum )
               cout<<num<<" ";
           
    }
    cin.get();
    return 0;   
};
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Посетете сайта на потребителя
rytimid
Редовен


Регистриран на: 14 Oct 2007
Мнения: 110

Репутация: 13.3
гласове: 4

МнениеПуснато на: Fri Nov 09, 2007 11:23 pm    Заглавие:

Irrefutable и аз се сетих за това решение. Пробема ми е в това, че не схващам как се ограничава интервала от числа. Бих се радвал ако ми го обясниш с няколко приемра.
v1rusman задачата е от книгата на Преслав Наков и Панайот Добриков Програмиране=++Алгоритми
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Irrefutable
Напреднал


Регистриран на: 15 Jul 2007
Мнения: 298
Местожителство: София
Репутация: 28.8Репутация: 28.8Репутация: 28.8
гласове: 5

МнениеПуснато на: Sat Nov 10, 2007 10:23 am    Заглавие:

9 е най-голямата цифра , и нейния факториел е 362880.
когато имаш едноцифрено число , числото може да е максимум 9 , а фактуриела му 362880 . Тоест сумата от фактуриела на цифрите му (едната му цифра) може да е по-голяма от самото число.
когато когато имаш 2 цифри , числото ти е максимум 99 , а сумата на фактуриелите е максимум 2 * 362880.
За три цифри е 999 и 3*362880 , за 4 е 9999 и 4*362880.
За 7 цифри става 9999999 и 7*362880 , което е 9999999 и 2540160, Все още обаче 2540160 > 1111111 , на следващата стъпка , когато станат 8 цифрите фактуриела става максимум 2903040 , а числото е най-малко 11111111, което значи че най-малкото число с 8 цифри е по-малко от най-голямата сума от факториелите на цифрите му.
При това числото определено нараства по-бързо от сумата от фактуриелите на цифрите му. Следователно с повече от 7 цифри няма защо да се занимаваш Wink

Принципно аз го закраглих на 10, защото ме мързеше да мисля изобщо. Човек си дава сметка кое е по-продуктивно за да намери някакви константи които ще се търсят само веднъж. Да напише кода за 1 минута който се изпълнява за 0.5 секунди или да мисли по задачата 2 минути и да напише за още 1 код който се изпълнява 0.1 секунди Wink
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Посетете сайта на потребителя
rytimid
Редовен


Регистриран на: 14 Oct 2007
Мнения: 110

Репутация: 13.3
гласове: 4

МнениеПуснато на: Sat Nov 10, 2007 9:30 pm    Заглавие:

мда, вече се ориентирах Smile благодаря за обясниението
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Покажи мнения от преди:   
   Форум за математика Форуми -> Информатика/Компютри Часовете са според зоната GMT + 2 Часа
Страница 1 от 1

 
Идете на:  
Не Можете да пускате нови теми
Не Можете да отговаряте на темите
Не Можете да променяте съобщенията си
Не Можете да изтривате съобщенията си
Не Можете да гласувате в анкети
Може да прикачвате файлове
Може да сваляте файлове от този форум
Copyright © 2005-2021 math10.com.