Loading...
bizchou avatar bizchou 4 Точки

[Homework] C# Basics - "Математика за програмисти" - Problem {3} - Some Factorials

Здравейте,

надявах се да не се стига до писането на тази тема, но вече 4 ден не мога да попадна на достатъчно добро решение на въпросният проблем. Не съм сигурен че е добра идея да представя фактуриал-а на което и да е от числата защото самият резултат е прекалено голям. Може и проблема да е в мен и аз да не разбирам точно какво се иска от задачата, макар че от "Find 100!, 171! and 250! Give all digits." не знам какво точно друго би се очаквало. Както и да е, просто искам да уточня всичко и да не се излагам по какъвто и да било начин. Прегледах за отворена друга такава тема, но не намерих нищо, въпреки всичко простете ако има такава (:

Поздрави

Тагове:
0
Programming Basics
GogoK avatar GogoK 80 Точки
Best Answer

Единствените ограничения които имаш на този етап, са тези до които и сам си стигнал. Никой не ти налага да правиш програма или каквото и да е друго решение. Идеята като цяло е да усвоиш материал, който ако сам прецениш че с едно копиране ще го усвоиш на 100% може и така да го направиш. За мен също не беше задоволително и поне се постарах да потърся материал по задачата.. примерно, тъй като 100! е с много на брой цифри, опитай се да сметнеш в notepad или на лист хартия 8! или 12! с формулата която съм сигурен че си е срещал. Идеята ми е че след като може да сметнеш 2*2, когато можеш и ти се наложи да сметнеш 300! чрез програма, ще ти е по лесно отколкото сега да го намериш в google. После в домашното може и формула да 'копираш' освен решението, а който ти проверява освен някаква число ще има и основа да е сравни. А ако си на грешен път и проверяващият знае правилният... ето ти идеята на това на пръв поглед уж 'безсмислено' домашно.
Дано съм бил полезен, успех!

4
15/01/2015 23:57:48
greedy1988 avatar greedy1988 21 Точки

Здрасти ! Колега в условието е посочено, че се иска да се дадат всички цифри. Аз лично пресметнах няколко по-малки факториали на ръка, а за конкретната задача използвах това ---->
http://www.calculatorsoup.com/calculators/discretemathematics/factorials.php 
Поздрави :)

8
bizchou avatar bizchou 4 Точки

Не съм казал че го смятам за безмислено. Наистина според мен също идеята е като цяло да свикнем да ползваме Google.. Благодаря за вниманието и отделеното Ви време, явно наистина няма нещо като "най-добро"  решение/представяне на отговор по проблема, също както според мен няма и "най-добър"  калкулатор (;

Поздрави! 

1
GogoK avatar GogoK 80 Точки

Здравей ,
колко е яко "Find n! Give all digits"... кратко просто и ясно. Но 10 човека могат да го разтълкуват по 20 начина и пак да се обединят в/у един накрая ако е най точен или бърз.
Сигурен ли си че самият калк е коректен и ако е да, има ли такъв с когото можеш със същата лекота да провериш 1307674367999- факториел ли е; и ако да, както в предната задача част ли е от Фибоначи поредицата. На пръв поглед може да е глупаво всяко търсене различно от условното, но аз изгледах няколко видео лекции и ми направи впечатление, че се опитват да ни разчупят стереотипа на мислене с числата най-вече ... и ако ти се стори глупаво ще ти цитирам по спомен един лектор: "Можеш ли да сметнеш с Пешо и Гошо числото 150?".
Примера няма нищо общо с конкретната тема, освен ... що ми е Пешо и Гошо да сметна 150.. ти луд ли си.. или имам си Гугъл шъ проверъ..
Колегата който е пуснал темата не пише че не може да намери отговора, а че не го кефи че трябва да copy/paste някво си число.
А и многоцифрените числа могат да се представят друг начин освен условния в момента, което ако си го срещнал и не си се замислил в момента, след седмица може и да ти свърши чудесна работа в друго домашно.
Всеки сам да преценя за него си колко да се задълбава в даден момент :). Успех!

1
v.indzhev avatar v.indzhev 37 Точки

Здравей!

 

Може би задачата е дадена с цел да се съобразиш с използването на правилния тип данни, а не толкова за намиране на отговора, като число което е много голямо. Поради тази причина се придържай към това, което е написано в условието, а именно принтиране на числото. Няма да се изложиш, каквото и да напишеш. Вярвам, че отговор, придържащ се към условието няма да ти доведе до негативна оценка на домашното или лош коментар.

 

Поздрави!

0
bizchou avatar bizchou 4 Точки

Ъъ, задачата не трябва да бъде представена като програмен код, дори не би следвало да имам и понятие как се пише код на този етап (; 

1
v.indzhev avatar v.indzhev 37 Точки

От следващата лекция в домашните ще има задачи, върху материал, който не си изучавал. Това не означава, че трябва да ги прескачах, а че трябва да се разровиш в Интернет и сам да се научиш как да ги решаваш.

Относно тази задача, най - малкото може да погледнеш в Гугъл за калкулатор, който смята факториел, ако не искаш да пишеш код. 

2
bizchou avatar bizchou 4 Точки

Идейно е да ме подсетиш за гугъл (: калкулатори има най различни прав си, друго исках, но добре. Благодаря за вниманието.

0
15/01/2015 20:27:05
dim4o avatar dim4o 288 Точки

Това за мен е най-якия онлайн калкуратор за всякакви математически операции - http://www.wolframalpha.com/. Бързо ще изведеш всичко. Незнам какво точно би трбвало да упражнява тази задача. Да намериш броя на нулите в края на числото или да намериш последната му ненулева цифра са математически задачи, които могат да тренират някакво мислене. На ръка е абсурд да ги търсиш всичките цифри. Предполагам идеята е просто да се порови човек в нетя, за да намери някакъв свестен математически тоол подобен на този, който ти предлагам.

3
penkov avatar penkov 110 Точки

Здравей колега,

за да се опитам да ти помогна по някакъв начин искам първа да конкретизираме проблема ти. Според това което прочетох от темата разбрах, че ти всъшност не си наясно какво се иска от теб или просто си със съмнения в решението. Аз също сега съм записан за нивото C#, и направих тази задача по следния начин. Ето тук написах числата копнах съответното им равно и го написах в един txt файл. 

Ако не е това което имаш в предвид сподели какво те мъчи ще ударим по едно рамо.

Поздрави

1
bizchou avatar bizchou 4 Точки

Здравей, оценявам желанието ти да ми помогнеш, аз също така направих и затова бих казал, че на този етап изяснихме проблема и нищо не ме мъчи. Благодаря! 

1
redstorml avatar redstorml 4 Точки

Линк

ModEdit: Позволено е цитирането на не повече от 12-15 реда код, всичко по-дълго трябва да се праща като линк към pastebin или други подобни сайтове.

0
18/01/2015 16:41:21
enevlogiev avatar enevlogiev 1168 Точки

@redstorml

Хубава идея, ама така май-май няма да стане ... (смятам на ръка, защото нe съм на моя комп)
Примерно 5! = 120
ти имаш 1 * (5 - 1) = 4;
4 * (5 - 2) = 12;
12 * (5 - 3) = 24;
24 * (5 - 4) = 24; и след това i = 5 и цикълът свършва. Moже примерно да редактираш
BigInteger faktorial = n;
Ако искаш пробвай да намериш и друго решение : )

0
16/01/2015 22:56:41
SimeonStoykov avatar SimeonStoykov 114 Точки

Здравей. Виждам, че си решил да направиш задачата с код, в което няма нищо лошо, но както е споменал колегата преди мен, този код не връща правилна стойност на факториела, защото реално умножаваш в началото по 1, вместо по числото, чийто факториел се търси. Предлагам ти да разгледаш и тази друга алтернативна и възможна редакция на кода:

for (int i = n; i >=1; i--)

{

faktoriel *= i; (това е съкратения запис на –> faktoriel = faktoriel *i;)

}

Чрез тази редакция намираш факториела като започваш да умножаваш числото, чийто факториел търсиш (например 5) с числата по-малки от него (4, 3,...) - това правиш в цикъла, като намаляваш I с всяко негово завъртане, докато не стигнеш до 1.

2
NGenchev avatar NGenchev 2 Точки

Аз имам проблем с тази библиотека .Numerics и затова не става, иначе @SimeonStoykov изобщо няма значение дали ще е 1*2*3*4 ,защото е равно на 4*3*2*1 .. факториел изглежда доста просто, но с големи числа става малко трудно.

0
TrifonApov avatar TrifonApov SoftUni Team Trainer 131 Точки

Здравей! Усети ли се, че всъщност пускането на темата доведе до много яко нещо? 4 дена си се чудил дали да я пускаш. Пуснал си я и това доведе до споделянето на много варианти за решение. От които никой не е грешен. И това освен на теб, ще помогне и на доста хора, които са се чудили какво да правят и дали да питат. :)

Вчера стана дума (с няколко колеги от по-горни курсове и с един колега от подготвителният курс, аз съм ниво 1) че най-глупавият въпрос е не зададеният въпрос. Най-малкото нещо да е питайте. На лекции асистентите са за това там. А и форума е за тази цел, с малкото уточнение, че тук трябва да се събразяваме с правилата на форума.

Успех! :)

3
bizchou avatar bizchou 4 Точки

Да наистина си прав, много добре се получи (: Трябва да работят мозъците :P Това е бонус за мен и други като мен естествено, като начинаещи имам в предвид .. 

0
17/01/2015 00:36:32
milen.stefanov avatar milen.stefanov 40 Точки

using System.Numerics

като преди това си добавил референция във visual studio --> PROJECT --> Reference --> System.Numerics

Това дава възможност да декларираш biginteger променливи и да работиш с огромни числа!

2
math.qe avatar math.qe 0 Точки

След около 2 часа ровене, успях благодарение на вашия коментар!Благодаря ви!

0
zdravko7 avatar zdravko7 63 Точки

Разписах набързо алгоритъм за изчисляване на задачата за факториелите в C#. Програмката изчислява факториела по зададено число. Използва BigInteger, който трбява да се добави от "References"на проекта  (References -> Add Reference -> System.Numerics). Result-a почва като 1-ца, но при първото изпълнение на цикъла се умножава по даденото число.

 

Git Hub

 

Hope this helps :)

1
Filkolev avatar Filkolev 4482 Точки

Добре си се справил. Имам няколко препоръки за подобрения.

За да се съкрати малко кода може да затриеш ненужните using-и в началото. На мен лично ми помага да си чета по-лесно писаниците.

Факториел се търси за цели числа, т.е. вместо double ползвай някакъв целочислен тип. Според мен int е напълно достатъчен, едва ли на някого ще му трябва да намира факториел на 5 милиарда.

Принципно Convert метода се ползва, за да обърнеш стринг от друга бройна система в число, например ако ти подадат 111 това ще се запази като 7 ако уточниш, че е двоичен стринг. По-често се ползва Parse - в твоя случай ако ползваш double -> double.Parse(string).

Може директно да инициализираш променливата за резултата така: BigInteger result = 1;

while (number != 0) може да се замени с while (number > 1) - не е нужно да се умножава числото по 1, т.е. ако спрем до 2 сме си свършили работата.

В цикъла не е нужно да се каства, може да се запише така: result = result * number; или result *= number;

1
18/01/2015 19:08:10
zdravko7 avatar zdravko7 63 Точки

Мерси за насоките. Update-нах си кода :)

0
mgulubov avatar mgulubov 73 Точки

Привет,

Не мисля, че в C# ще можеш да представиш 100! като числен тип- просто резултата ще е прекалено голям. Дори и да има начин, който не ми е известен, 100% ще използва безсмислено много памет и време. По-удачно ще е, да ползваш масив и bottom-up итеративен алгоритъм вместо рекурсия, като на всяко изчисление добавяш резултата като елемент на масива. Реално, това ти дава възможност да изчислиш факториала на всяко число, дори и на заветното 251, което Google не смята :).

Разгледай следното, за намиране на 100!: http://pastebin.com/arqLhbS6

0
antonio_rtodorov avatar antonio_rtodorov 74 Точки

Здравей,

навсякъде търсих как мога да изчисля фактуриел с най - различна стойност без да изпозвам калкулатор и разбрах, че ако искам да сметна 100! трябва да отделя няколко часа, за да  го сметна на ръка - 1 * 2 *3 ........ *100 и да получа отговора. Моя съвет е да компенсираш употребата на калкулатор като наистина разбереш, какво фактически представлява самия фактуриел, едно от най - лесните определения е - фактуриела ти показва как може да разместиш  по "n" на брой начини естествени числа. Пример: 3! = 6 или представено - {1,2,3}, {1,3,2}, {2,1,3}. Също така ти предлагам да прегледаш и този линк http://tu-utc.com/Webpages/E_learning/SAA/Tema2.htm#nF  , който има полезна информация и обърни внимание на точка 1.3

Надявам се времето, което съм отделил за тази информация наистина да ти помогне на теб и всички останали.

Поздрави

0
11/05/2015 20:04:02
JOHNY avatar JOHNY 196 Точки

Всъщност в това домашно никой не иска да се пресмята ръчно. Идеята му е да накара студентите да свикват да търсят точна и полезна информация.
Отговорът точно на тази задача е примерно ТУК. Има много калкулатори за пресмятане, но повечето дават резултат от типа 3.23285626 E+492, което отново е 100!.

Същото важи и за останалите задачи от това домашно.
Поздрави!

 

P.S. За първи път попадам на твоето "най-лесно" определение. Досега винаги съм смятал, че n! е произведението на всички числа от 1 до n и ми се струваше максимално елементарно. laughing

0
antonio_rtodorov avatar antonio_rtodorov 74 Точки

Мисля, че е по - лесно, защото когото човек чуе или види фактуриел за първи път ще е най - добре да разбере в какво може да се приложи. Според мен, когато имаш повече примери или информация за дадена фунция, толкова повече може да ти е полезна в даден момент, защото знаеш къде може да я приложиш. Лично аз търсих именно да разбера какво означава фактуриела като дефиниция, но откривах само как да го изчисля и за това реших да коментирам темата за хората, които наистина срешат за първи път тази дума.

P.S. Благодаря за коментара и ти си прав. :)

Поздрави

1
JOHNY avatar JOHNY 196 Точки

Уикипедия го обяснява като произведение.

Ако разглеждаме 5 факториел сигурно можем да си представим разместването (1,2,3,4,5 ; 1,3,2,4,5 и т.н.), но какво правим при 50! или 5000! ? Ако си го представим като 1*2*3*...*n става по-лесно, защото всички сме свикнали да броим последователно от 1 нагоре.

Забавното в случая е, че в Уикипедия са дадени примери за смятане на факториел в програмирането, но няма C#.

Ако искаш да вървиш напред помисли как би написал подобен код. Забрави, че не знаеш операторите, просто направи алгоритъма.
Например:

1. Ще задам променлива n.

2...

3...

Това ще ти бъде полезно при всяко едно задание, защото без коректен алгоритъм нищо не работи вярно.:)

Ако ти трябва помощ - насреща съм (1незнаещ + 2незнаещ = лудумораняма!). laughing

1
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.