Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
Sibar
4 / 4 / 0
Регистрация: 09.02.2011
Сообщений: 26
1

задача на C++

18.12.2011, 17:17. Просмотров 1008. Ответов 17
Метки нет (Все метки)

Написать программу, которая получает случайное целое типа int, выводит его двоичное представление на экран. Если в числе встречается последовательность битов 000, программа заменяет её на 0110 (лишние разряды сдвигает влево)
Писать всю программу не обязательно, нужно хотя бы приблизительное направление в котором работать.


Заранее спасибо.

Добавлено через 44 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream.h>
#include <stdlib.h>
#include <time.h>
int main()
{
    srand((unsigned)time(NULL));
    int k=256;
    int x = rand()%k-1; 
    cout<<x<< " "; //âûâîäèì
     
    for(int i = sizeof(int)*2 - 1; i >= 0; i--)
      cout <<((x >> i) & 1) <<' ';
    
return 0;
}
вывод в двоичной форме...
с остальным запара...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.12.2011, 17:17
Ответы с готовыми решениями:

Задача: В некотором государстве ввели компьютерный паспорт гражданина.(задача)
Доброго времени суток,форумчане. Хотелось бы попросить помощи в решении одной...

Задача на k-тую цифру последовательности, задача на схему Горнера.
Ну, собственно опять прошу помощи... Задача 1: Определить k-тую цифру...

Задача на перебор вариантов. Задача Л.Эйлера. Про чиновника
Задача Л.Эйлера. Некий чиновник купил лошадей и быков на сумму 1770 талеров. За...

Первая смешанная задача для волнового уравнения на отрезке (задача о колебаниях ограниченной струны) методом Фурье
Решить первую смешанную задачу для волнового уравнения на отрезке (задача о...

Задача о размещении весов по ящикам (задача о рюкзаках)
Есть упорядоченный по невозрастанию набор весов предметов w1..wn, которые...

17
Dima_c8
4 / 4 / 2
Регистрация: 17.12.2011
Сообщений: 148
18.12.2011, 17:33 2
Я думаю что здесь нужно использовать инструкцыю "if"или "switch" но вполне возможно что я ошыбаюсь 50на50
0
Sibar
4 / 4 / 0
Регистрация: 09.02.2011
Сообщений: 26
18.12.2011, 17:37  [ТС] 3
я больше к while склоняюсь

пока число не станет кратным 1000 (то есть 8)
сдвигать по битово в право
потом заменить числа 000 на 0110
и сбросить самый старший единичный бит
и все это скорее всего в цикле, на случай если у нас будет две последовательности 000
0
Sibar
4 / 4 / 0
Регистрация: 09.02.2011
Сообщений: 26
18.12.2011, 18:15  [ТС] 4
циклический сдвиг вправо

C++
1
2
3
4
5
6
7
int shl(int a, int s) 
  {
     if (a>>7==0)
        return ((a<<s) | (a>>7-s)) & (~(1<<7));
     else
       return ((a<<s) | (a>>7-s)) | (1<<7);
  }
не хочет правда компилироваться
0
soon
2546 / 1311 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
18.12.2011, 18:50 5
Что должно быть на выходе при num = 1000000b? 101100110b? Или 100110110b?
0
Sibar
4 / 4 / 0
Регистрация: 09.02.2011
Сообщений: 26
18.12.2011, 19:03  [ТС] 6
она должна искать нули слева столько раз пока все последовательности 000 не исчезнут
то есть:
1 000 000 0 -> 1 0110 000 0 ->0110 000 0-> 0110 0110 0-> 11001100
число генерируются случайно в диапазоне от 0 до 255. (то есть 8 бит)
0
soon
2546 / 1311 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
18.12.2011, 19:16 7
Вот на 2-й случай
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
#include <stdio.h>
 
int func(int num)
{
    int out = 0;
    int order = 0;
    while(num)
    {
        if((num & 0x7) == 0)
        {
            num <<= 1;
            num |= 0x6;
        }
        out |= ((num & 1) << order);
        num >>= 1;
        ++order;
    }
    return out;
}
 
int main(void)
{
    int a;
    scanf("%d", &a);
    printf("%d", func(a));
    return 0;
}
Добавлено через 13 минут
А почему не сначала ищем нули?
1
Sibar
4 / 4 / 0
Регистрация: 09.02.2011
Сообщений: 26
18.12.2011, 19:21  [ТС] 8
если вместо ввода а с клавиатуры, вставлять код генерации случайного числа - не компилируется.
да и сам код довольно странно реагирует на числа.
или он в десятиричной выводит?

А почему не сначала ищем нули?
в условиях нет на счет этого ничего

сообразил с кодом. благодарю!

что на счет случайных чисел?
0
soon
2546 / 1311 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
18.12.2011, 19:25 9
Имхо, задание составлено некорректно. Не указано, с какой стороны искать нули. Не сказано, как искать нули. Вот как минимум 4 случая
0000 0100 0000
0000 1000 0110
0001 0011 0110

0000 0100 0000
0000 1000 0110
0001 0110 0110

0000 0100 0000
0000 1011 0000
0001 0110 1100

0000 0100 0000
0000 1011 0000
0001 0110 0110
0
Sibar
4 / 4 / 0
Регистрация: 09.02.2011
Сообщений: 26
18.12.2011, 19:29  [ТС] 10
00 000 1 000 000

я думаю всё-таки это оптимальный вариант
когда всё берется за один раз
0
insolent
827 / 345 / 64
Регистрация: 30.01.2009
Сообщений: 1,204
18.12.2011, 19:34 11
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
#include <iostream>
#include <time.h>
#include <stdlib.h>
#include <string>
 
int main( int argc, char *argv[] ) 
{
    int k = 256, x;
 
    std::string str, 
        str2 = "000", 
        str3 = "0110";
    std::string::size_type pos = 0;
 
    srand((unsigned)time(NULL));
 
    x = rand()%k-1; 
    std::cout << x << std::endl;
 
    char buf[2] = { 0 };
    for(int i = sizeof(int)*2 - 1; i >= 0; i--)
    {
        itoa(((x >> i) & 1), buf, 10);
        str.append(buf);
    }
 
    std::cout << std::endl << str << std::endl;
 
    pos = str.find(str2);
    while ( pos != std::string::npos )
    {
        str.erase(pos, str2.size());
        str.insert(pos, str3);
        str.erase(0, 1);
        pos = str.find(str2);
    }
    std::cout << str << std::endl;
 
    return 0;
}
1
Sibar
4 / 4 / 0
Регистрация: 09.02.2011
Сообщений: 26
18.12.2011, 19:34  [ТС] 12
insolent спасибо, но не пойдет такой код
0
soon
2546 / 1311 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
18.12.2011, 19:36 13
Ну и мы получим 102, или 0110 0110, если отбросить биты больше 8-го
Прототип примерно такой.
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 <stdio.h>
 
int func(int num)
{
    int out = 0;
    int order = 0;
    while(order < 8)
    {
        if((num & 0x7) == 0)
        {
            /*printf("find 3 zero out = %d num = %d order = %d\n", out, num, order);*/
            out |= (0x6 << order);
            order += 4;
            num >>= 3;
            /*printf("end out = %d num = %d order = %d\n", out, num, order);*/
        }
        else
        {
            /*printf("out = %d num = %d order = %d\n", out, num, order);*/
            out |= ((num & 1) << order);
            num >>= 1;
            ++order;
            /*printf("end out = %d num = %d order = %d\n", out, num, order);*/
        }
    }
    return out;
}
 
int main(void)
{
    int a;
    scanf("%d", &a);
    printf("%d", func(a));
    return 0;
}
0
insolent
827 / 345 / 64
Регистрация: 30.01.2009
Сообщений: 1,204
18.12.2011, 19:38 14
Sibar, чего не подойдет? Нужно на С?
0
Sibar
4 / 4 / 0
Регистрация: 09.02.2011
Сообщений: 26
18.12.2011, 19:41  [ТС] 15
int main(void)
{
int a;
scanf("%d", &a);
printf("%d", func(a));
return 0;
}
Все прекрасно работает, но надо чтобы число случайным образом генерировалось. И нужно отобразить в двоичной системе.

как то так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream.h>
#include <stdlib.h>
#include <time.h>
int main()
{
        srand((unsigned)time(NULL));
        int k=256;
        int x = rand()%k-1; 
        cout<<x<< " "; //выводим
     
    for(int i = sizeof(int)*2 - 1; i >= 0; i--)
      cout <<((x >> i) & 1) <<' ';
    scanf("%d", &x);
    printf("%d", func(x));
return 0;
}
0
soon
2546 / 1311 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
18.12.2011, 19:47 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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
int func(int num)
{
    int out = 0;
    int order = 0;
    while(order < 8)
    {
        if((num & 0x7) == 0)
        {
            /*printf("find 3 zero out = %d num = %d order = %d\n", out, num, order);*/
            out |= (0x6 << order);
            order += 4;
            num >>= 3;
            /*printf("end out = %d num = %d order = %d\n", out, num, order);*/
        }
        else
        {
            /*printf("out = %d num = %d order = %d\n", out, num, order);*/
            out |= ((num & 1) << order);
            num >>= 1;
            ++order;
            /*printf("end out = %d num = %d order = %d\n", out, num, order);*/
        }
    }
    out &= 255;
    return out;
}
 
void printBin(int num)
{
    char str[8];
    int i;
    for(i = 0; i < 8; ++i, num >>= 1)
        str[7 - i] = '0' + (num & 1);
    printf("%s\n", str);
}
 
int main(void)
{
    srand(time(NULL));
    int a = rand() % 256;
    int b = func(a);
    printf("%d %d\n",a, b);
    printBin(b);
    return 0;
}
1
Sibar
4 / 4 / 0
Регистрация: 09.02.2011
Сообщений: 26
18.12.2011, 19:49  [ТС] 17
результат работы программы
194 - случайное число
154 - число которое получилось после замены 000 на 0110
а вот 10011010А это двоичное представление числа 154. но что за стрелочка? о_О
0
soon
2546 / 1311 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
18.12.2011, 19:52 18
Код
soon@bt:~/Desktop$ ./main 
194 154
10011010
soon@bt:~/Desktop$
Там еще откуда-то буква А взялась.
0
18.12.2011, 19:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.12.2011, 19:52

Задача о размене -задача динамического программирования?
Является ли задача о размене суммы задачей динамического программирования? Мне...

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

Задача на файл и задача на создание очереди
1 Дан символьный файл, содержащий, по крайней мере, один символ пробела....


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

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