Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 06.06.2010
Сообщений: 3
1

программу, производящую операцию умножения над операндами являющиеся строковыми представлениями чисел в двоичной форме

06.06.2010, 21:03. Показов 1279. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здрасте! Помогите пожалуйста задачу решить, очень надо, а она сложная для меня слишком

Написать программу, производящую операцию умножения над операндами являющимися строковыми представлениями чисел в двоичной форме. При решении не использовать преобразования строкового типа в числовой.
Спасибо!

Добавлено через 1 час 41 минуту
Ну вот, а я думала здесь крутые программисты собрались ( Помогите пожалуйста, очень надо!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.06.2010, 21:03
Ответы с готовыми решениями:

Быстрая работа деления и умножения в двоичной системе с операндами длиной 64 символа каждый
Здравствуйте, требуется написать работу деления и умножения в двоичной системе счисления с...

Написать программу на с++, которая выполняет операцию над матрицей целых чисел
Мне нужно написать программу, которая выполняет операцию над матрицей целых чисел. Матрицу следует...

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

Написать программу, производящую различные операции над матрицами
Добрый вечер, необходимо написать программу, производящую различные операции над матрицами, есть...

7
6048 / 3457 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
06.06.2010, 21:28 2
Цитата Сообщение от mordashka Посмотреть сообщение
я думала здесь крутые программисты собрались
Ага. Двое из лорца одинаковых с лица, которые сделают всю работу.
поработать бесплатно тут намного меньше, чем крутых программистов
Хотелось бы увидеть проявление хоть каких-то усилий в решении задачи от заявителя
0
Padawan
473 / 323 / 30
Регистрация: 30.01.2010
Сообщений: 1,841
06.06.2010, 22:08 3
nio, согласен полностью. Помощь в данном разделе является чисто добровольной и ни к чему не принуждает. В основном здесь все сводится к схеме "горю - сессия", но не смотря на это очень многим здесь помогают. Поэтому успокойтесь и подождите еще.
PS : Я как то сам не очень въезжаю в задачку.
0
0 / 0 / 0
Регистрация: 06.06.2010
Сообщений: 3
07.06.2010, 01:33  [ТС] 4
Хотелось бы увидеть проявление хоть каких-то усилий в решении задачи от заявителя
Я вообще понять не могу, как это решать! И да, горю!!! Сессия!!! Ну правда, очень надо.
0
328 / 312 / 68
Регистрация: 05.11.2009
Сообщений: 712
07.06.2010, 13:09 5
mordashka, а вам какой метод умножения реализовать необходимо?
лично мне известны два:
- умножение начиная с младших разрядов множителя
- умножение начиная со старших разрядов множителя

в приведённом коде реализован первый принцип:
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
using System;
using System.Text;
 
class Bin
{
    StringBuilder binNumber;
 
    public Bin()
    {
        binNumber = new StringBuilder(Convert.ToString(0, 2));
    }
 
    public Bin(int number)
    {
        binNumber = new StringBuilder(Convert.ToString(number, 2));
    }
 
    public static Bin operator +(Bin a, Bin b)
    {
        int before = 0;
        int after = 0;
 
        if (a.binNumber.Length > b.binNumber.Length)
            b.AddZero(a.binNumber.Length - b.binNumber.Length);
        else
            a.AddZero(b.binNumber.Length - a.binNumber.Length);
 
        Bin res = new Bin();
        res.binNumber.Remove(0, res.binNumber.Length);
        int num = 0;
 
        for (int i = b.binNumber.Length - 1; i >= 0; i--)
        {
            //складываем то что есть в буфере сложения со следующими разрядами
            if (after == 1 && (i < b.binNumber.Length - 1))
            {
                before = after;
                after = a.AddBit(b.binNumber[i] - 48, a.binNumber[i] - 48, out num);
 
                if (a.AddBit(before, num, out num) == 1)
                    after = 1;
            }
            else
                after = a.AddBit(b.binNumber[i] - 48, a.binNumber[i] - 48, out num);
 
            res.binNumber.Insert(0, (char)(num + 48));
        }
        if (after == 1)
            res.binNumber.Insert(0, after);
 
        return res;
    }
 
    public static Bin operator +(Bin a, string binNumber)
    {
        int before = 0;
        int after = 0;
 
        StringBuilder tmp = new StringBuilder(binNumber);
 
        if (a.binNumber.Length > binNumber.Length)
        {
            for (int i = 0; i < a.binNumber.Length - binNumber.Length; i++)
                tmp.Insert(0, "0");
            binNumber = tmp.ToString();
        }
        else
            a.AddZero(binNumber.Length - a.binNumber.Length);
 
        Bin res = new Bin();
        res.binNumber.Remove(0, res.binNumber.Length);
        int num = 0;
 
        for (int i = binNumber.Length - 1; i >= 0; i--)
        {
            //складываем то что есть в буфере сложения со следующими разрядами
            if (after == 1 && (i < binNumber.Length - 1))
            {
                before = after;
                after = a.AddBit(binNumber[i] - 48, a.binNumber[i] - 48, out num);
 
                if (a.AddBit(before, num, out num) == 1)
                    after = 1;
            }
            else
                after = a.AddBit(binNumber[i] - 48, a.binNumber[i] - 48, out num);
 
            res.binNumber.Insert(0, (char)(num + 48));
        }
        if (after == 1)
            res.binNumber.Insert(0, after);
        return res;
    }
 
    public static Bin operator *(Bin a, Bin b)
    {
        Bin res = new Bin();
 
        for (int i = b.binNumber.Length - 1; i >= 0; i--)
        {
            int pos = b.binNumber.Length - 1 - i;
 
            if (b.binNumber[i] - 48 == 1)
            {
                StringBuilder tmp = new StringBuilder(a.binNumber.ToString());
                for (int j = 0; j < pos; j++)
                    tmp.Append('0');
                res = res + tmp.ToString();
            }
 
        }
 
        return res;
    }
 
    public static implicit operator int(Bin a)
    {
        int res = Convert.ToInt32(a.binNumber.ToString(), 2);
        return res;
    }
 
    private int AddBit(int first, int second, out int number)
    {
        switch (first & second)
        {
            case 1:
                number = 0;
                return 1;
            case 0:
                if ((first | second) == 1)
                {
                    number = 1;
                    return 0;
                }
                else
                {
                    number = 0;
                    return 0;
                }
        }
        number = 0;
        return 0;
    }
 
    private void AddZero(int count)
    {
        for (int i = 0; i < count; i++)
            this.binNumber.Insert(0, "0");
    }
 
    public override string ToString()
    {
        return this.binNumber.ToString();
    }
}
 
class Demo
{
    public static void Main()
    {
        Bin a = new Bin(12);
        Bin b = new Bin(2);
        Bin c = a + b;
 
        Console.WriteLine(c.ToString());
        Console.WriteLine(c);
 
        c = a * b;
 
        Console.WriteLine(c.ToString());
        Console.WriteLine(c);
    }
}
1
I ♥ C#
470 / 261 / 25
Регистрация: 07.05.2010
Сообщений: 567
07.06.2010, 13:28 6
Мой вариант покороче будет
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
using System;
 
class TMain
{
    static void Main()
    {
        Console.Write("Введите первое двоичное число: ");
        string s1 = Console.ReadLine();
        Console.Write("Введите второе двоичное число: ");
        string s2 = Console.ReadLine();
        while (s1.Length != s2.Length)
            if (s1.Length > s2.Length)
                s2 = "0" + s2;
            else
                s1 = "0" + s1;
        int i, j;
        string[] ForSum = new string[s1.Length];
        for (i = s1.Length - 1; i >= 0; i--)
            if (s2[i] == '1')
                ForSum[s1.Length - i - 1] = s1;
            else
                ForSum[s1.Length - i - 1] = "0";
        for (i = 1; i < s1.Length; i++)
            for (j = 1; j <= i; j++)
                ForSum[i] += "0";
        for (i = 0; i < s1.Length; i++)
            while (ForSum[i].Length != 2 * s1.Length - 1)
                ForSum[i] = "0" + ForSum[i];
        int Counter = 0;
        string Result = "";
        for (i = ForSum[0].Length - 1; i >= 0; i--)
        {
            for (j = 0; j < s1.Length; j++)
                if (ForSum[j][i] == '1')
                    Counter++;
            Result = (Counter % 2).ToString() + Result;
            if(Counter > 0) Counter /= 2; 
        }
        if(Counter > 0) Result = "1" + Result;
        Console.WriteLine("Произведение чисел = " + Result);
        Console.ReadKey();
    }
}
1
0 / 0 / 0
Регистрация: 06.06.2010
Сообщений: 3
07.06.2010, 15:19  [ТС] 7
Delog, а можешь краткие комментарии к каждому циклу написать, что они делают?
0
I ♥ C#
470 / 261 / 25
Регистрация: 07.05.2010
Сообщений: 567
07.06.2010, 15:42 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
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
65
66
67
68
using System;
 
class TMain
{
    static void Main()
    {
        Console.Write("Введите первое двоичное число: ");
        string s1 = Console.ReadLine(); //Допустим ввели число "110"
        Console.Write("Введите второе двоичное число: ");
        string s2 = Console.ReadLine(); //Допустим ввели число "11"
        
        /* Выравниваем длину строк добавляя нули слева самой короткой.
        строка s2, в нашем случае, станет "011" */
        while (s1.Length != s2.Length)
            if (s1.Length > s2.Length)
                s2 = "0" + s2;
            else
                s1 = "0" + s1;
 
        int i, j;
        string[] ForSum = new string[s1.Length];
        
        /* В массив ForSum сохраняем результаты умножения на один из разрядов.
        В нашем случае это будет:
        ForSum[0] = "110"
        ForSum[1] = "110"
        ForSum[2] =   "0" */
        for (i = s1.Length - 1; i >= 0; i--)
            if (s2[i] == '1')
                ForSum[s1.Length - i - 1] = s1;
            else
                ForSum[s1.Length - i - 1] = "0";
        
        /* Теперь сдвинем влево добавляя нули справа,
        чтобы понять зачем, вспомните умножение столбиком:
        ForSum[0] =  "110"
        ForSum[1] = "1100"
        ForSum[2] =  "000" */
        for (i = 1; i < s1.Length; i++)
            for (j = 1; j <= i; j++)
                ForSum[i] += "0";
        
        /* Теперь добавим нули слева, чтобы все строки стали одинаковой длины:
        ForSum[0] = "00110"
        ForSum[1] = "01100"
        ForSum[2] = "00000" */
        for (i = 0; i < s1.Length; i++)
            while (ForSum[i].Length != 2 * s1.Length - 1)
                ForSum[i] = "0" + ForSum[i];
 
        int Counter = 0;
        string Result = "";
 
        /* Ну а здесь выполняется сложение всех строк из ForSum */
        for (i = ForSum[0].Length - 1; i >= 0; i--)
        {
            for (j = 0; j < s1.Length; j++)
                if (ForSum[j][i] == '1')
                    Counter++;
            Result = (Counter % 2).ToString() + Result;
            if(Counter > 0) Counter /= 2; 
        }
 
        if(Counter > 0) Result = "1" + Result;
        Console.WriteLine("Произведение чисел = " + Result);
        Console.ReadKey();
    }
}
1
07.06.2010, 15:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.06.2010, 15:42
Помогаю со студенческими работами здесь

Ввести два числа А и С. - Найти произведение этих чисел, используя только операцию сложения. - Вычислить АС, используя только операцию умножения
Ввести два числа А и С. - Найти произведение этих чисел, используя только операцию сложения....

Найти произведение чисел, не используя операцию умножения
напишите программу, которая получает два целых числа и находит их произведение, не используя...

Вычислить произведение чисел, не используя операцию умножения
1.Дано натуральные числа m и n.Вычислите их произведение не используя операцию умножения. 2.Дано...

Смоделировать операцию умножения двух целых чисел
Смоделировать операцию умножения двух целых чисел длиной до 30 десятичных цифр каждое. Результат...

Смоделировать операцию умножения двух целых чисел
Смоделировать операцию умножения двух целых чисел длиной до 30 десятичных цифр каждое. Результат...

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


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

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