БлогNot. C++: строка из нулей заданной длины и сложение строк, содержащих двоичные числа

C++: строка из нулей заданной длины и сложение строк, содержащих двоичные числа

(ответ на вопрос)... причём, имеется в виду символ '0' с кодом 48, а не нуль-терминатор '\0' с кодом 0. Такое может понадобиться, например, при дополнении числа слева лидирующими нулями до нужного числа разрядов.

Если помнить про форматные спецификаторы "*" и не применять "самописных" функций, то я бы сделал так:

int fill_len = 10; //Нужное количество нулей
char *filler = new char [fill_len+1];
sprintf (filler,"%0*d",fill_len,0);

Можно рискнуть попробовать и

char string[128];
sprintf (string,"%010s","0");

но я не уверен, что во всех компиляторах будет адекватно воспринят модификатор шаблона "0" (лидирующие нули) по отношению к шаблону %s (строка).

Потом остаётся, при необходимости, "прицепить" заполнитель слева от нужной строки. В примере ниже менее длинная из двух строк, являющихся записью двоичных чисел, дополняется слева нулями так, чтобы длина строк стала одинаковой. После этого двоичные числа складываются, а результат показывается в двоичном и десятичном видах.

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define max(a,b) ((a>b)?(a):(b))
#define min(a,b) ((a<b)?(a):(b))
 
int str2int(char* str) {
  int rezult=0;
  while(*str)
      rezult=(rezult<<1)+(*str++-'0');
  return rezult;
}
 
int main() {
 char n1[33],n2[33],sum[33];
 strcpy (n1,"110011");
 strcpy (n2,"10001100"); //или ввести 2 строки из символов '0' и '1'
 if (strlen(n1)!=strlen(n2)) {
  int fill_len = max(strlen(n1),strlen(n2))-min(strlen(n1),strlen(n2));
  char *filler = new char [max(strlen(n1),strlen(n2))+fill_len+1];
  sprintf (filler,"%0*d",fill_len,0);
  if (strlen(n1)<strlen(n2)) strcpy(n1,strcat(filler,n1));
  else strcpy(n2,strcat(filler,n2));
  delete filler;
 }
 printf("%032s\n+\n%032s\n=\n%032s\n"
    ,n1
    ,n2
    ,itoa(str2int(n1)+str2int(n2),sum,2)
    );
 printf("%32i\n+\n%32i\n=\n%32i\n"
    ,str2int(n1)
    ,str2int(n2)
    ,str2int(n1)+str2int(n2)
    );
 fflush (stdin);
 getchar();
 return 0;
}

Здесь учитывается, что strcat не выделит память, поэтому столько памяти выделяется под filler.

Вывод этой программы:

                        00110011
+
                        10001100
=
                        10111111
                              51
+
                             140
=
                             191

05.10.2014, 16:09 [11373 просмотра]


теги: числа c++ памятка textprocessing

показать комментарии (1)