Re: Перевірка входження цифри в певне число
Це я про підхід до задачі.
В PHP теж люблять функціональне програмування? Респект. Я то думав що це лише в мовах які беруть ідеї від Scheme.
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → C++ → Перевірка входження цифри в певне число
Для відправлення відповіді ви повинні увійти або зареєструватися
Це я про підхід до задачі.
В PHP теж люблять функціональне програмування? Респект. Я то думав що це лише в мовах які беруть ідеї від Scheme.
P.Y. написав:Також можна посимвольно читати число, при цьому записуючи кожну введену цифру в множину цифр числа (множину можна реалізувати як булевий масив або як число-маску з десятьма бітами — для кожної можливої цифри), а потім перевірити, чи входить шукана цифра в цю множину.
Маю на увазі щось приблизно таке:
#include<stdio.h> #define ch2set(c) (1<<(c-'0')) main() { for(;;) { int set=0; char c; printf("Введіть число: "); do c=getchar(); while(c<'0'||c>'9');// Пропускаємо порожні символи й читаємо цифру while(c>='0' && c<='9') { set|=ch2set(c); c=getchar(); } printf("Введіть цифру: "); do c=getchar(); while(c<'0'||c>'9');// Пропускаємо порожні символи й читаємо цифру if(set & ch2set(c)) printf("Цифра %c є в числі\n", c); else printf("Цифри %c нема в числі\n", c); } }
Хто вам сказав що якщо біти цифри виставлені в числі set то ця цифра в десятковому представлені є в цьому числі?
Дивіться:
Число 25 це 00011001 а цифра 2 це 00000010. Ви бачите що біт двійки не входить в маску бітів числа 25 а цифра входить в число.
if ((25 & 2)) {
echo "Входить";
} else {
echo "Не входить";
}
тут було щось не те...
А як вам мій мегакід?
#include <stdio.h>
int isContains(int number, int digit)
{
int i=1;
do
{
i*=10;
}
while(number/i>10);
while(number>0)
{
int j = number/i;
if(j==digit)
return 1;
number-=(j*i);
i/=10;
}
return 0;
}
int main(void) {
printf("%d",isContains(1225,3));
return 0;
}
Хто вам сказав що якщо біти цифри виставлені в числі set то ця цифра в десятковому представлені є в цьому числі?
Див. рядок 2: ми не порівнюємо з маскою десяткову цифру безпосередньо, а зміщуємо 1 на кількість двійкових розрядів, що відповідає її числовому значенню. Іншими словами, замість цифри n береться 2n — маска з одиницею в n-му розряді й нулями в решті.
Крім того, цей код оперує з вводом на рівні окремих символів — перетворення їх послідовності в ціле число непотрібне.
Ясно, значить я неправильно зрозумів ваш код. Незнав що одиниця зміщена на n розрядів вліво дає числове значення n.
Нащо множити?
bool hasDigit(int number, int digit)
{
do {
if( number % 10 == digit ) {
return true;
}
number /= 10;
} while( number > 0 );
return false;
}
Ясно, значить я неправильно зрозумів ваш код. Незнав що одиниця зміщена на n розрядів вліво дає числове значення n.
Дає числове значення 2n. Але, в даному випадку, має значення інше: в n-й біт маски записується одиниця, якщо число n є в наборі, й нуль, якщо нема. А потім ми так само зсувом одиниці на n розрядів робимо маску для цифри, яку шукаємо, й співставляємо обидві маски побітним оператором &.
Я зрозумів вже. У вас маска виконує роль масива типу ( '0' => true, '1' => true, '2' => true, '3' => false, '4' => true, '5' => false, '6' => true, '7' => true, '8' => true, '9' => false) і потім ви посуваєте на n одиницю вліво і те що вийшло через & порівнюєте з маскою.
п.с логіка одразу неочевидна.
Для наглядності можна було зробити масив типу:
bool digits[10];
while(c>='0' && c<='9') {
digits[c - '0'] = true;
c=getchar();
}
...
while(c<'0' || c>'9'); // Пропускаємо порожні символи й читаємо цифру
if(digits[c-'0'])
printf("Цифра %c є в числі\n", c);
else
printf("Цифри %c нема в числі\n", c);
}
Для відправлення відповіді ви повинні увійти або зареєструватися