Loading...

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

Nukem avatar Nukem 6 Точки

Ако може някой да ми помогне, защо след 11-то или 12-то превъртане се омазва, не комвъртва коректно стринга към инт след 11-я символ ли още в началото?!

http://pastebin.com/raw.php?i=HgbYks4S

 

0
nikola.m.nikolov avatar nikola.m.nikolov 830 Точки

Здравей, беше ми интересно да видя други как си реализирал задачите с преобразуване от и в 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;

 

Ето и моите решения:

15. HexadecimalToDecimal

16. DecimalToHexadecimal

 

Edit: Забелязах и че в 16. DecimalToHexadecimalNumber не ти изкарва резултат ако въведеш 0. Аз заради това съм го направил с do-while вместо само с while за да може да се изпълни поне 1 път и едва след това да проверява за 0.

1
a.angelov avatar a.angelov 1316 Точки

nikola.m.nikolov

Благодаря, много полезен коментар! :)

1
nikola.m.nikolov avatar nikola.m.nikolov 830 Точки

А и друго пропуснах да ти кажа пак за конкатенацията. Не е проблем ако я правиш с число и стринг. Пак ще ги слепи. Казвам го, защото в задача 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();

1
verito898 avatar verito898 265 Точки

Колеги имам малък проблем със задача 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рото нечетно и т.н. ,но гледам примерите и нещо явно не съм доразбрала .. Някой ще може ли да обясни  ?

Благодаря предварително .

0
batebobo avatar batebobo 90 Точки

Здравей :)

Дават ти се 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 (в условието има примери, където се вижда какво се случва).

Ако имаш още въпроси, питай :)

1
KrasimirKirilov avatar KrasimirKirilov 5 Точки

Здравей,

Трябва да се сметнат по отделно:

-произведението на нечетните 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);

 

А, да… числата подавани от конзолата започват с НЕЧЕТНО

 

Успех!!!

-1
verito898 avatar verito898 265 Точки

Ясно  - не бях разбрала ,че  всяко число е индекс 15(1) 23(2) 36(3) и за това не можех да си обясня примерите .Благодаря Ви

1
Panda avatar Panda 2 Точки

Ето това е и моето решение на проблем 12. Малко е просто, но работи. Ето тук го вижте.

Обяснение: Подреждам си числата от 1 до N в масив и после в цикала проверявам дали индекса в масива има стойност 0, ако не, го принтя и мъ задавам стойност 0. Като се повтори цикала го проверявам отново и за да не загубя стойноста в случай че е 0 на j му давам --. Дано съм помогнал и ако имам грешки пишете.

0
Sekklow avatar Sekklow 3 Точки

Здравей!

Реших че по-удобният (макар и не толкова коректен) откъм условието начин е да си вкарам картите и боите в 2 масива и да печатам вяка карта толкова пъти, колкото елементи има в масива с боите, като всеки път залепвам елемента с текущ индекс към стрингосаната карта.

http://pastebin.com/f1gYCV8B

Edit: батисал ми се беше pastebin.

1
15/08/2014 18:29:19
tdsamardzhiev avatar tdsamardzhiev 77 Точки

Съгласен съм съгласен с Вас, че с масиви е по-удачно да се реши. Програмата става по-кратка, а и изчезва нуждата от "магически числа" (или именувани константи, ако решението ми следваше правилата за качествен програмен код :D )

1
scr33nsh0o7 avatar scr33nsh0o7 61 Точки

int n = int.Parse(Console.ReadLine());
int zero = 0;
int del = 5;
while (del <= n)
{
      zero += (n / del);
      del *= 5;
}
Console.WriteLine(zero);

 

Някой може ли да ми обясни логиката зад това решение на 18 задача?

0
VenelinGrozev avatar VenelinGrozev 130 Точки

Има математически начин да се изчисли по леснo броят на нулите от факториел на дадено число и логиката на този начин е вкарана в решението. Можеш да погледнеш тук примерно - http://www.purplemath.com/modules/factzero.htm или да потърсиш в нета за calculate trailing zeroes in factorial.

Иначе и аз в началото тръгнах да смятам факториели, да превъртам през стрингове и т.н. но се оказа, че няма нужда от всичко това.

1
19/08/2014 01:04:12
wolfylambova avatar wolfylambova 4 Точки

Здравейте, някой може ли да ми каже защо при това решение на задача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);
}
}
}
}

 

0
simeon_stoykov avatar simeon_stoykov 4 Точки

Просто изкарай Console.WriteLine("{0:F5}", result); извън for цикъла и ще ти работи коректно програмата. Сега в момента при всяко завъртане на цикъла ти изкарва променливата result на конзолата, тоест излишните неща на конзолата са промените на result-а след всяко завъртане на цикъла.

1
24/08/2014 02:40:36
wolfylambova avatar wolfylambova 4 Точки

Здравейте отново, колеги!
Имам проблем със задача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);
}

 

0
samuanne avatar samuanne 6 Точки

Първият проблем който видях при теб е че използваш long за изчисляване на факториел. Без да ти копирам кода и да го рънвам, предполагам че винаги ти дава резултат 0. Причината е че ти препълва типът long, posle той става отрицателен, и след това 0. Използвай типът BigInteger за изчисляване на факториел.

Вторият проблем който забелязах е, че ти въртиш цикъла от 2 до 100, което не се изисква в задачата(Този алгоритъм ще ти намери резултат първо за 2, после за 3,4,5,6.... и накря за 99). Пробвай да въртиш цикъла от i = 2*n, докато i > 1 и намаляваш i всеки път.

Ако се затрудняваш още, пробвай моето решение Цък.

 

 

1
24/08/2014 11:00:43
simeon_stoykov avatar simeon_stoykov 4 Точки

Не е нужно да въртиш цикъла от 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 и ти го намира. Това е като цяло може да погледнеш моето решение ТУК. В него съм направил всички тези неща, които ти обясних.

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