Софтуерно Инженерство
Loading...
+ Нов въпрос
Losko avatar Losko 69 Точки

7. Sum Arrays

Понеже съм много "умен", седнах и .. писах едни кодове едни чудеса .. laugh Спрямо примерите в условието кода работи .... Обаче Judge ми дава 50/100...  Някой може ли да ми каже НЕ друго решение на задачата, А защо моето не минава ?
http://pastebin.com/HPir4XAp

Тагове:
0
Programming Fundamentals 06/10/2016 18:55:09
netherblood avatar netherblood 94 Точки

Защото във FillArray рестартираш k на всяко завъртане на първия цикъл, което просто ти пълни едни и същи стойности всяко завъртане (от k до k+n).
При вход:
1 1 1 1 1 1

2

Твоята програма изкарва
3 3 3 1 1 1
Защото FillArray връща [2, 2, 2, 0, 0, 0] (оригиналния масив [1] и ти пълниш от k до k + n. Като n = 1, k=n,

k+n = 2, и за това FillArray връща масив напълнен до 2рия индекс.

1
06/10/2016 23:20:21
DanailDrumev avatar DanailDrumev 9 Точки

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

http://pastebin.com/jJmKBuN7

Джъдж дава 100/100 и е много по кратко и разбираемо.

 

А това е решението, което ми дава 80/100.

            var arr1 = Console.ReadLine().Split().Select(int.Parse).ToArray();
            var arr2 = Console.ReadLine().Split().Select(int.Parse).ToArray();

            var maxArr = Math.Max(arr1.Length, arr2.Length);

            for (int i = 0; i <= maxArr; i++)
            {
                maxArr = (arr1[i % arr1.Length] + arr2[i % arr2.Length]);
                if (i >= arr1.Length && i >= arr2.Length)
                {
                    break;
                }
                
                Console.Write(maxArr+" ");
            }
            Console.WriteLine();

 

предполагам, че грешката в него идва от " var maxArr = Math.Max(arr1.Length, arr2.Length)"

след като изнесох проверката за по голямата дължина между arr1.Length и arr2.Length в if-else конструкция (както можеш да видиш от работещия код) нещата се оправиха и резултата е 100/100

1
IliyaVesselinov avatar IliyaVesselinov 1 Точки

Здрасти,

искам да попитам за какво служи точно "i % arr1.Length" в решението. Нещо свързано с ротация, но какво точно?

0
Pilgrimage avatar Pilgrimage 515 Точки

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

Ако:

arr1.Length = 5, тогава при i = 3, (i % arr1.Length) = 3 и всичко си е нормално,

но ако i = 7, тогава (i % arr1.Length) = 2 и няма излизане от обхват, а броячът е "превъртял" и е започнал отначало (т.е. кръгов брояч).

0
09/10/2016 19:13:19
cecosvidovski avatar cecosvidovski 56 Точки

Един още по-опростен начин :) 

using System;
using System.Linq;

namespace SumArrays
{
    class Program
    {
        static void Main()
        {
            int[] arr1 = Console.ReadLine().Split().Select(int.Parse).ToArray();
            int[] arr2 = Console.ReadLine().Split().Select(int.Parse).ToArray();
            int[] biggerArray = new int[Math.Max(arr1.Length, arr2.Length)];
            int sum = Math.Max(arr1.Length, arr2.Length);

            for (int i = 0; i <= biggerArray.Length; i++)
            {
                sum = (arr1[i % arr1.Length] + arr2[i % arr2.Length]);
                if (i >= biggerArray.Length)
                {
                    break;
                }
                Console.Write(sum + " ");
            }
            Console.WriteLine();

        }
    }
}

 

0
ivaylokostov87 avatar ivaylokostov87 14 Точки

Само не мога да разбера, защо слагате:  

"if (i >= biggerArray.Length) { break; }" 

при положение, че ограничавате "i" още в цикъла:

"i <= biggerArray.Length"

и двете по горни решения имат този "break", който смятам, че е излишен и ето как съм я решил аз без "break":

        
            var arr1 = Console.ReadLine().Split().Select(long.Parse).ToArray();
            var arr2 = Console.ReadLine().Split().Select(long.Parse).ToArray();

            long maxArray = Math.Max(arr1.Length, arr2.Length);

            for (long i = 0; i < maxArray; i++)
            {
                long sum = arr1[i % arr1.Length] + arr2[i % arr2.Length];

                Console.Write($"{sum} ");
            }  

в Judge 100/100
        

2
02/01/2017 17:44:01
i.petk0v avatar i.petk0v 56 Точки

Здравейте, 

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

РЕШЕНИЕ

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

Какво съм направил:

  1.  четем две числа с .Split() 

    - string[] input = Console.ReadLine().Split();
     string[] input2 = Console.ReadLine().Split();

  2.  Създаваме три масива, където ще пазим входящите данни от двата реда + сумиращите данни.

    int[] num = new int[input.Length];
      int[] nums = new int[input2.Length];
        int[] sum = new int[max];

  3.  Определяме по - големият масив.

     int max = Math.Max(input.Length, input2.Length);

  4. Въртим два цикала в които да парснем ( int.Parse) двата масива от стринг в число.

    for (int i = 0; i < input.Length; i++)
                {
                    num[i] = int.Parse(input[i]);
                }

                for (int i = 0; i < input2.Length; i++)
                {
                    nums[i] = int.Parse(input2[i]);
                }

  5. Събираме двата масива, число по число, като i % input.Lenght отговаря на числото i, но при завъртане на цикъла не спира, а го превърта от начало. Ако се използва само i в края на цикъла от масив ще спре работа и няма да може да Ви завърши събирането.

     for (int i = 0; i < max; i++)
                {
                        sum[i] = num[i % num.Length] + nums[i % nums.Length];
                }

    6. Принтираме с резстояние.

            Console.WriteLine(string.Join(" ",sum));


    Ще се радвам, ако съм бил полезен,
    Поздрави!

1
22/01/2017 02:29:37
stovensssa avatar stovensssa 0 Точки

Здравейте, ето решението на задача без излишни усложнения. Поздрави! 

https://pastebin.com/DUGEDvmn

0