Strings and Text Processing. Problem 5. Convert from base-N to base-10
Колеги, да имате идея защо ми гърми единият тест. Дава ми 80/100.
Кодът е ТУК
Колеги, да имате идея защо ми гърми единият тест. Дава ми 80/100.
Кодът е ТУК
Здравей,
Тествах с единия граничен случай и веднага изкара грешен резултат:
10 100000000000000000000000000000000000000000000000000
Нещо ти се бъга при големи стойности, но не знам какво.
Бих заложил ма MathPaw, но гадая.
Мога и да ти предложа 2 оптимизации на решението, като втората ше разкара MathPaw.
Като за начало, преди да започнеш да умножаваш каквото и да било, може да сложиш един иф веднага след инпута. Ако базата е 10 (което се съмнявам че някой би искал да преобразува от 10 на 10, но все пак го има в условието), да принтираш направо 2рата част от инпута, а не да циклиш и да умножаваш.
2рата оптимизация, която мога да ти предложа, е да държиш в една променлива стойностите, които в твоето решение пресмяташ с MathPaw. С всяка следваща итерация умножаваш това число по съответната база. Так, ако имаш 7*7*7*7*7 например, за да намериш 7 на 6та степен, трябва да умножиш това число по 7 и готово. Като ползваш MathPaw извършваш ненужни умножение (в случая с MathPaw трябва да умножиш 7*7*7*7*7*7, а реално вече имаш отговора на 7*7*7*7*7)
И без тези 2 оптимизации ще получиш 100 точки в Джъджа, но е добре да ги прилагаш ако е възможно :)
Поздрави!
Здравей,
Някое от изчисленията излиза от int, затова ти се чупи теста. Направи всички операции да са с BigInteger:
BigInteger num = new BigInteger(char.GetNumericValue(number[n]));
BigInteger forSum = BigInteger.Multiply(num, BigInteger.Pow(new BigInteger(baseN), i));
result += forSum;
Поздрави, Дени
Здравей и на теб.
Това го опитах и не стана :)
Здравей пак :)
Ето го цялото, дава си 100 точки:
namespace _05.ConvertFromBase_NtoBase_10
{
using System;
using System.Numerics;
public class FromBase
{
public static void Main()
{
string[] line = Console.ReadLine().Trim().Split();
int baseN = int.Parse(line[0]);
char[] number = line[1].ToCharArray();
BigInteger result = new BigInteger(0);
for (int i = number.Length - 1, n = 0; i >= 0; i--, n++)
{
BigInteger num = new BigInteger(char.GetNumericValue(number[n]));
BigInteger forSum = BigInteger.Multiply(num, BigInteger.Pow(new BigInteger(baseN), i));
result += forSum;
}
Console.WriteLine(result.ToString());
}
}
}
Поздрави, Дени
Здравей,
Проблемът в нейното решение е MathPaw. Връща double и явно като превърти връща и грешни стойности/гърми. Като се замени с BigInteger.Pow работи.
Да, това е бил проблема, както каза по - рано.
Поздрави!
Мога ли да попитам за същата задача ,защото имам същият проблем с разликата че използвам собствен метод MathPow и го правя да приема BigInteger ,защото се бях сетил за вградения че приема double. Това е кода ми дава 80/100.
http://pastebin.com/Paj2JXYS
Благодаря предварително.
Честно казано нямам идея защо ти се получава така, но пробвай с по-опростен код...изглежда ми излишно сложно, за това, което се иска. Виж моя вариант.
http://pastebin.com/TEVJMpKM
Странно, току що пробвах кода ти и ми го прие със 100 точки...метода ти би трябвало да работи. Единствено, не знам до колко е адекватно, но ако искаш добави във for-цикъла на метода, индекса i да не ти е int, а BigInteger...евентуално може в някаква екстремна ситуация да върти цикъла много пъти и затова да не ти е приемало решението, но на сегашния Fundamentals курс го приема и така, и с BigInt във for цикъла.
static BigInteger MathPow(BigInteger baseN, BigInteger index)
{
BigInteger number = 1;
for (BigInteger i = 0; i < index; i++)
{
number = number * baseN;
}
return number;
}
здравейте,
едно решение и от мен:
https://pastebin.com/LyLvPYJj
надявам се да е полезно.
Поздрави и успех!