Ако може някой да ми помогне, защо след 11-то или 12-то превъртане се омазва, не комвъртва коректно стринга към инт след 11-я символ ли още в началото?!
http://pastebin.com/raw.php?i=HgbYks4S
Здравейте,
Ето и моите решения на домашното, включително и изпитните задачи включени в него:
02. NumbersNotDivisibleBy3And7
03. MinMaxSumAndAverageOfNNumbers
06. NFactorialDividedByKFactorial
12. RandomizeTheNumbersFromOneToN
15. HexadecimalToDecimalNumber
16. DecimalToHexadecimalNumber
17. CalculateGreatestCommonDivisor
18. TrailingZeroesInNFactorial
Изпитните задачи:
Здравей, беше ми интересно да видя други как си реализирал задачите с преобразуване от и в hexadecimal формат. Доста ни съвпадат решенията. Имаш обаче излишни неща в switch - case, които само удължават кода ти. Всички case-ове от 0 до 9 са излишни и може да ги реаизираш в default. Трябва ти case-ове само за A до F или от 10 до 15.
За 15. HexadecimalToDecimalNumber
Махни всичко case-ове от 0 до 9 и в default сложи:
default: number += (input[i] - 48) * (long)Math.Pow(16, (input.Length - 1 - i)); break;
Принципно в ASCII таблицата на '0' decimal-a е 48. Затова или го правиш (input[i] - 48) или (long)char.GetNumericValue(input[i])
За 16. DecimalToHexadecimalNumber
Използвал си output = 'A' + "" + output; В този случай "" е напълно излишно при тази конкатенация, защото output вече е деклариран като стринг. В 15 задача махни "" навсякъде за Case 10 до 15.. Направи го просто:
output = 'A' + output;
Махни всички case-ове от 0 до 9 и в default сложи:
default: output = digitInHex.ToString() + output; break;
Ето и моите решения:
Edit: Забелязах и че в 16. DecimalToHexadecimalNumber не ти изкарва резултат ако въведеш 0. Аз заради това съм го направил с do-while вместо само с while за да може да се изпълни поне 1 път и едва след това да проверява за 0.
Благодаря, много полезен коментар! :)
А и друго пропуснах да ти кажа пак за конкатенацията. Не е проблем ако я правиш с число и стринг. Пак ще ги слепи. Казвам го, защото в задача 16 си използвал
output = digitInHex.ToString() + "" + output;
Както писах преди малко "" е напълно излишно. След като output е стринг то няма нужда digitInHex да го преобразуваш в стринг. Най-краткият вариант е:
output = digitInHex + output;
Когато се опитваш да направиш конкатенация примерно на 2 числа то тогава се използва "" :
string output = 10 + "" + 5;
Edit: Забелязах и че на 15. HexadecimalToDecimalNumber ако въведеш в конзолата fe изкарва 0. Това е така, защото switch-case е само за големи букви. Лесно може да го коригираш като използваш ToUpper() при въвеждане в конзолата. По този начин всички букви ги прави големи още при въвеждането в конзолата. Ето така трябва да изглежда:
string input = Console.ReadLine().ToUpper();
Ето и моите решения:
Колеги имам малък проблем със задача 10 от домашно с цикли -Odd and even product:
You are given n integers (given in a single line, separated by a space). Write a program that checks whether the product of the odd elements is equal to the product of the even elements. Elements are counted from 1 to n, so the first element is odd, the second is even, etc. Examples:
Какво трябва да се направи , аз както разбирам условието ,е че трябва да се сметне произведението на четните и произведението на нечетните и ако е еднакъв да се изпише резултата , ако ли не да се изпишат отделно.Пише също ,че 1вото число винаги трябва да е четно 2рото нечетно и т.н. ,но гледам примерите и нещо явно не съм доразбрала .. Някой ще може ли да обясни ?
Благодаря предварително .
Здравей :)
Дават ти се n на брой числа (за пример ще използвам 15 23 36 41 5 14 28) като всяко от тях си има индекс (пореден номер: 15(1) 23(2) 36(3) 41(4) 5(5) 14(6) 28(7)). В задачата се пита, дали произведението на числата с четен индекс (2,4,6 в случая) е равно на произведението на числата с нечетен индекс (1,3,5,7 за конкретния пример). Output-а ти трябва да бъде yes или no (в условието има примери, където се вижда какво се случва).
Ако имаш още въпроси, питай :)
Здравей,
Трябва да се сметнат по отделно:
-произведението на нечетните productOfOdds – да речем и
-произведението на четните productOfEvens- да речем.
// за да отделиш нечетни и четни може да използваш деление на числото с % 2 = 0; ако е равно на 0 - е четно, ако има остатък – нечетно.
После трябва да сравниш productOfOdds и productOfEvens,
и ако са еднакви/равни/ ….изписваш
Console.WriteLine("yes");
Console.WriteLine("product = {0}", productOfOdds); // едното произведение, няма значение кое, нали са равни.
Ако не са еднакви изписваш:
Console.WriteLine("no");
Console.WriteLine("odd_product = {0}", productOfOdds);
Console.WriteLine("even_product = {0}", productOfEvens);
А, да… числата подавани от конзолата започват с НЕЧЕТНО
Успех!!!
Ясно - не бях разбрала ,че всяко число е индекс 15(1) 23(2) 36(3) и за това не можех да си обясня примерите .Благодаря Ви
Ето това е и моето решение на проблем 12. Малко е просто, но работи. Ето тук го вижте.
Обяснение: Подреждам си числата от 1 до N в масив и после в цикала проверявам дали индекса в масива има стойност 0, ако не, го принтя и мъ задавам стойност 0. Като се повтори цикала го проверявам отново и за да не загубя стойноста в случай че е 0 на j му давам --. Дано съм помогнал и ако имам грешки пишете.
Здравей!
Реших че по-удобният (макар и не толкова коректен) откъм условието начин е да си вкарам картите и боите в 2 масива и да печатам вяка карта толкова пъти, колкото елементи има в масива с боите, като всеки път залепвам елемента с текущ индекс към стрингосаната карта.
Edit: батисал ми се беше pastebin.
Съгласен съм съгласен с Вас, че с масиви е по-удачно да се реши. Програмата става по-кратка, а и изчезва нуждата от "магически числа" (или именувани константи, ако решението ми следваше правилата за качествен програмен код :D )
int n = int.Parse(Console.ReadLine());
int zero = 0;
int del = 5;
while (del <= n)
{
zero += (n / del);
del *= 5;
}
Console.WriteLine(zero);
Някой може ли да ми обясни логиката зад това решение на 18 задача?
Има математически начин да се изчисли по леснo броят на нулите от факториел на дадено число и логиката на този начин е вкарана в решението. Можеш да погледнеш тук примерно - http://www.purplemath.com/modules/factzero.htm или да потърсиш в нета за calculate trailing zeroes in factorial.
Иначе и аз в началото тръгнах да смятам факториели, да превъртам през стрингове и т.н. но се оказа, че няма нужда от всичко това.
Здравейте, някой може ли да ми каже защо при това решение на задача5(Calculate 1 + 1!/X + 2!/X2 + … + N!/XN) конзолата ми изкарва 4 резултата (един, от които е верния)?
П.С.: Не разбирам даже какви са другите 3..
using System;
using System.Linq;
class ClacSum
{
static void Main()
{
Console.WriteLine("Enter value of n: ");
int n = int.Parse(Console.ReadLine());
int x = int.Parse(Console.ReadLine());
double exponentX = 1;
double result = 1;
double factorial = 1;
if (n <= 0 || n <= 1)
{
result = 1;
}
else
{
for (int i = 1; i <= n; i++)
{
factorial *= i;
exponentX *= x;
result += factorial / exponentX;
Console.WriteLine("{0:F5}", result);
}
}
}
}
Просто изкарай Console.WriteLine("{0:F5}", result); извън for цикъла и ще ти работи коректно програмата. Сега в момента при всяко завъртане на цикъла ти изкарва променливата result на конзолата, тоест излишните неща на конзолата са промените на result-а след всяко завъртане на цикъла.
Здравейте отново, колеги!
Имам проблем със задача8. Предполагам програмата изкарва грешен резултат, понеже не представям формулата коректно, но сама не си откривам грешката. Очудвам се имено, защото върви, а резултата е грешен. Благодаря предварително, ако някой я погледне :)
static long Factorial (long n)
{
if (n <= 2 )
return 1;
else
return n * Factorial(n - 1);
}
static void Main()
{
Console.WriteLine("n = ");
long n = long.Parse(Console.ReadLine());
long result = 2;
for (n = 2; n < 100; n++)
{
if ((Factorial(n + 1)) * (Factorial(n)) <= 0)
{
break;
}
else
result = ((Factorial(2)) * (Factorial(n))) / ((Factorial(n + 1)) * (Factorial(n)));
}
Console.WriteLine(result);
}
Първият проблем който видях при теб е че използваш long за изчисляване на факториел. Без да ти копирам кода и да го рънвам, предполагам че винаги ти дава резултат 0. Причината е че ти препълва типът long, posle той става отрицателен, и след това 0. Използвай типът BigInteger за изчисляване на факториел.
Вторият проблем който забелязах е, че ти въртиш цикъла от 2 до 100, което не се изисква в задачата(Този алгоритъм ще ти намери резултат първо за 2, после за 3,4,5,6.... и накря за 99). Пробвай да въртиш цикъла от i = 2*n, докато i > 1 и намаляваш i всеки път.
Ако се затрудняваш още, пробвай моето решение Цък.
Не е нужно да въртиш цикъла от 2 до 100 (това е просто ограничение за числото n и ако искаш да го включиш към задачата трябва просто да направиш един if, който да казва че програмата ще работи само, ако n е между 1 и 100, но това не е нужно, защото по принцип никъде не пише, че е нужно да проверяваш дали входа е коректен). Циклите трябва да се въртят до там до къдетo е нужно според това кой факториел изчисляваш. Например, ако изчисляваш n факториел трябва от 1 до n, ако изчисляваш факториел за 2*n цикъла трябва да се върти от 1 до 2*n и така нататък. Задачата има 2 основни решения. Едното е да изчислиш по отделно с 3 цикъла (2*n)!, (n+1)! и n! и след това да ги заместиш в дадената формула. Другия начин е по-кратък и се основава на това че в числителя и в знаменателя имаш винаги повторения на части от умноженията, които могат да се съкратят и да се намерят само 2 факториела, които накрая да се разделят. Ето какво имам предвид:
n=5, това означава, че трябва да изчислиш (2*n)! = 10!, (n+1)! = 6! и n! = 5!, тоест трябва да получиш 10!/6!*5!, което е еквивалентно на 1*2*3*4*5*6*7*8*9*10/(1*2*3*4*5*6)*1*2*3*4*5
От тук се вижда че можеш да съкратиш 1*2*3*4*5*6 и то да се махне отгоре и отдолу и се получава 7*8*9*10/1*2*3*4*5, което е еквивалентно на (факториел от n+2 до n*2)/n!
Сега остава единствено да изчислиш 2-то факториела и да ги разделиш. Аз така съм решил задачата. Освен това е нужно да използваш типът данни BigInteger, защото само той ще събере, големите резултати от факториелите. Той се използва като под using System; напишеш using System.Numerics; и на мястото на тип данни пишеш BigInteger. Трябва да добавиш и референция за System.Numerics, което става като щракнеш с дясното копче на програмата в Solution Еxplorerа и след това дадеш Add->Reference->Assembiles->Framework и търсиш System.Numerics или в търсачката горе вдясно пишеш numerics и ти го намира. Това е като цяло може да погледнеш моето решение ТУК. В него съм направил всички тези неща, които ти обясних.