21

Re: Перевірка входження цифри в певне число

koala написав:

Це я про підхід до задачі.

В PHP теж люблять функціональне програмування? Респект. Я то думав що це лише в мовах які беруть ідеї від Scheme.

22 Востаннє редагувалося coder (02.11.2015 13:10:49)

Re: Перевірка входження цифри в певне число

P.Y. написав:
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 "Не входить";
}

23 Востаннє редагувалося coder (02.11.2015 13:58:06)

Re: Перевірка входження цифри в певне число

тут було щось не те...

24

Re: Перевірка входження цифри в певне число

А як вам мій мегакід?

#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;
}

25 Востаннє редагувалося P.Y. (02.11.2015 14:49:38)

Re: Перевірка входження цифри в певне число

Хто вам сказав що якщо біти цифри виставлені в числі set то ця цифра в десятковому представлені є в цьому числі?

Див. рядок 2: ми не порівнюємо з маскою десяткову цифру безпосередньо, а зміщуємо 1 на кількість двійкових розрядів, що відповідає її числовому значенню. Іншими словами, замість цифри n береться 2n — маска з одиницею в n-му розряді й нулями в решті.

Крім того, цей код оперує з вводом на рівні окремих символів — перетворення їх послідовності в ціле число непотрібне.

26

Re: Перевірка входження цифри в певне число

Ясно, значить я неправильно зрозумів ваш код. Незнав що одиниця зміщена на n розрядів вліво дає числове значення n.

27 Востаннє редагувалося koala (02.11.2015 17:10:43)

Re: Перевірка входження цифри в певне число

Нащо множити?

bool hasDigit(int number, int digit)
{
  do {
    if( number % 10 == digit ) {
      return true;
    }
    number /= 10;
  } while( number > 0 );
  return false;
}

28 Востаннє редагувалося P.Y. (02.11.2015 17:58:34)

Re: Перевірка входження цифри в певне число

coder написав:

Ясно, значить я неправильно зрозумів ваш код. Незнав що одиниця зміщена на n розрядів вліво дає числове значення n.

Дає числове значення 2n. Але, в даному випадку, має значення інше: в n-й біт маски записується одиниця, якщо число n є в наборі, й нуль, якщо нема. А потім ми так само зсувом одиниці на n розрядів робимо маску для цифри, яку шукаємо, й співставляємо обидві маски побітним оператором &.

29

Re: Перевірка входження цифри в певне число

Я зрозумів вже. У вас маска виконує роль масива типу ( '0' => true,  '1' => true,  '2' => true,  '3' => false,  '4' => true,  '5' => false, '6' => true,  '7' => true,  '8' => true,  '9' => false) і потім ви посуваєте на n одиницю вліво і те що вийшло через & порівнюєте з маскою.

п.с логіка одразу неочевидна.

30

Re: Перевірка входження цифри в певне число

Для наглядності можна було зробити масив типу:

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);
    }