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 просмотра]