Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Ace_400
1 / 1 / 0
Регистрация: 10.05.2017
Сообщений: 33
1

Найти, сколько чисел меньших X имеют в своей десятичной записи только цифры 0 и 1

02.11.2017, 15:31. Просмотров 278. Ответов 12
Метки нет (Все метки)

Помогите,мучаюсь 5 день.Найти ,сколько чисел меньших X (икс) имеют в своей десятичной записи только цифры 0 и 1
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.11.2017, 15:31
Ответы с готовыми решениями:

Найти ,сколько чисел меньших X (икс) имеют в своей десятичной записи только цифры 0 и 1 - C (СИ)
Как написать эту программу без массивов и функций.Буду очень признателен, если поможете На вход...

Посчитать, сколько чисел в данной последовательности имеют уникальные две последние цифры
Дана последовательность целых положительных чисел. Каждое число может принимать значение от 100 до...

Сколько существует n-значных чисел, в десятичной записи которых нет двух подряд идущих нулей
Сколько существует n-значных чисел, в десятичной записи которых нет двух подряд идущих нулей. Свои...

Найти те числа отрезка, которое в своей записи имеют только четные цифры
Дан натуральный отрезок чисел . Найти те числа этого отрезка, которые в своей записи имеют только...

Найти произведение тех чисел, которые не имеют в своей записи цифры 3
Вводятся 4х-значные числа. Найти произведение тех из них, которые не имеют к своей записи цифры 3.

12
Kukstyler
Mayorista nolimpiopescado
811 / 532 / 172
Регистрация: 02.04.2009
Сообщений: 2,362
02.11.2017, 15:57 2
Ace_400,

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdbool.h>
#include <stdio.h>
 
bool check(char str[10]){
    int i;
    bool isValid = true;
 
    while (str[i] != '\n' && str[i] != '\0' && i < 10 && isValid) {
        if (str[i] != '1' && str[i] != '0' ) {
            isValid = false;
        }
        i++;
    }
 
    return isValid;
}
 
int main(int argc, char **argv) {
    setbuf(stdout, NULL);
 
    int max;
 
    printf("Vvedite Max chislo: ");
    scanf("%d", &max);
 
    for (int i = 0; i < max; i++) {
        char string[10];
 
        sprintf(string, "%d", i);
 
        if (check(string) == true) {
            printf("%s \n", string);
        }
    }
}
1
woldemas
446 / 318 / 174
Регистрация: 06.09.2013
Сообщений: 966
02.11.2017, 17:31 3
Ace_400, как всегда рекурсивно:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <stdlib.h>
 
int count01(int x, int b) {
    if(x == 0) return 0;
    if(b == 0) return 1 + count01(x, b + 1);
    else if(b < x) return 1 + count01(x, b * 10) + count01(x, b * 10 + 1);
    return 0;
 
}
 
int main() {
    int x;
    printf("Введите x: ");
    scanf("%d", &x);
    printf("%d", count01(x, 0));
    return 0;
}
1
Kukstyler
02.11.2017, 19:08
  #4

Не по теме:

Цитата Сообщение от woldemas Посмотреть сообщение
как всегда
Почему всегда? Рекурсия далеко не всегда приветствуется, ибо код упрощается, но она гурман ресурсов. (Ибо для каждой итерации, создаётся новая копия данных). :)

0
Ace_400
1 / 1 / 0
Регистрация: 10.05.2017
Сообщений: 33
03.11.2017, 10:34  [ТС] 5
Я только начал изучать СИ можно без функций
0
Kukstyler
Mayorista nolimpiopescado
811 / 532 / 172
Регистрация: 02.04.2009
Сообщений: 2,362
03.11.2017, 10:44 6
Ace_400,

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdbool.h>
#include <stdio.h>
 
int main(int argc, char **argv) {
    setbuf(stdout, NULL);
 
    int max;
 
    printf("Vvedite Max chislo: ");
    scanf("%d", &max);
 
    for (int i = 0; i < max; i++) {
        char string[10];
 
        sprintf(string, "%d", i);
 
        int j = 0;
        bool isValid = true;
 
        while (string[j] != '\n' && string[j] != '\0' && j < 10 && isValid) {
            if (string[j] != '1' && string[j] != '0' ) {
                isValid = false;
            }
            j++;
        }
 
        if (isValid) {
            printf("%s \n", string);
        }
    }
}
1
Ace_400
1 / 1 / 0
Регистрация: 10.05.2017
Сообщений: 33
03.11.2017, 23:50  [ТС] 7
Добавлено через 9 минут
А есть программа без этого???

C
1
2
3
4
setbuf(stdout, NULL);
char **argv
char string[10];
sprintf(string, "%d", i)
0
Kukstyler
Mayorista nolimpiopescado
811 / 532 / 172
Регистрация: 02.04.2009
Сообщений: 2,362
04.11.2017, 00:18 8

Не по теме:

как говорят классики Java раздела - наркоман что ли? :-|



Ace_400, setbuf(stdout, NULL); можете смело убрать (это только для Eclipse).

А уж без остального никак. Советую хоть чуток погуглить каждую из строчек, там их не так-то много, если хотите чему-то научиться, (и продолжать получать помощь в разделе).
0
woldemas
446 / 318 / 174
Регистрация: 06.09.2013
Сообщений: 966
04.11.2017, 06:54 9
Цитата Сообщение от Kukstyler Посмотреть сообщение
А уж без остального никак
Видимо Ace_400 требуется решение без строковых преобразований.
К тому же ваше решение очень далеко от оптимальности, большинство проверяемых чисел - очевидно не подпадают под условие. Зачем использовать инкремент, когда можно генерировать именно числа из 0 и 1?
Рекурсивный вариант я приводил. Заменить рекурсию стеком:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <stdlib.h>
 
int main() {
    int x;
    int s[20] = { 1 }; 
    int count = 1;
    int pos = 1;
    printf("Введите x: ");
    scanf("%d", &x);
    while(pos) {
        int n = s[--pos];
        if(n < x) {
            count++;
            s[pos++] = 10 * n;
            s[pos++] = 10 * n + 1;
        }
    }
    printf("%d", count);
}
0
Байт
Эксперт C
20455 / 12984 / 2729
Регистрация: 24.12.2010
Сообщений: 27,168
04.11.2017, 11:10 10
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
#include <stdlib.h>
 
int main() {
    int X, x, n, P=1;
    int count;  
    printf("Введите X: ");
    scanf("%d", &X);
    x = X;
    while(x) {
      x /= 10;
      P *= 2; 
    }
    count = P/2 - 1;
    for(n=P/2 + 1; n<P; n++) {
       int k = n;
       int y = 0;
       while(k) {
          y = 10*y + (k&1);
          if (y >= X) break;
          k = k >> 1;
       }
        if (y < X) count++;
    }
    printf("%d", count);
}
Не проверял. Возможны неточности типа +- 1

Добавлено через 21 минуту
Да, неточности есть. Вот как-будто рабочий вариант
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>
#include <stdlib.h>
 
int main() {
    int X, x, n, P=1;
    int count;  
    printf("Введите X: ");
    scanf("%d", &X);
    x = X;
    while(x) {
      x /= 10;
      P *= 2; 
    }
    count = P/2 - 1;
    for(n=P/2; n<P; n++) {
       int k = n;
       int y = 0;
       int P10 = 1;
       while(k) {
          y += (k&1)*P10;
          if (y >= X) break;
          k = k >> 1;
          P10 *= 10;
       }
       if (y < X) count++;
       else break;
    }
    printf("%d", count);
}
0
Kukstyler
Mayorista nolimpiopescado
811 / 532 / 172
Регистрация: 02.04.2009
Сообщений: 2,362
04.11.2017, 11:39 11
woldemas, я не говорил, что мой вариант оптимальный.
Помогая новичкам, я (почти) никогда не создаю реально оптимальный код, по нескольким причинам. Начнём с того, что ни один нормальный лектор не поверит, что решение студент нашёл сам. Ну а потом: имхо, не оптимальные, но ясные, простые и читабельные варианты кода могут научить студента хоть чему-то, ибо ему не сложно в нём хоть что-то понять. В реально оптимальном, как правило есть тонкости и сложности, в которых новичок и копаться не станет, и в итоге ни фига не поняв, ничего и не выучит.
0
Ace_400
1 / 1 / 0
Регистрация: 10.05.2017
Сообщений: 33
06.11.2017, 16:00  [ТС] 12
Благодаря вам я с этим разобрался,огромное спасибо!!!
А вы знаете как написать по этому заданию структуртрованную или программу с метками?
Другу помог похожую , свою не сделал
0
Ace_400
1 / 1 / 0
Регистрация: 10.05.2017
Сообщений: 33
08.11.2017, 10:49  [ТС] 13
МОЖЕТЕ ПОДСКАЗАТЬ,ЧТО ДЕЛАЕТ КАЖДАЯ ИЗ СТРОК?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>
#include <stdlib.h>
 
int main() {
    int X, x, n, P=1;
    int count;  
    printf("Введите X: ");
    scanf("%d", &X);
    x = X;
    while(x) {
      x /= 10;
      P *= 2; 
    }
    count = P/2 - 1;
    for(n=P/2; n<P; n++) {
       int k = n;
       int y = 0;
       int P10 = 1;
       while(k) {
          y += (k&1)*P10;
          if (y >= X) break;
          k = k >> 1;
          P10 *= 10;
       }
       if (y < X) count++;
       else break;
    }
    printf("%d", count);
}
0
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru