[C#] Using Classes and Objects - 6 Задача


12

Условие:

5.You are given a sequence of positive integer values written into a string, separated by spaces. Write a function that reads these values from given string and calculates their sum. Example:

    string = "43 68 9 23 318" à result = 461

Решение:

http://pastebin.com/xcTCY82M

Обяснение:

Приетият входен string го разделям с .Split(' ') и го записвам в масив от стрингове. След това минавам по целия масив и превръщам всеки елемент в int ( .Trim() използвам за всеки случай ако съм пропуснал някакво празно място ) и го добавям в променлива sum.




Отговори



5

Решение: source.

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


от jasssonpet (6814 точки)


0
Доста хитро !

от dzhenko (3893 точки)

0
моето решение е абсолютно същото! браво за гениалната идея ;р

от Dimitar Ivanov 1 (0 точки)


6

http://pastebin.com/HxkmMqq0

- Взимаме от конзолата

- създавам метод, който връща int и приема за аргумент string

- вътре в новия метод използвам метода .Split() с малко уточнение. Ако използваме .Split(' '),
то  ще работи коректно само, ако разстоянието ни между елементите е един интервал.

Затова аз използвам .Split(charSeparators[] , StringSplitOptions.RemoveEmptyEntries)
в charSeparators[] слагаме масив от чарове, който искаме да махнем от нашия string
Например:
char[] charSeparators = new char[] { ' ', ',' ,'-','/' };
и след това използвам StringSplitOptions.RemoveEmptyEntries, за да ни махне празните елементи от масива, които евентуално в последствие ще крашнат при int.Parse(), естествено винаги можем да използваме int.TryParse() и да се предпазим от това, но най-малкото ще въртим for(); за повече елементи от нужното.
string myString = "43 68,9   , 23 / 318";
използвайки САМО charSeparators[] без StringSplitOptions.RemoveEmptyEntries от горното ще получим следния масив от стрингове:
"43", "", "68", "", "9", "", "", "", "", "23", "", "", "", "318"
След това използваме StringSplitOptions.RemoveEmptyEntries и получаваме чистия масив:
"43" "68" "9" "23" "318"

- създавам нов метод, който сумира елементите с един foreach();

- return на тоталната сума :)

 


от vlad0 (6103 точки)


2

за тази задача ми хрумна едноредово решение

str.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).Sum()

използвам готовата финкция String.Split(), като посочвам StringSplitOptions.RemoveEmptyEntries,  за да бъдат премахнати празните низове. LINQ + lambda за конвертиране в int и след това събиране.




0

Може вместо: for (int i = 0; i < strNums.Length; i++)

да използваш foreach () тъй като нас не ни интересуват позициите на елементите в масива


от flyer87 (30 точки)


0
Да напълно е възможно. Всъщност имал ли някаква съществена разлика м/у производителността на for и foreach ?

от Teodor92 (13062 точки)

0
Би трябвало да има, тъй като при for имаш операции по променливата и проверка дали е изпълнено условието.

от kdikov (3407 точки)



1
http://pastebin.com/UjfRKcUi
Split-ваме си стринга на масив от стринове. След което всеки елемент на масива си го Parse-ваме към int и го прибавяме към сумата.

от PBorukova (1129 точки)


1

Изненадващо лесна задачка, даже се учудих.

Hint: Ако ще използвате char кода за празно място е 32. Моето решение:

http://pastebin.com/734DPizK


от stann1 (1378 точки)


0
Трябва да се намери сумата на числата, разделени с интервал. Доколкото виждам, ти просто премахваш интервалите. Друго, преобразуването от char към int става автоматично(но не и обратното), а за улеснение може да използваш апострофите, за да въведеш код на определен char директно от клавиатурата


0
Уффф, знаех си че е прекалено лесно за да е истина :) Мерси колега, поправих го.

от stann1 (1378 точки)


0

Броя Space-вете, и разбирам, че елементите вътре са точно бройката на тези спейсове + 1(задачата ми работи само ако са въведени коректно само по един спейс между числата, както е показано в примера).
SumIntsInAString


от zhelyazkovn (2949 точки)


0
щом взимаш по подразбиране, че входният ти string е правилен, то броят на елементите след string.Split() ще е точно интервалите + 1, така че изобщо не е нужно да ги броиш



0

Едно решение и от мен без използване на Split() метод

http://pastebin.com/uJKzp8VY

Програмата не се "чупи" когато в стринга има различни символи от цифри.

Подходът ми е същият като на колегата  jasssonpet  - обхождане на стринга отзад напред, умножение на всяка цифра в число според нейната роля  (единица, десетица, стотица ...  *1, *10, *100...) и ресетване на множителя, ако следващия символ НЕ е цифра.


от Dzhambazov (570 точки)


0
Това е моето решение - http://pastebin.com/Uf9115wq
Използвам един цикъл с една проверка в него. Чета въведеният стринг по символи и ако е различен от "space", го отделям във временна променлива. Ако следващият символ е "space", правя превръщане на временната променлива от стринг към число - Convert.ToInt32() и натрупвам сумата, и така при достигане края на въведеният стринг от числа, печатам натрупаната сума.

от szaekov (155 точки)


0

@ Теодор - Може да добавиш едно input = input.Trim(); преди да сплитнеш, така няма да излиза грешка ако има  " " в началото или края.

Ето и моето решение: http://pastebin.com/s6Eerg75 Чета символ по символ от стринга и проверявам дали е " " или е достигнат края му и ако временият стринг не е "" се парсва към int  и се добавя към сумата. 

Определено с Trim и Split изглежда по-добре, но не се сетих да ги използвам


от eandmir (457 точки)


0
Мерси за забележката, ей сега ще метна един фикс.

от Teodor92 (13062 точки)