求助哪里有问题
void reverse (char *s)
{
int lens=strlen(s);
int i,t;
for(i=0;i<(lens/2);i++)
{
t=s;
s=s;
s=t;
}
}
char * addBinary(char * a, char * b){
int a1=1,b1=1,sum1=0,sum2=0,sum,d=2;
int i,j;
int longth1,longth2;
longth1=strlen(a);
longth2=strlen(b);
char *c=(char *)malloc(sizeof(char)*(longth1+longth2));
for(j=0;j<longth1;j++)
{ a1=a;
for(i=longth1-1;i>0;i--)
{
a1=2*a1;
}
sum1+=a1;
}
for(j=0;j<longth2;j++)
{
b1=b;
for(i=longth2;i>0;i--)
{
b1=2*b1;
}
sum2+=b1;
}
sum=sum1+sum2;
for(i=0;d>=2;i++)
{
c=sum%2+'\0';
d=sum/2;
}
reverse(c);
return c;
} 本帖最后由 jackz007 于 2022-9-22 14:44 编辑
#include <stdio.h>
#include <stdlib.h>
char * add(char a[] , char b[])
{
char s = {0} , x1 , x2 , * p ;
int c , d , e , i , n ;
for(c = 0 ; a ; c ++) ;// c = a 的长度
for(d = 0 ; b ; d ++) ;// d = b 的长度
for(i = e = 0 , n = (c < d) ? d : c ; i < n ; i ++) {// 加法计算按长字符串长度安排循环
s = e ;
x1 = (i < c) ? a : '0' ;// 短字符串的不足部分一律按字符 '0' 充数
x2 = (i < d) ? b : '0' ;
s = s + x1 - '0' + x2 - '0' ;
e = s / 2 ;// 2 就是二进制的二
s %= 2 ;// 2 就是二进制的二
}
if(e) s = e ;
p = (char *) malloc(n + 1) ;
for(i = 0 ; i < n ; i ++) p = s + '0' ;
p = '\0' ;
return p ;
}
int main(void)
{
char a = {"11"} , b = {"1"} ;
printf("%s\n" , add(a , b)) ;
} 看不懂你写的那个 addBinary 函数
你先注释一下这个函数,说一说你的实现思路
还有,把代码写完整,申请了内存要释放
另外还发现了两个问题
1. longth1, longth2
你是想写 length1, length2 吗?
longth 是什么?
2. char *c = (char *)malloc(sizeof(char) * (longth1 + longth2));
两个二进制串相加的结果字符串有多长?是两个二进制串的长度和吗?
1011 + 0110 = 10001
按你的思路就是用 8 个字符空间来保存这 5 个字符
另外,strlen 返回的是字符串的长度,是不包含 '\0' 的,两个字符串加起来的长度是不是还得加一个 '\0' 的空间?
char *c = (char *)malloc(sizeof(char) * (longth1 + longth2 + 1));
还有,sizeof(char) 是多少?
sizeof(char) 是 1
你需要乘这个 1 吗?
还有,malloc的返回值是什么类型的?
是 void * 对吧?
你需要把 void * 转成 char * 吗?
这可是C语言
所以
char *c = malloc(longth1 + longth2 + 1);
另外就是上面说的,你应该把两个二进制串的长度加起来吗?
先把注释写一写
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void reverse(char *s) {
int lens = strlen(s);
int i, t;
for(i = 0; i < (lens / 2); i++) {
t = s;
s = s;
s = t;
}
}
char *addBinary(char *a, char *b) {
int a1 = 1, b1 = 1, sum1 = 0, sum2 = 0, sum, d = 2;
int i, j;
int longth1, longth2;
longth1 = strlen(a);
longth2 = strlen(b);
char *c = (char *)malloc(sizeof(char) * (longth1 + longth2));
for(j = 0; j < longth1; j++) {
a1 = a;
for(i = longth1 - 1; i > 0; i--) {
a1 = 2 * a1;
}
sum1 += a1;
}
for(j = 0; j < longth2; j++) {
b1 = b;
for(i = longth2; i > 0; i--) {
b1 = 2 * b1;
}
sum2 += b1;
}
sum = sum1 + sum2;
for(i = 0; d >= 2; i++) {
c = sum % 2 + '\0';
d = sum / 2;
}
reverse(c);
return c;
}
int main(void) {
return 0;
}
另外,我用另一种思路写了一下这个题目
#include <stdio.h>
#include <string.h>
void and_gate(char a, char b, char *c) {
*c = a == '1' && b == '1' ? '1' : '0';
}
void or_gate(char a, char b, char *c) {
*c = a == '0' && b == '0' ? '0' : '1';
}
#if 0
void xor_gate(char a, char b, char *c) {
*c = a != b ? '1' : '0';
}
#else
void not_gate(char a, char *b) {
*b = a == '1' ? '0' : '1';
}
void xor_gate(char a, char b, char *c) {
char na, nb;
char r0, r1;
not_gate(a, &na);
not_gate(b, &nb);
and_gate(a, nb, &r0);
and_gate(b, na, &r1);
or_gate(r0, r1, c);
}
#endif
void half_adder_1bit(char a, char b, char *s, char *c) {
xor_gate(a, b, s);
and_gate(a, b, c);
}
void full_adder_1bit(char a, char b, char ci, char *s, char *co) {
char temp_s, temp_c;
half_adder_1bit(a, b, &temp_s, &temp_c);
half_adder_1bit(temp_s, ci, s, &temp_c);
or_gate(temp_c, temp_c, co);
}
void full_adder_2bit(const char *a, const char *b, char ci, char *s, char *co) {
char temp_c;
full_adder_1bit(a, b, ci, &s, &temp_c);
full_adder_1bit(a, b, temp_c, &s, co);
}
void full_adder_4bit(const char *a, const char *b, char ci, char *s, char *co) {
char temp_c;
full_adder_2bit(&a, &b, ci, &s, &temp_c);
full_adder_2bit(&a, &b, temp_c, &s, co);
}
void full_adder_8bit(const char *a, const char *b, char ci, char *s, char *co) {
char temp_c;
full_adder_4bit(&a, &b, ci, &s, &temp_c);
full_adder_4bit(&a, &b, temp_c, &s, co);
}
void full_adder_16bit(const char *a, const char *b, char ci, char *s, char *co) {
char temp_c;
full_adder_8bit(&a, &b, ci, &s, &temp_c);
full_adder_8bit(&a, &b, temp_c, &s, co);
}
void full_adder_32bit(const char *a, const char *b, char ci, char *s, char *co) {
char temp_c;
full_adder_16bit(&a, &b, ci, &s, &temp_c);
full_adder_16bit(&a, &b, temp_c, &s, co);
}
void binary(char dest, const char *src) {
memset(dest, '0', 32);
size_t l = strlen(src);
strncpy(dest + (32 - l), src, l);
}
void format(char *dest, const char src) {
const char *p = NULL;
for(size_t i = 0; i < 32; ++i) {
if(src == '1') {p = &src; break;}
}
if(!p) p = src + 31;
while(p != src + 32) *dest++ = *p++;
*dest = '\0';
}
int main() {
char a;
char b;
char s;
char ci = '0', co;
char buff;
scanf("%32s", buff); binary(a, buff);
scanf("%32s", buff); binary(b, buff);
full_adder_32bit(a, b, ci, s, &co);
format(buff, s); puts(buff);
return 0;
}
人造人 发表于 2022-9-22 10:06
另外,我用另一种思路写了一下这个题目
非常感谢 人造人 发表于 2022-9-22 10:04
先把注释写一写
修改后的函数好像还是有问题 addendum777 发表于 2022-9-23 08:34
修改后的函数好像还是有问题
无法运行 addendum777 发表于 2022-9-23 08:34
修改后的函数好像还是有问题
我让你先注释一下你写的那个程序
说一说你的实现思路
因为我看不懂你在做什么
那个程序就只是用软件格式化了一下,又没有修改代码逻辑
看不懂你的代码怎么给你修改?
人造人 发表于 2022-9-22 10:04
先把注释写一写
我的思路就是先把二进制转换为十进制,然后相加,再把加起来的十进制转为为二进制,然后输出 addendum777 发表于 2022-9-24 09:57
我的思路就是先把二进制转换为十进制,然后相加,再把加起来的十进制转为为二进制,然后输出
注释一下你的代码
addendum777 发表于 2022-9-24 09:57
我的思路就是先把二进制转换为十进制,然后相加,再把加起来的十进制转为为二进制,然后输出
算了,我按我对你代码的理解,给你改了
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void reverse(char *s) {
int lens = strlen(s);
int i, t;
for(i = 0; i < (lens / 2); i++) {
t = s;
s = s;
s = t;
}
}
char *addBinary(char *a, char *b) {
int sum1 = 0, sum2 = 0, sum;
int j;
int length1, length2;
length1 = strlen(a);
length2 = strlen(b);
/*
for(j = 0; j < length1; j++) {
a1 = a;
for(i = length1 - 1; i > 0; i--) {
a1 = 2 * a1;
}
sum1 += a1;
}
*/
for(j = 0; j < length1; j++) {
sum1 *= 2;
sum1 += a - '0';
}
/*
for(j = 0; j < longth2; j++) {
b1 = b;
for(i = longth2; i > 0; i--) {
b1 = 2 * b1;
}
sum2 += b1;
}
*/
for(j = 0; j < length2; j++) {
sum2 *= 2;
sum2 += b - '0';
}
sum = sum1 + sum2;
char *c = malloc((length1 > length2 ? length1 : length2) + 2);
/*
for(i = 0; d >= 2; i++) {
c = sum % 2 + '\0';
d = sum / 2;
}
*/
char *p = c;
do {
*p++ = (sum % 2) + '0';
sum /= 2;
} while(sum);
*p = '\0';
reverse(c);
return c;
}
int main(void) {
char a, b;
scanf("%32s", a);
scanf("%32s", b);
char *c = addBinary(a, b);
puts(c);
free(c);
return 0;
}
页:
[1]