02.Methods [November, 2016]


2

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

Реших да отворя тема и за второто домашно от курса.Споделям моите решения:

GitHub

Искам да покажа и една от задачите, която реших по по-различен начин , решението изобщо не е кратко, но упражних това как да връщам 2 типа данни,като отговор, от един метод.Става въпрос за 08.Number As Array : 

08.Number-As-Array

Очаквам да видя и вашите решения ,коментари , критики и каквото се сетите :D




Отговори



1

здравейте,

и аз реших да направя нещо ново - разменам само имената на стрингове

namespace NumberAsArray { using System; class Program { static void Main() { // Start Up var lenghts = Console.ReadLine();// this is unnecessarily var shortNumbers = Console.ReadLine().Split(' '); var longNumbers = Console.ReadLine().Split(' '); string[] xchngString; int shortNumberLength = shortNumbers.Length; int longNumberLength = longNumbers.Length; char zeroCode = ('0'); //this if always set shortNumbers be shorter than longNumbers if (shortNumberLength > longNumberLength) { xchngString = shortNumbers; shortNumbers = longNumbers; longNumbers = xchngString; shortNumberLength = shortNumbers.Length; longNumberLength = longNumbers.Length; } int[] result = new int[longNumberLength + 1]; for (int i = 0; i < longNumberLength; i++) { result[i] += longNumbers[i][0] - zeroCode; if (i < shortNumberLength) { result[i] += shortNumbers[i][0] - zeroCode; } BiggerFromTen(result, i); } // Print Console.WriteLine(string.Join(" ", result).TrimEnd('0', ' ')); } //This Method normalize a digits in arr static void BiggerFromTen(int[] arr, int pos) { if (arr[pos] > 9) { arr[pos] %= 10; arr[pos + 1]++; } } } }


от mitkop (578 точки)


2
Здравейте, ето моите решения (HW), Колега ако ти е интересно може да видиш моя вариянт на 8-ма задача.

от todor.chupov (380 точки)


1
Наистина добри решения, разгледах ги :)

от encho.enevski (316 точки)

0
Блгагодаря! :)

от todor.chupov (380 точки)



2

Привет,

@encho.enevski интересно решение за 8-ма задача :) Една "забележка" за 9-та задача - идеята е чрез метод, който намира най-голямото число в масив да се сортира самия масив...без да се ползва готовия метод SortArray(). Ако искаш погледни тук за насоки (имам два варианта) или решенията на @todor.chupov (малко е объркал линка към задачите си), също са добри.


от Daniela_Popova (1125 точки)


0
Благодаря колежке, че обърна внимание! Изобщо нямаше да видя, че съм дал линк към старото домашно. :D

от todor.chupov (380 точки)

0
Благодаря за пояснението :) 

от encho.enevski (316 точки)


2

Ето и моето решение.

08.Number-As-Array


от DarkDawn (22 точки)


0
Ето и моето решение за 08. Number as array
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { class SumArrays { static int[] resultArr; static void Main(string[] args) { string input = Console.ReadLine(); char[] separator = new char[] { ' ' }; string[] sizesStr = input.Split(separator); int firstSize = int.Parse(sizesStr[0]); int secondSize = int.Parse(sizesStr[1]); string firstInput = Console.ReadLine(); string[] firstStr = firstInput.Split(separator); string secondInput = Console.ReadLine(); string[] secondStr = secondInput.Split(separator); int[] firstArr = new int[firstSize]; int[] secondArr = new int[secondSize]; for (int i = 0; i < firstArr.Length; i++) { firstArr[i] = int.Parse((firstStr[i])); } for (int i = 0; i < secondArr.Length; i++) { secondArr[i] = int.Parse((secondStr[i])); } SumArrs(firstArr, secondArr); } static void SumArrs(int[] firstArr, int[] secondArr) { int biggerLength = 0; int smallerLength = 0; if (firstArr.Length >= secondArr.Length) { biggerLength = firstArr.Length; smallerLength = secondArr.Length; resultArr = new int[firstArr.Length]; } else { resultArr = new int[secondArr.Length]; biggerLength = secondArr.Length; smallerLength = firstArr.Length; } int oneInMind = 0; for (int i = 0; i < smallerLength; i++) { int result = (firstArr[i] + secondArr[i] + oneInMind); oneInMind = 0; resultArr[i] = result % 10; if (result > 9) { oneInMind = 1; } } if (biggerLength > smallerLength) { for (int i = smallerLength; i < biggerLength; i++) { if (firstArr.Length > secondArr.Length) { int result = (firstArr[i] + oneInMind); resultArr[i] = (result % 10); oneInMind = 0; if (result > 9) { oneInMind = 1; } } else { int result = (secondArr[i] + oneInMind); resultArr[i] = (result % 10); oneInMind = 0; if (result > 9) { oneInMind = 1; } } } } for (int i = 0; i < resultArr.Length; i++) { Console.Write("{0} ", resultArr[i]); } if (oneInMind > 0) { Console.Write("{0}", oneInMind); } } } }

от nikolaosan (15 точки)


0

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

Относно 10та задача: " a number represented as an array of digits "Т.е умножението трябва да се направи с масиви от цифри, а не със самите числа? Моля кажете вашето мнение.



0
Колежке, просто правиш програма за пресмятане на Фактуриал, като логиката на пресмятането я изнасяш в метод, това е. Използвай "int", за входни данни и трупай резултата в "BigInteger". :)

от todor.chupov (380 точки)



0

Здравейте! Някой може ли да ми каже къде бъркам при задача 08.Number as array?

Решението дава 50/100. Проблемът е с тестове 1, 3, 4, 6 и 9. 

Кодът на задачата: тук.




0
Колежке, я пробвай с този тест и виж дали ти дава резултата, който съм написал. -> Test

от todor.chupov (380 точки)

0

Не даваше този резултат. Коригирах решението с добавяне на деление с остатък. Открих и още един проблем при добавянето на единица, когато сумата е по-голяма от 9, та сега точките са 90/100. Остана само тест 6. :-)

Благодаря!





1

Ето ме и мен...

Решил съм задачите с много коментари и в user friendly стил за евентуални бъдещи справки цък...


от markovood (374 точки)


0

Здравейте, колеги!Имам проблем със 8ма задача от домашното. Нулевите тестове са вертни, и от там или отговора е грешен или дава рънтайм ерор. Надявам се някой да помогне! Логиката е следната: след преобразуване на на низовете с числа, разделени с интервал от стринг към 2 масива от интове arr1 и arr2(за което написах метод, да не повтарям кода 2 пъти) масивите се обхождат паралелно като елементите ин се събират записват в нов масив sum. Ако сумата е по голяма от 9 на текущата позиция на масива sum се записват едениците на сбота, а на следващата позия се добавя едецица. Накрая масива се отпечатва, като последния знак,ако е 0, не се изписва на конзолата. Благодаря предварително!

using System; using System.Collections.Generic; class NumberAsArray { static int[] NumAsArrayConversation(int size) { // Converts string array to int array string input = Console.ReadLine(); string[] numStrings = input.Split(' '); int[] nums = new int[size]; for (int i = 0; i < size; i++) { nums[i] = int.Parse(numStrings[i]); } return nums; } // Sums the elements static void Sum(int[] arr1, int[] arr2) { int biggerSize = Math.Max(arr1.Length, arr2.Length); int smallerSize = Math.Min(arr1.Length, arr2.Length); int[] sum = new int[biggerSize + 1]; for (int i = 0; i < smallerSize; i++) // sums the elements { int curSum = arr1[i] + arr2[i]; // checks if current sum is > 9 if (curSum > 9) { curSum = curSum % 10; sum[i] += curSum; sum[i + 1] += 1; } else { sum[i] += curSum; } } for (int i = smallerSize; i < biggerSize; i++) { sum[i] += arr2[i]; } for (int i = 0; i < sum.Length - 1; i++) { Console.Write(sum[i] + " "); } if (sum[sum.Length - 1] != 0) { Console.WriteLine(sum[sum.Length - 1]); } else { Console.WriteLine(); } } static void Main() { string input = Console.ReadLine(); string[] size = input.Split(' '); int m = int.Parse(size[0]); int n = int.Parse(size[1]); int[] arr1 = NumAsArrayConversation(m); int[] arr2 = NumAsArrayConversation(n); Sum(arr1, arr2); } }


от k_kaneva (127 точки)


1

Здравей,

Ще ти дам един hint и мисля че ще се справиш.

Представи си число 999 + 1, с твоя код програмата забива.

Проблемите са няколко:

- редове 23 - 37 обхождаш малкия масив и предаваш "remainder" само до small + 1, а реално трябва да го прехвърляш до края на big

- не разбирам смисъла от редово 38-42 - реално ако въртиш 23-37 до big length - там ще събираш с 0 и  remainder - така ще си решиш доста трудности и логиката ще ти е една за целия процес.

Опитай се да го направиш макс до това което са ни учили в първите класове:

Почваме от дясно на ляво и събираме и местим remainder , като двата масива са ти с равна дължина и по-малкия е допълнен с 0.

Пробвай пак сама и драсни ако не стане, ще помогнем с код вече :)


от ktsvetanov (705 точки)

0
Мерси, колега, пиша с малко закъснение, получи се за 100/100.

от k_kaneva (127 точки)


0

Добър ден,

Може ли да ми дадете идея каква ми е грешката в 8 задача, тъй като нулевите тестове минават, а на другите задачи имам 0/100:

using System; using System.Collections.Generic; namespace NumberArray { class NumberArray { static int[] Addtabs(int[] tab1, int[] tab2) { int[] result = new int[Math.Max(tab1.Length, tab2.Length) + 1]; int[] result2 = new int[Math.Max(tab1.Length, tab2.Length)]; int temp = 0; for (int i = 0; i < result.Length - 1; i++) { if (i < Math.Min(tab1.Length, tab2.Length)) { temp = tab1[i] + tab2[i]; result[i] += temp % 10; if (temp > 9) { result[i + 1] = 1; } } else if (tab1.Length > tab2.Length) { temp = tab1[i] + result[i]; result[i] = temp % 10; if (temp > 9) { result[i + 1] = 1; } } else { temp = tab2[i] + result[i]; result[i] = temp % 10; if (temp > 9) { result[i + 1] = 1; } } } if (result[result.Length - 1] == 0) { for (int i = 0; i < result2.Length; i++) { result2[i] = result[i]; } return result2; } return result; } static void Main() { string[] sizes = Console.ReadLine().Split(' '); string[] tab1s = Console.ReadLine().Split(' '); string[] tab2s = Console.ReadLine().Split(' '); int[] tab1 = new int[int.Parse(sizes[0])]; int[] tab2 = new int[int.Parse(sizes[1])]; for (int i = 0; i < int.Parse(sizes[0]); i++) { tab1[i] = int.Parse(tab1s[i]); } for (int i = 0; i < int.Parse(sizes[1]); i++) { tab2[i] = int.Parse(tab2s[i]); } Console.WriteLine(string.Join(" ", Addtabs(tab1, tab2))); } } }

мерси предварително


от perro (7 точки)