(Visual C) Как да извлека цифри от произволно голямо число?
Имам проблем с една домашна от Уни-то. Дали са ми произволен вход, на който да умножа нечетните цифри и да ги извадя на конзолата.
Примери:
6223=>3
5468=>5
1576=>35
65795=>1575
Имам проблем с една домашна от Уни-то. Дали са ми произволен вход, на който да умножа нечетните цифри и да ги извадя на конзолата.
Примери:
6223=>3
5468=>5
1576=>35
65795=>1575
Visual C?! Сигурен ли си, че пишете на такъв език?
Иначе:
- Намери как да раздробиш числото на съставните му числа - дали с деление или има вграден метод;
- Провери всяко едон от числата дали е нечетно;
- Запази го ако е така;
- Умножи запазените числа
Не разбрах в кое точно се състои проблемът ти. В тази задача аз лично виждам два:
1) произволен вход - не знаеш точно колко е максимумът цифри в числото;
2) не знаеш как да извлечеш всяка от цифрите на числото;
По 1) очевидно няма да стане с int (или byte) digit1,2...n, защото не знаеш колко е n, максимумът въведени цифри. В този случай предполагам се ползва динамичен масив / лист, нещо, с което все още не съм се сблъсквал на C# и не мога да помогна в момента.
По 2) математическият подход да намериш цифрите на едно десетично число е като го делиш на 10 и взимаш остатъка, а резултатът от делението продължиш да делиш на 10 по същия начин толкова пъти, колкото цифри имаш в числото. В твоя пример за 6223:
6223 % 10 = 3 ( 6223 / 10 = 622)
622 % 10 = 2 (622 / 10 = 62)
62 % 10 = 2 (62 / 10 = 6)
6 % 10 = 6
Разбира се преди това трябва да намериш колко цифри имаш в числото, което става по сходен начин, но те интересува кога делението на 10 ще даде резултат по-малък от 1 (там ти е последната цифра).
И като съвет, недей да обръщаш число в стринг, за да търсиш цифрите по позиции. Много повече неща могат да се объркат - може да има минус, може да има десетична запетая/точка и т.н.
Кратко и просто решение, което се сещам е input-а ти да е стринг. После го прокарваш през един for цикъл, който ти проверява всеки индекс в стринга дали е число, и ако е - дали е нечетно. Ако е нечетно го умножаваш по предварително създадена променлива "int/long product =1;" и така всеки път като срещне нечетно число цикъла просто се умножава конкретното число по променливата.
Проблема ми е, че не е зададено колко е голямо числото, иначе знам как да извличам цифрите.
Със стринг е балъшко и 100% ще гърми при определени обстоятелства. Искам помощ да го направя с масив :)
Ако си правиш правилните проверки нито е балъшко, нито ще ти гърми. Другия вариант е с BigInteger но не знам дали има такова животно в C.
Задачата я реших преди около седмица точно по метода на HPetrov и не гърми - има я в конкурсните на Телериг, ако не се лъжа - даде ми 100 от 100 на проверката.
Още повече, че ако използваш стринг ще ти сработи и при инпут от рода на "a23б4 dfgt1", а не само за въведени числа. Доколкото си спомням точно това беше единия от тестовете на bg-coder - не бях предвидил такъв случай и я преправях.
Ето това е метод който намерих в stackoverflow. Мисля че ще ти свърши работа.
Edit: Това е пример за C#, видях че ти търсиш за C. Можеш да видиш алгоритъма ако имаш затруднение при имплементацията пиши :).
Така ми крашва. Някой да знае защо?
Можеш да пробваш следното цък
Накратко да обясна:
1. Вкарвам входа в стринг.
2. Прокарвам всеки елемент от стринга дали е число (винаги е число в твоя случай).
3. Ако е число го вкарвам в промелива odd.
4. Всеки пък когато odd е нечетно num *= odd;
Дано съм ти помогнал
Благодаря ти :) Аз със C# нямам проблем. Уча в ТУ, всъщност вече не и ме помолиха за помощ, а както е известно вероятно на всички - там се учи C. Моето решение стана, просто бях забравил, че трябва да има 1 празен бит в масив и в случая исках 10-цифрено число и трябва да запаза масив от 11 елемента, а запазих само 10. Програмата се оправи и тръгна. Надявам се да не се занимавам вече с това :D
Иначе за C# бях видял някъде библиотека с полезни функции, включително и извличане на цифри, но не помня къде за жалост. Благодаря на всички :)