Здравейте защо на задача Pascal triangle ми дава 66/100 https://pastebin.com/aMZN9qXQ
линк към задачата https://judge.softuni.bg/Contests/Practice/Index/1452#0
Здравей колега,
Предлагам ти едно просто решение без използване на матрици.
За да работи кода коректно и при по-големи стойности за n е необходмо елементите на листа да са от тип Biginteger.
Здравейте, моля за помощ в логиката ми за същата задача. Опитвам се да я реша по следния начин:
-приемам, че първоначално имаме един главен масив- "main", който се състой само от една цифра равна на 1;
-докато главния масив е с дължина<n(числото, което е равно на броя на редовете , като именно него първоначално четем) създаваме нов масив "pascal []", чиято дължина ще се увеличава с 1 при всяка итерация на цикъла;
- този масив "pascal []" с for цикъл го пълня със сбора от числата на главния "main []" масив, като приемам, че винаги първото и последното му число ще са равни на 1;
Резултатът ми е "чудесен": "System.IndexOutOfRangeException " . Моля за помощ!
using System;
using System.Linq;
namespace Arrays1
{
class MainClas
{
public static void Main()
{
int lineNumbers = int.Parse(Console.ReadLine());
long []main = new long[1];
main[0] = 1;
while (main.Length <lineNumbers) {
long[] pascalArray = new long [main.Length + 1];
pascalArray[0] = 1;
for (int i = 1; i < pascalArray.Length; i++)
{
pascalArray[i] = main[i] + main[i + 1];
}
pascalArray[main.Length - 1] = 1;
main = pascalArray;
Console.WriteLine($"{pascalArray}");
}
}
}
}
@Elena123456
Опитвате да достъпите невалиден индекс на main[]:
Вижте и съветите на колегите по-горе - за тази задача трябва да се използва BigInteger[], а не long[]
@MartinBG
Благодаря, че ми обяснихте защо ми се получаваше : "System.IndexOutOfRangeException " . Сега след корекциите вече достъпвам валидни индекси, като и с една if проверка влизам в for цикъла за да създавам нов pascalArray само когато main.Length е >1. Резултата е, че печатам Pascal Triangle, но винаги с "0" накрая.
при input=4:
1 0
1 1 0
1 2 1 0
1 3 3 1 0
Възможно ли е да получавам винаги "0" накрая, защото използвам long, а не BigInteger? При мен не работи BigInteger. На няколко пъти се опитвам да инсталирам System.Numerics на Monodevelop 6.8.0.123 , но не намирам достатъчно информация. Накрая или ще сменя версията с по-нова или ще мина на Windows и Visul Studio.
using System;
using System.Linq;
namespace Arrays1
{
class MainClas
{
public static void Main()
{
long lineNumbers = long.Parse(Console.ReadLine());
long[]main = new long[1];
main[0] = 1;
while (main.Length <=lineNumbers) {
long[] pascalArray = new long [main.Length + 1];
pascalArray[0] = 1;
if (main.Length > 1)
{
for (long i = 1; i < pascalArray.Length - 1; i++)
{
pascalArray[i] = main[i - 1] + main[i];
}
}
pascalArray[main.Length - 1] = 1;
main = pascalArray;
Console.WriteLine(string.Join(" ",main));
}
}
}
}
Поздрави и още веднъж благодаря за съветите Ви!
@Elena123456
Имаше няколко дребни проблема в решението, но логиката Ви като цяло беше коректна.
Това е оправеният код:
Пробвах го в няколко от състезанията в Judge и навсякъде взе 100/100, което означава, или че тестовете са променени и вече не е необходимо да се използва BigInteger, или че тестовите резултати са генерирани с решение, което използва long и също са грешни. :)
MartinBG , извинявайте, че Ви отнемам от времето в неделния ден и благодаря отново.
Проверих резултата и на MonoDevelop, след като видях, че Judge дава 100/100. При мен се оказва, че не дава никакъв резултат и ми подчертава тук:
Явно не само BigInteger нямам, но и този специален символ "^".
След като направя опит да заменя целия израз с:
"pascalArray[main.Length - 1] = 1;", резултат вече става още по-далечен от очаквания, дори и при положение, че вече принтирам главния масив в началото, както Вие сте показали.
input=4
1
1 0
1 1 0
1 2 1 0
Въпроса ми е следния-винаги ли е най-удачно за взимане на последния елемент да се използва начина, който Вие сте показали или има вариант да избегна този специален символ:
Сега се досетих, че ако принтираме съвсем в началото главния масив, няма ли да остане винаги последния ред непринтиран, без значение каква формула използваме за последния елемент от масивите? Няма да се очудя ако проблема отново си е при мен на MonoDevelopa.
Хубава вечер!
@Elena123456
Правилно сте се ориентирала да замените pascalArray[^1] с еквивалента му за достъпване на последен идекс, но не използвате дължината на правилния масив:
pascalArray[main.Length - 1] = 1
Не трябва да използвате дължината на main, а на pascalArray:
pascalArray[pascalArray.Length - 1] = 1
main е с един елемент по-къс от pascalArray и затова последният елемент на всеки ред остава с дефолтната си стойност (0)
На какава операционна система работите?
Най-добре отворете нова тема за проблема с MonoDevelop - сигурен съм, че аз или други колеги ще можем да Ви помогнем със сетъпа.
@MartinBG
благодаря за всички съвети и напътствия досега.
Щастлива съм, че най-накрая задачата е 100/100 и при мен, която впрочем е Fundamental modul More Exercise- https://judge.softuni.bg/Contests/Practice/Index/1275#1 :)
А относно MonoDevelop да, най-удачния вариант ще е да отворя нова тема, че непрекъснато излиза нещо, което не мога да ползвам. Благодаря за предложената помощ отностно настройките.
Хубав ден и успешна седмица!
using System;
using System.Linq;
namespace Arrays1
{
class MainClas
{
public static void Main()
{
long lineNumbers = long.Parse(Console.ReadLine());
long[]main = new long[1];
main[0] = 1;
while (main.Length <=lineNumbers) {
Console.WriteLine(string.Join(" ", main));
long[] pascalArray = new long [main.Length + 1];
pascalArray[0] = 1;
pascalArray[pascalArray.Length - 1] = 1;
if (main.Length > 1)
{
for (long i = 1; i < pascalArray.Length - 1; i++)
{
pascalArray[i] = main[i - 1] + main[i];
}
}
main = pascalArray;
}
}
}
}
Впрочем след почти 3 месеца намирам логиката ми за съответната задача за крайно усложнена. Но благодаря за усилията на @MartinBG , че тогава отдели не само няколко дена под ред, но и част от неделния си ден за да нанесе корекции в кода ми. :)
До този момент за мен най-простото решение и съответно най-очевидното е следното:
1. Хардкодвам си първите два реда на триъгълника;
2. При следващите редове има явен алгоритъм: винаги първия и последния елемент е 1, а останалите елементи се получават, като сбор от елементите на по-горния ред (newNumbers[i] = oldNumbers[i - 1] + oldNumbers[i]). След което oldNumbers става равен на newNumbers.ToArray();, че да можем да го използваме за намиране числата и за следващия ред, ако се налага.
И вече тестовете са оправени и не са нужни long или BigInteger, а може и само с int. Новото ми решение дава 100/100, но се вижда ясно, че Zero test #2 (Incorrect answer) е счупен. Той е с инпут 13. Още в самото условие се вижда какво трябва да получим при този инпут, но ето какво очаква теста в Judge при инпут 13:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
Но въпреки това Judge не санкционира, така че всичко е наред. :)
using System;
using System.Collections.Generic;
using System.Linq;
namespace ArrayMoreExe
{
class MainClass
{
public static void Main(string[] args)
{
int n = int.Parse(Console.ReadLine());
int[] oldNumbers = new int[2];
for (int row = 0; row < n; row++)
{
if (row == 0)
{
Console.WriteLine($"{1}");
}
else if (row == 1)
{
oldNumbers = new int[2]
{
1,
1
};
Console.WriteLine(string.Join(" ", oldNumbers));
}
else
{
int[] newNumbers = new int[row + 1];
newNumbers[0] = 1;
newNumbers[newNumbers.Length - 1] = 1;
for (int i = 1; i <= newNumbers.Length-2; i++)
{
newNumbers[i] = oldNumbers[i - 1] + oldNumbers[i];
}
Console.WriteLine(string.Join(" ", newNumbers));
oldNumbers = newNumbers.ToArray();
}
}
}
}
}
Здравейте колеги,
ще си позволя още един коментар за въпросната задача, тъй като ми е до болка позната, защото така се случва, че на всеки 3 месеца се връщам на нея с ново решение, коренно различно от предишните.
Въпреки горните ми две решения, най-интуитивното решение за изписването тръгълника на Паскал за мен си остава това с многомерните масиви. Благодаря за обяснението и за решението на Николай Костов- един от топ трейнърите на СофтУни в направлението C#.
Успех на всички!
}