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

Здравей,

 

Тествах с единия граничен случай и веднага изкара грешен резултат:

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 точки в Джъджа, но е добре да ги прилагаш ако е възможно :)

 

Поздрави!

0
03/06/2016 18:12:43
denka avatar denka 52 Точки

Здравей,

Някое от изчисленията излиза от int, затова ти се чупи теста. Направи всички операции да са с BigInteger:

BigInteger num = new BigInteger(char.GetNumericValue(number[n]));
BigInteger forSum = BigInteger.Multiply(num, BigInteger.Pow(new BigInteger(baseN), i));
result += forSum;

Поздрави, Дени

1
AntyfrizZz avatar AntyfrizZz 238 Точки

Здравей и на теб.

 

Това го опитах и не стана :)

0
denka avatar denka 52 Точки

Здравей пак :)

Ето го цялото, дава си 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());
        }
    }
}

Поздрави, Дени

2
AntyfrizZz avatar AntyfrizZz 238 Точки

Здравей,

 

Проблемът в нейното решение е MathPaw. Връща double и явно като превърти връща и грешни стойности/гърми. Като се замени с BigInteger.Pow работи.

Да, това е бил проблема, както каза по - рано.

 

Поздрави!

1
TeodorDimitrov89 avatar TeodorDimitrov89 266 Точки

Мога ли да попитам за същата задача ,защото имам същият проблем с разликата че използвам собствен метод MathPow и го правя да приема BigInteger ,защото се бях сетил за вградения че приема double. Това е кода ми дава 80/100.

http://pastebin.com/Paj2JXYS

 

Благодаря предварително.

0
LardaX avatar LardaX 15 Точки

Честно казано нямам идея защо ти се получава така, но пробвай с по-опростен код...изглежда ми излишно сложно, за това, което се иска. Виж моя вариант.
http://pastebin.com/TEVJMpKM

0
LardaX avatar LardaX 15 Точки

Странно, току що пробвах кода ти и ми го прие със 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;
        }

0
athanatos avatar athanatos 4 Точки

здравейте,

едно решение и от мен:

https://pastebin.com/LyLvPYJj

 

надявам се да е полезно.

Поздрави и успех!

0