Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
4 / 4 / 0
Регистрация: 09.02.2011
Сообщений: 26
1

задача на C++

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

Author24 — интернет-сервис помощи студентам
Написать программу, которая получает случайное целое типа 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.12.2011, 17:17
Ответы с готовыми решениями:

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

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

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

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

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

пока число не станет кратным 1000 (то есть 8)
сдвигать по битово в право
потом заменить числа 000 на 0110
и сбросить самый старший единичный бит
и все это скорее всего в цикле, на случай если у нас будет две последовательности 000
0
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
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
18.12.2011, 18:50 5
Что должно быть на выходе при num = 1000000b? 101100110b? Или 100110110b?
0
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
2554 / 1319 / 178
Регистрация: 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
4 / 4 / 0
Регистрация: 09.02.2011
Сообщений: 26
18.12.2011, 19:21  [ТС] 8
если вместо ввода а с клавиатуры, вставлять код генерации случайного числа - не компилируется.
да и сам код довольно странно реагирует на числа.
или он в десятиричной выводит?

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

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

что на счет случайных чисел?
0
2554 / 1319 / 178
Регистрация: 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
4 / 4 / 0
Регистрация: 09.02.2011
Сообщений: 26
18.12.2011, 19:29  [ТС] 10
00 000 1 000 000

я думаю всё-таки это оптимальный вариант
когда всё берется за один раз
0
829 / 352 / 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
4 / 4 / 0
Регистрация: 09.02.2011
Сообщений: 26
18.12.2011, 19:34  [ТС] 12
insolent спасибо, но не пойдет такой код
0
2554 / 1319 / 178
Регистрация: 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
829 / 352 / 64
Регистрация: 30.01.2009
Сообщений: 1,204
18.12.2011, 19:38 14
Sibar, чего не подойдет? Нужно на С?
0
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
2554 / 1319 / 178
Регистрация: 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
4 / 4 / 0
Регистрация: 09.02.2011
Сообщений: 26
18.12.2011, 19:49  [ТС] 17
результат работы программы
194 - случайное число
154 - число которое получилось после замены 000 на 0110
а вот 10011010А это двоичное представление числа 154. но что за стрелочка? о_О
0
2554 / 1319 / 178
Регистрация: 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.12.2011, 19:52
Помогаю со студенческими работами здесь

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

Задача Дам или задача Восьми
помогите найти ошибку в алгоритме. не находит ответ подозреваю ошибку в k, i, j package...

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

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


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru