Форум программистов, компьютерный форум CyberForum.ru

Сложение в двоичной системе счисления - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.72
morphling
 Аватар для morphling
-9 / 19 / 1
Регистрация: 26.06.2010
Сообщений: 181
25.08.2011, 03:43     Сложение в двоичной системе счисления #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
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
//---------------------------------------------------------------------------
 
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
//---------------------------------------------------------------------------
int pow(short n)
    {
      int rez = 1;
      if (n == 0)
         {
           return 1;
         }
      while(n)
        {
         rez*=2;
         n--;
        }
        return rez;
    }
int Dec(char *s)
     {
       int len;
       int dl = 0;
       int rez = 0;
       len = strlen(s);
       while (len)
         {
           len--;
 
           if (s[dl] == '1')
              {
                rez += pow(dl);
              }
 
           ++dl;
         }
       return rez;
     }
 
 
int main()
{
    int a, b;
    char s1[30];
    FILE *f;
    f  = fopen("C:\\input.txt","r");
       fscanf(f, "%d", &a);
       fscanf(f, "%d", &b);
       printf(" %d\n",a);
 
       printf(" %d\n",b);
 
    fclose(f);
       itoa(a, s1, 10);
       a = Dec(s1);
       itoa(b, s1, 10);
       b = Dec(s1);
       itoa(a+b, s1, 2);
    f = fopen("C:\\output.txt","w");
       fprintf(f,"%s\n",s1);
       printf("%s\n",s1);
    fclose(f);
    getch();
    return 0;
}
//---------------------------------------------------------------------------
посмотрите пожалуйста... помогите найти ошибку.......

Не по теме:

Результат по тестам:
1. Неверный ответ
2. Засчитано
3. Засчитано
4. Засчитано
5. Засчитано
6. Неверный ответ
7. Неверный ответ
8. Неверный ответ
9. Неверный ответ
10. Неверный ответ
11. Засчитано
12. Неверный ответ
13. Неверный ответ
14. Неверный ответ
15. Неверный ответ
16. Неверный ответ
17. Неверный ответ
18. Неверный ответ
19. Неверный ответ
20. Неверный ответ



Добавлено через 3 часа 38 минут

Не по теме:


а
у



Добавлено через 16 секунд

Не по теме:


а
у

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Overmind024
99 / 99 / 6
Регистрация: 10.09.2010
Сообщений: 267
25.08.2011, 04:11     Сложение в двоичной системе счисления #2
А задание можно??
-=ЮрА=-
Заблокирован
Автор FAQ
25.08.2011, 14:45     Сложение в двоичной системе счисления #3
Как вариант Си реализация сложения в двоичной системе
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
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#include <math.h>
 
char * num2bin(char * bin, unsigned long lnum);
char * add_bin(char * binA, char * binB, char * binC);
unsigned long bin2num(char * bin);
 
int main()
{
    unsigned long a, b;
    char * binA = (char *)malloc(sizeof(char));
    char * binB = (char *)malloc(sizeof(char));
    char * binC = (char *)malloc(sizeof(char));
    do
    {
        printf("\tEnter numbers:\r\n");
        printf("a = ");scanf("%u",&a);
        printf("b = ");scanf("%u",&b);
        printf("\tNumbers in binary:\r\n");
        printf("a = %s\r\n",binA = num2bin(binA, a));
        printf("b = %s\r\n",binB = num2bin(binB, b));
        printf("\tc = a + b in binary\r\n");
        printf("c = %s\r\n",binC = add_bin(binA, binB, binC));
        printf("c in decimial : %u\r\n",bin2num(binC));
        printf("\rCheck result in decimial\r\n");
        printf("a + b = %u\r\n", a + b); 
        printf("[Y/N] Y - enter new numbers\r\n");
    }
    while(toupper(getch()) == 'Y');
    return 0;
}
 
char * num2bin(char * bin, unsigned long lnum)
{
    int i = 0;
    if(bin != NULL)
    {
        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';
        bin = strrev(bin);
    }
    return &bin[0];
}
 
char * add_bin(char * binA, char * binB, char * binC)
{
    int i,j,n;
    if(
        binA != NULL && 
        binB != NULL && 
        binC != NULL
    )
    {
        n = strlen(binA);
        i = strlen(binB);
        if(i < n)
        {
            binB = (char *)realloc(binB,(n - i + 1)*sizeof(char));
            memcpy((void *)&binB[j = n - i],(void *)&binB[0],i);
            for(i = 0;i < j; i++)
                binB[i] = '0';
            binB[n] = '\0';
        }
        if(n < i)
        {
            binA = (char *)realloc(binA,(n - i + 1)*sizeof(char));
            memcpy((void *)&binA[j = n - i],(void *)&binA[0],i);
            for(i = 0;i < j; i++)
                binA[i] = '0';
            binA[n] = '\0';
        }
        binC = (char *)realloc(binC,(n + 1)*sizeof(char));
        for(i = 0,j = 0; i < n; i++)
        {
            if(binA[i] == '0')
            {
                if(binB[i] == '0')
                    binC[i + j] = '0';
                else
                    binC[i + j] = '1';
            }
            else
            {
                if(binB[i] == '0')
                    binC[i + j] = '1';
                else
                {
                    binC[i + j] = '0';
                    binC = (char *)realloc(binC, (1 + i + (j = j + 1))*sizeof(char));
                    binC[i + j] = '1';
                }
            }
        }
        binC[i + j] = '\0';
    }
    return &binC[0];
}
 
unsigned long bin2num(char * bin)
{
    int i,n;
    unsigned long num = 0;
    if(bin)
    {
        n = strlen(bin);
        for(i = n; 0 < i; i--)
        {
            if(bin[i - 1] == '1')
                num += pow(2,(n - i));
        }
    }
    return num;
}
PS:Программу тестировал мало, если будут баги пиши, но вроди считает норм(проверял XP-ным калькулятором)
Миниатюры
Сложение в двоичной системе счисления  
Digit@ll
Brainsbreaker
 Аватар для Digit@ll
832 / 343 / 27
Регистрация: 01.02.2011
Сообщений: 1,483
26.08.2011, 17:53     Сложение в двоичной системе счисления #4
Баг на 9, должно быть 1001
AvengerAlive
5 / 5 / 0
Регистрация: 30.07.2011
Сообщений: 257
26.08.2011, 20:14     Сложение в двоичной системе счисления #5
Просто складывай. Создавай массив. Знаком с битовыми операциями?
C++
1
2
3
4
5
6
7
8
i=0;
while (c)
{
 if (c&1) mas[i]=1;
 else mas[i]=0;
 i++;
 c>>=1;
}
Теперь полученный массив выводим в обратном порядке. Вот и всё.
-=ЮрА=-
Заблокирован
Автор FAQ
26.08.2011, 21:21     Сложение в двоичной системе счисления #6
Цитата Сообщение от Digit@ll Посмотреть сообщение
Баг на 9, должно быть 1001
- хорошо посмотрю, но на ввод
а = 9 b = 9 выдало
а = 1001
b = 1001
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
26.08.2011, 22:02     Сложение в двоичной системе счисления #7
morphling, может вам пригодится:
programm

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
void Print(char *a, int n)
{
   int i;
   for (i = n - 1; i >= 0 ; i--)
      printf("%d", a[i]);
   printf("\n");
}
 
void ToArray(unsigned long x, char *a, int *n)
{
   int i = 0;
   do
   {
      a[i++] = x & 1;
      x >>= 1;
   }
   while(x);
   *n = i;
}
 
void Sum(char *a, int *alen, char *b, int blen)
{
   char ost, buf;
   int i;
   i = ost = 0;
   while (i < *alen && i < blen)
   {
 
       buf = (a[i] + b[i] + ost) >> 1;
       a[i] = (a[i] + b[i] + ost) & 1;
       ost = buf;
       i++;
   }
   while (i < *alen)
   {
      buf = (a[i] + ost) >> 1;
      a[i] = (a[i] + ost) & 1;
      ost = buf;
      i++;
   }
   while (i < blen)
   {
      buf = (b[i] + ost) >> 1;
      a[i] = (b[i] + ost) & 1;
      ost = buf;
      i++;
   }
   if (ost)
      a[i++] = ost;
   *alen = i;
}
 
int main()
{
   unsigned long x = 123, y = 321;
   int alen = 0, blen = 0;
   char a[100], b[100];
   ToArray(x, a, &alen);
   ToArray(y, b, &blen);
   Sum(a, &alen, b, blen);
   Print(a, alen);
   return 0;
}


Добавлено через 2 минуты
Цитата Сообщение от AvengerAlive Посмотреть сообщение
Просто складывай. Создавай массив. Знаком с битовыми операциями?
C++
1
2
3
4
5
6
7
8
i=0;
while (c)
{
 if (c&1) mas[i]=1;
 else mas[i]=0;
 i++;
 c>>=1;
}
Теперь полученный массив выводим в обратном порядке. Вот и всё.
Можно проще написать (без if)
C++
1
mas[i] = c&1;
И в вашем цикле не учтено что c может быть 0, поэтому цикл do-while нужен
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.08.2011, 01:08     Сложение в двоичной системе счисления
Еще ссылки по теме:

Вычитание в двоичной системе счисления двух чисел C++
Вычитание чисел в двоичной системе счисления C++

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

Или воспользуйтесь поиском по форуму:
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,270
27.08.2011, 01:08     Сложение в двоичной системе счисления #8
morphling, ошибка в функции Dec (определил по возвращаемому значению), кстати, что она делает?
Yandex
Объявления
27.08.2011, 01:08     Сложение в двоичной системе счисления
Ответ Создать тему
Опции темы

Текущее время: 07:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru