Untitled
unknown
plain_text
2 years ago
2.1 kB
7
Indexable
#include<stdio.h>
#include<string.h>
#include <stdlib.h>
// đảo ngược string
char* reverseStr(char *s, int n){
char* str = (char*)malloc((n+1)*sizeof(char));
int i, j = n-1;
for(i = 0; i < n;i++)
{
str[i] = s[j];
j-= 1;
}
str[n] = '\0';
return str;
}
char* addBinary(char* a, char* b) {
int lenA = strlen(a);
int lenB = strlen(b);
//tmp là biến nhớ, count là độ dài của string lớn hơn trong a và b
int i, tmp = 0, count = 0;
//reverse 2 string
a = reverseStr(a,lenA);
b = reverseStr(b,lenB);
//Khai báo con trỏ trỏ đến string kết quả
char* res;
if(lenA > lenB)
{
int k = lenA - lenB;
for(i = 0 ; i < k;i++)
{
b = strcat(b,"0");
}
res = (char*)malloc((lenA+2)*sizeof(char)); // khởi tạo vùng nhớ cho res.
count = lenA;
}
else if(lenB > lenA)
{
int k = lenB - lenA;
for(i = 0 ; i < k;i++)
{
a = strcat(a,"0");
}
res = (char*)malloc((lenB+2)*sizeof(char)); // khởi tạo vùng nhớ cho res.
count = lenB;
}
else{
count = lenA;
res = (char*)malloc((lenB+2)*sizeof(char)); // khởi tạo vùng nhớ cho res.
}
// thực hiện phép cộng
for(i = 0;i<count;i++)
{
if(a[i] == b[i] && a[i] == '1')
{
res[i] = '0';
if(tmp == 1)
{
res[i] = 1;
}
tmp = 1;
}
else if(a[i] == b[i] && a[i] == '0')
{
res[i] = '0';
if(tmp == 1)
{
res[i] = '1';
}
tmp = 0;
}
else if(a[i] == '1' && b[i] == '0' || a[i] == '0' && b[i] == '1')
{
res[i] = '1';
if(tmp == 1){
res[i] = '0';
}
}
}
// nếu biến nhớ vẫn bằng 1 thì vị trí cuối của res thêm '1'.
if(tmp == 1)
{
res[count] = '1';
res[count+1] = '\0';
}
else{
res[count] = '\0';
}
// giải phóng bộ nhớ
free(a);
free(b);
res = reverseStr(res,strlen(res));
return res;
}
int main()
{
char a[100] = "1010";
char b[100] = "1011";
printf("%s", addBinary(a,b));
return 0;
}
Editor is loading...
Leave a Comment