Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.70/27: Рейтинг темы: голосов - 27, средняя оценка - 4.70
1406 / 648 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2

Задача на динамику или комбинаторику

11.08.2011, 11:50. Показов 5597. Ответов 33
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Условие
Для заданных натуральных чисел N и K требуется вычислить количество чисел от 1 до N, имеющих в двоичной записи ровно K нулей. два натуральных числа через пробел N и K, не превышающие 10^9

На этой задаче мой решения не проходят по времени. Можно услышать ваше мнение по поводу решения этой задачи?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.08.2011, 11:50
Ответы с готовыми решениями:

Задача на комбинаторику
Добрый вечер! Который день пытаюсь решить задачу "Счастливые числа": все знают, что счастливые числа – это те числа, которые содержат...

Задача на комбинаторику
в общем наткнулся на задачу и не могу решить, обидно даже, ведь решал и потяжелее, а сейчас в голову ничего кроме простого долгого перебора...

Задача про фишки на комбинаторику
У Андрея есть огромное количество фишек N цветов. Он хочет выложить некоторое количество фишек в один ряд так, чтобы для любых двух...

33
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
11.08.2011, 12:01
покажите ваше решение, а мы подправим
0
9 / 8 / 1
Регистрация: 05.08.2011
Сообщений: 56
11.08.2011, 12:08
Я думаю для скорости подойдет Tasm 5.0 . Писать прогу?
0
1406 / 648 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
11.08.2011, 12:13  [ТС]
Цитата Сообщение от mac_alleb Посмотреть сообщение
Я думаю для скорости подойдет Tasm 5.0 . Писать прогу?
Да, пожалуйста - очень интересно взглянуть.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
11.08.2011, 12:16
Код и скриншот раоты
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
#include <windows.h>
#include <string.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
 
int main()
{
    char ch;
    long i,N,K;
    int nCount = -1;
    char str[19];
    do
    {
        printf("Enter numbers:\r\n");
        scanf("%[^\n]",str);
        sscanf(str,"%u %u",&N,&K);
        K = pow(10,K);
        for(i = 1; i < N; i++)
        {
            if(K <= i && i % K == 0)
                nCount++;
        }
        printf("from 1 to %u %d numbers with square %u\r\n",N,nCount + 1,K);
        printf("[Y/N] Y - Enter new numbers\r\n");
        ch = getch();
    }
    while(toupper(ch) == 'Y');
    return 0;
}
Миниатюры
Задача на динамику или комбинаторику  
0
1406 / 648 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
11.08.2011, 12:23  [ТС]
У меня ошибки в программе выдавало, я их исправил, но код медленный - введите для верности 100000000 1. Ограничение времени - 1 секунда.
Вот я исправил:
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 <windows.h>
#include <string.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <ctype.h>
 
int main()
{
        char ch;
        long i,N,K;
        int nCount = -1;
        char str[19];
        do
        {
                printf("Enter numbers:\r\n");
                scanf("%[^\n]",str);
                sscanf(str,"%u %u",&N,&K);
                K = int(pow(float(10),float(K)));
                for(i = 1; i < N; i++)
                {
                        if(K <= i && i % K == 0)
                                nCount++;
                }
                printf("from 1 to %u %d numbers with square %u\r\n",N,nCount + 1,K);
                printf("[Y/N] Y - Enter new numbers\r\n");
                ch = getch();
        }
        while(toupper(ch) == 'Y');
        return 0;
}
Компилятор не брал.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
11.08.2011, 12:23
Хотя если нужны все числа, даже те у которых нули внутри их записи, то вот такой код пойдёт
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
#include <windows.h>
#include <string.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
 
int main()
{
    char ch;
    long i,N,K;
    int nCount = -1;
    char str[19];
    char buf[9];
    char num[9];
    do
    {
        printf("Enter numbers:\r\n");
        scanf("%[^\n]",str);
        sscanf(str,"%u %u",&N,&K);
        sprintf(buf,"%u",pow(10,K));
        
        for(i = 1; i < N; i++)
        {
            sprintf(num,"%u",i);
            if(strstr(num,buf))
                nCount++;
        }
        printf("from 1 to %u %d numbers with square %u\r\n",N,nCount + 1,K);
        printf("[Y/N] Y - Enter new numbers\r\n");
        ch = getch();
    }
    while(toupper(ch) == 'Y');
    return 0;
}
Миниатюры
Задача на динамику или комбинаторику  
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
11.08.2011, 12:25
Цитата Сообщение от Dani Посмотреть сообщение
но код медленный - введите для верности 100000000 1. Ограничение времени - 1 секунда.
- такие моменты нужно сразу оговаривать
0
1406 / 648 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
11.08.2011, 12:27  [ТС]
Цитата Сообщение от Dani Посмотреть сообщение
код медленный - введите для верности 100000000 1. Ограничение времени - 1 секунда.
Все равно на эти числа не идет - в том то и загвостка что долго работает может комбинаторику подключить?

Добавлено через 32 секунды
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
такие моменты нужно сразу оговаривать
Извиняюсь
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
11.08.2011, 12:35
Цитата Сообщение от Dani Посмотреть сообщение
в том то и загвостка что долго работает
Всё что смог придумать это изменить шаг итерации, время уменьшилось но не до секунды, хотя время выполнения также и от ресурсов ЭВМ зависит
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
36
37
38
#include <windows.h>
#include <string.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
 
int main()
{
    char ch;
    long i,N,K,step = 1;
    int nCount = -1;
    char str[19];
    char buf[9];
    char num[9];
    do
    {
        printf("Enter numbers:\r\n");
        scanf("%[^\n]",str);
        sscanf(str,"%u %u",&N,&K);
        sprintf(buf,"%u",pow(10,K));
        
        for(i = 1; i < N; i+=step)
        {
            sprintf(num,"%u",i);
            if(strstr(num,buf))
            {
                nCount++;
                if(step == 1)
                    step = pow(10,K);
            }
        }
        printf("from 1 to %u %d numbers with square %u\r\n",N,nCount + 1,K);
        printf("[Y/N] Y - Enter new numbers\r\n");
        ch = getch();
    }
    while(toupper(ch) == 'Y');
    return 0;
}
Миниатюры
Задача на динамику или комбинаторику  
0
1406 / 648 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
11.08.2011, 12:37  [ТС]
Может генерировать сочетания с повторениями?
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
11.08.2011, 12:38
Можеть быть тривиальное решение правильно
Число чисел = N/K ?

Добавлено через 45 секунд
Цитата Сообщение от Dani Посмотреть сообщение
Может генерировать сочетания с повторениями?
Это займёт много времени, думаю не меньше чем простой перебор
0
1406 / 648 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
11.08.2011, 12:40  [ТС]
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Можеть быть тривиальное решение правильно
Число чисел = N/K ?
Нет. 8 и 1 - 3 должно быть
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
11.08.2011, 12:41
Поразмыслил вот мои сображения:
от 1 до 100-ни - 10-десяток т.е в 100/10 раз меньше, => 100000000 / 10 = 10000000 чисел

Добавлено через 1 минуту
Цитата Сообщение от Dani Посмотреть сообщение
Нет. 8 и 1 - 3 должно быть
в числах от 1-го до 8-ми вообще 10-ти нет или я не правильно понимаю задание?
0
1406 / 648 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
11.08.2011, 12:45  [ТС]
1 - 1
2 - 10
3 - 11
4 - 100
5 - 101
6 - 110
7 - 111
8 - 1000
Имеющие в двоичной записи 1 нуль: 10, 110,101
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
11.08.2011, 13:32
Цитата Сообщение от Dani Посмотреть сообщение
имеющих в двоичной записи ровно K нулей
- недочитал задание, ну так тут нужно в двоичную переводить. Перевод + сравнение и перебор до N да ещё за секунду, думаю это за дольшее время делается....
0
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
11.08.2011, 13:36
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Перевод + сравнение и перебор до N да ещё за секунду, думаю это за дольшее время делается....
Перебор никак не пройдет.
Тут комбинаторика...
Есть у меня одна идея, попробую реализовать =)
Если пройдет все тесты на acmp - отпишусь.
0
1406 / 648 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
11.08.2011, 14:47  [ТС]
Цитата Сообщение от diagon Посмотреть сообщение
Если пройдет все тесты на acmp - отпишусь.
На ацмп у меня 8 тестов прошло обычным перебором, а потом начались жуткие тесты
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
11.08.2011, 15:32
Цитата Сообщение от Dani Посмотреть сообщение
1 - 1
2 - 10
3 - 11
4 - 100
5 - 101
6 - 110
7 - 111
8 - 1000
Имеющие в двоичной записи 1 нуль: 10, 110,101
Чисел 4 -ри, а не три!
Вот алгоритм, он не быстр зато отрабатывает правильно
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <windows.h>
#include <stdio.h>
#include <conio.h>
 
void PumpMessages(HWND hWND);
char * num2bin(unsigned long lnum);
 
int main()
{
    HWND hWnd = GetForegroundWindow();
    long N,K,nCount = -1;
    char str[19],*buf;
    do
    {
        printf("Enter numbers:\r\n");
        scanf("%[^\n]",str);
        sscanf(str,"%u %u",&N,&K);
        memset(str,'0',K);
        str[K] = '\0';
        while(0 < N)
        {
            if(strstr(buf = num2bin(N),str))
                nCount++;
            printf("bin %s\r\n",buf);
            N--;
            //Избегаем замерзания программы
            PumpMessages(hWnd);
        }
        printf("%d numbers with square 10^%u\r\n",nCount,K);
    }
    while(toupper(getch()) == 'Y');
    printf("Enter num: ");
    unsigned long lnum;scanf("%u",&lnum);
    printf("%s\r\n",num2bin(lnum));
    getch();
    return 0;
}
 
char * bin = (char *)malloc(sizeof(char));
char * num2bin(unsigned long lnum)
{
    int i = 0;
    do
    {
        bin[i] = '0';
        if(lnum%2)
            bin[i] = '1';
        lnum /= 2;
        if(0 < lnum)
            bin = (char *)realloc(bin,(1 + (i = i + 1))*sizeof(char));
    }
    while(0 < lnum);
    bin[i + 1] = '\0';
    return bin;
}
 
void PumpMessages(HWND hWND)
{
    MSG msg;
    // Handle dialog messages
    while(PeekMessage(&msg, hWND, 0, 0, PM_REMOVE))
        if(!IsDialogMessage(hWND, &msg) && TranslateMessage(&msg))
            DispatchMessage(&msg); 
}
Миниатюры
Задача на динамику или комбинаторику  
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
11.08.2011, 15:35
Цитата Сообщение от diagon Посмотреть сообщение
Перебор никак не пройдет.
Тут комбинаторика...
Перебор как раз медленно и надёжно идёт!
Dani, чтобы не загромождать экран закоментируй в моём коде 25-ую строку
C++
1
 printf("bin %s\r\n",buf);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.08.2011, 15:35
Помогаю со студенческими работами здесь

Задача на динамику
На задачу набросал какой-то код, но все варианты он не перебирает. Можете подать какую-нибудь идею, как сделать задачу? #include...

задача на комбинаторику
.Из полной колоды карт вынули две карты, сколько существует вариантов, вынуть карты разной масти? В ответе должно получиться 780.

Задача на комбинаторику
Условие: (Время: 1 сек. Память: 16 Мб Сложность: 63%) Для заданных натуральных чисел N и K требуется вычислить количество чисел от 1 до...

Задача на комбинаторику
Имеется план местности, разбитой на квадраты, заданный матрицей размера NxN. Каждый квадрат имеет высоту относительно уровня моря, значение...

Задача на комбинаторику
Добрый вечер! Не могу решить задачу. Дано n животных разных видов: a1 белок, а2 собак, ... аn кошек (виды не повторяются). Нужно найти...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru