addendum777 发表于 2022-9-20 20:14:49

求助哪里有问题






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-20 21:45:53

本帖最后由 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))                         ;
}

人造人 发表于 2022-9-22 10:04:00

看不懂你写的那个 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;
}

人造人 发表于 2022-9-22 10:06:18

另外,我用另一种思路写了一下这个题目
#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;
}

addendum777 发表于 2022-9-23 08:23:46

人造人 发表于 2022-9-22 10:06
另外,我用另一种思路写了一下这个题目

非常感谢

addendum777 发表于 2022-9-23 08:34:15

人造人 发表于 2022-9-22 10:04
先把注释写一写

修改后的函数好像还是有问题

addendum777 发表于 2022-9-23 08:34:45

addendum777 发表于 2022-9-23 08:34
修改后的函数好像还是有问题

无法运行

人造人 发表于 2022-9-23 09:43:39

addendum777 发表于 2022-9-23 08:34
修改后的函数好像还是有问题

我让你先注释一下你写的那个程序
说一说你的实现思路
因为我看不懂你在做什么
那个程序就只是用软件格式化了一下,又没有修改代码逻辑
看不懂你的代码怎么给你修改?

addendum777 发表于 2022-9-24 09:57:35

人造人 发表于 2022-9-22 10:04
先把注释写一写

我的思路就是先把二进制转换为十进制,然后相加,再把加起来的十进制转为为二进制,然后输出

人造人 发表于 2022-9-24 11:25:07

addendum777 发表于 2022-9-24 09:57
我的思路就是先把二进制转换为十进制,然后相加,再把加起来的十进制转为为二进制,然后输出

注释一下你的代码

人造人 发表于 2022-9-24 11:42:06

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]
查看完整版本: 求助哪里有问题