Loading...
Woofles avatar Woofles 7 Точки

Проблем с конверсия - string to long

Здравейте!
Опитвам се да реша следната задача https://projecteuler.net/problem=8
Използвам string за цифрите и long за произведението но при умножение получавам абсурдно големи резултати.
Първата ми грешка разбира се беше директно да умножа string[i]*long - нея я премахнах вече :)
Сега обаче когато конвертирам стринга към лонг получавам кажи-речи същите резултати.
Конверсията правя със Convert.ToInt64 - в MSDN пише

"Converts the specified string representation of a number to an equivalent 64-bit signed integer."

Къде греша?
Има ли значение това че използвам string а не string[]?

0
Programming Basics
Alex0101 avatar Alex0101 374 Точки

използвай

long.Parse();

Само така се преобразува стринг в число

1
20/06/2016 22:56:37
Woofles avatar Woofles 7 Точки

Long не ми върши работа. Провери условието на задачата ако желаеш - имам произведение което има за горна граница близо 10^13 .....

Long е абсурдно далеч от този размер.
И ако не е проблем би ли обяснил как така "само" ?

0
Filkolev avatar Filkolev 4482 Точки

Стринг може да се преобразува в число по различни начини, включително Convert.ToInt64(). Може и ръчно да се сметне с цикъл. Грешно е по принцип за каквото и да било да се твърди, че само по определен начин може да се направи.

@Woofles, точно long ти трябва, int/uint не ти вършат работа, а няма тип, който да е по-голям от uint и по-малък от long. Това, че е по-голям, не пречи, пречи ако не е достатъчно голям.

1
Alex0101 avatar Alex0101 374 Точки

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

1
Filkolev avatar Filkolev 4482 Точки

Не е нужно да превръщаш типовете. След като имаш стринг, значи работиш със символи, които са числов тип и може да извършваш математически операции директно с тях.

След като смяташ произведение, стартираш от 1 и започваш да умножаваш. От символ за да получиш съответстващата цифра може да ползваш малко аритметика: ch - '0'.

Бърза проверка показва, че най-голямото число, което може да получиш, е 9^13, което е към 10 000 000 000, т.е. спокойно влиза в long.

При това условие може да оптимизираш нещата, да не смяташ всеки път наново, а да ползваш факта, че вече имаш сметнато предходно произведение. Примерно, ако имаш стринг с 14 символа, пътво смяташ произведението на първите 13. За да намериш произведението на 13-те, които започват от втория символ, може предходното произведение да разделиш на първия символ и да умножиш по 14-тия. Т.е. запазваш 12-те символа, които са общи между двете произведения (от втория до тринайсетия) и смяташ само спрямо различните. Не че тук бързодействието е от значение, но все пак.

0
Woofles avatar Woofles 7 Точки

Първо - с алгоритъма казах че нямам проблеми. Това което ти ми предлагаш съм го направил.
Второ - моля провери отново колко е 9^13 и после погледни колко е 2^32-1 (UInt32.MaxValue) :)
Дори да беше 8^13 а не 9 , отново е много повече: 8 = 2^3 следователно 8^13 = (2^3)^13 = 2^(3*13) = 2^39

Иначе тази "аритметика" ми говори нещо но едно че не разбирам от къде идва, защо не се конвертира директно до числото и друго че се интересувам от нещо заложено като възможност в езика.

0
21/06/2016 00:10:06
Woofles avatar Woofles 7 Точки

Извини ме за критиката :) Вместо long мислих че си писал int докато пишех отговора. Не погледнах втори път.

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.