鱼C论坛

 找回密码
 立即注册
查看: 2395|回复: 10

[已解决]求助哪里有问题

[复制链接]
发表于 2022-9-20 20:14:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x





void reverse (char *s)
{
    int lens=strlen(s);
    int i,t;
    for(i=0;i<(lens/2);i++)
    {
        t=s[i];
        s[i]=s[lens-1-i];
        s[lens-1-i]=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[i];
        for(i=longth1-1;i>0;i--)
    {   
            a1=2*a1;
    }
        sum1+=a1;
    }
    for(j=0;j<longth2;j++)
    {
        b1=b[i];
        for(i=longth2;i>0;i--)
        {
            b1=2*b1;
        }
            sum2+=b1;
    }      
            sum=sum1+sum2;
    for(i=0;d>=2;i++)
    {
        c[i]=sum%2+'\0';
        d=sum/2;
    }
    reverse(c);
    return c;
}
最佳答案
2022-9-22 10:04:00
  1. 看不懂你写的那个 addBinary 函数
  2. 你先注释一下这个函数,说一说你的实现思路
  3. 还有,把代码写完整,申请了内存要释放
  4. 另外还发现了两个问题
  5. 1. longth1, longth2
  6. 你是想写 length1, length2 吗?
  7. longth 是什么?
  8. 2.     char *c = (char *)malloc(sizeof(char) * (longth1 + longth2));
  9. 两个二进制串相加的结果字符串有多长?是两个二进制串的长度和吗?
  10. 1011 + 0110 = 10001
  11. 按你的思路就是用 8 个字符空间来保存这 5 个字符

  12. 另外,strlen 返回的是字符串的长度,是不包含 '\0' 的,两个字符串加起来的长度是不是还得加一个 '\0' 的空间?

  13.     char *c = (char *)malloc(sizeof(char) * (longth1 + longth2 + 1));

  14. 还有,sizeof(char) 是多少?
  15. sizeof(char) 是 1
  16. 你需要乘这个 1 吗?

  17. 还有,malloc的返回值是什么类型的?
  18. 是 void * 对吧?
  19. 你需要把 void * 转成 char * 吗?
  20. 这可是C语言

  21. 所以
  22. char *c = malloc(longth1 + longth2 + 1);

  23. 另外就是上面说的,你应该把两个二进制串的长度加起来吗?
复制代码


先把注释写一写

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. void reverse(char *s) {
  5.     int lens = strlen(s);
  6.     int i, t;
  7.     for(i = 0; i < (lens / 2); i++) {
  8.         t = s[i];
  9.         s[i] = s[lens - 1 - i];
  10.         s[lens - 1 - i] = t;
  11.     }
  12. }

  13. char *addBinary(char *a, char *b) {
  14.     int a1 = 1, b1 = 1, sum1 = 0, sum2 = 0, sum, d = 2;
  15.     int i, j;
  16.     int longth1, longth2;
  17.     longth1 = strlen(a);
  18.     longth2 = strlen(b);
  19.     char *c = (char *)malloc(sizeof(char) * (longth1 + longth2));
  20.     for(j = 0; j < longth1; j++) {
  21.         a1 = a[i];
  22.         for(i = longth1 - 1; i > 0; i--) {
  23.             a1 = 2 * a1;
  24.         }
  25.         sum1 += a1;
  26.     }
  27.     for(j = 0; j < longth2; j++) {
  28.         b1 = b[i];
  29.         for(i = longth2; i > 0; i--) {
  30.             b1 = 2 * b1;
  31.         }
  32.         sum2 += b1;
  33.     }
  34.     sum = sum1 + sum2;
  35.     for(i = 0; d >= 2; i++) {
  36.         c[i] = sum % 2 + '\0';
  37.         d = sum / 2;
  38.     }
  39.     reverse(c);
  40.     return c;
  41. }

  42. int main(void) {
  43.     return 0;
  44. }
复制代码

11.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-20 21:45:53 | 显示全部楼层
本帖最后由 jackz007 于 2022-9-22 14:44 编辑
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. char * add(char a[] , char b[])
  4. {
  5.         char s[4096] = {0} , x1 , x2 , * p                  ;
  6.         int c , d , e , i , n                               ;
  7.         for(c = 0 ; a[c] ; c ++)                            ;  // c = a 的长度
  8.         for(d = 0 ; b[d] ; d ++)                            ;  // d = b 的长度
  9.         for(i = e = 0 , n = (c < d) ? d : c ; i < n ; i ++) {  // 加法计算按长字符串长度安排循环
  10.                 s[i] = e                                    ;
  11.                 x1 = (i < c) ? a[c - i - 1] : '0'           ;  // 短字符串的不足部分一律按字符 '0' 充数
  12.                 x2 = (i < d) ? b[d - i - 1] : '0'           ;
  13.                 s[i] = s[i] + x1 - '0' + x2 - '0'           ;
  14.                 e = s[i] / 2                                ;  // 2 就是二进制的二
  15.                 s[i] %= 2                                   ;  // 2 就是二进制的二
  16.         }
  17.         if(e) s[n ++] = e                                   ;
  18.         p = (char *) malloc(n + 1)                          ;
  19.         for(i = 0 ; i < n ; i ++) p[i] = s[n - i - 1] + '0' ;
  20.         p[n] = '\0'                                         ;
  21.         return p                                            ;
  22. }

  23. int main(void)
  24. {
  25.         char a[3] = {"11"} , b[2] = {"1"}                   ;
  26.         printf("%s\n" , add(a , b))                         ;
  27. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-22 10:04:00 | 显示全部楼层    本楼为最佳答案   
  1. 看不懂你写的那个 addBinary 函数
  2. 你先注释一下这个函数,说一说你的实现思路
  3. 还有,把代码写完整,申请了内存要释放
  4. 另外还发现了两个问题
  5. 1. longth1, longth2
  6. 你是想写 length1, length2 吗?
  7. longth 是什么?
  8. 2.     char *c = (char *)malloc(sizeof(char) * (longth1 + longth2));
  9. 两个二进制串相加的结果字符串有多长?是两个二进制串的长度和吗?
  10. 1011 + 0110 = 10001
  11. 按你的思路就是用 8 个字符空间来保存这 5 个字符

  12. 另外,strlen 返回的是字符串的长度,是不包含 '\0' 的,两个字符串加起来的长度是不是还得加一个 '\0' 的空间?

  13.     char *c = (char *)malloc(sizeof(char) * (longth1 + longth2 + 1));

  14. 还有,sizeof(char) 是多少?
  15. sizeof(char) 是 1
  16. 你需要乘这个 1 吗?

  17. 还有,malloc的返回值是什么类型的?
  18. 是 void * 对吧?
  19. 你需要把 void * 转成 char * 吗?
  20. 这可是C语言

  21. 所以
  22. char *c = malloc(longth1 + longth2 + 1);

  23. 另外就是上面说的,你应该把两个二进制串的长度加起来吗?
复制代码


先把注释写一写

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. void reverse(char *s) {
  5.     int lens = strlen(s);
  6.     int i, t;
  7.     for(i = 0; i < (lens / 2); i++) {
  8.         t = s[i];
  9.         s[i] = s[lens - 1 - i];
  10.         s[lens - 1 - i] = t;
  11.     }
  12. }

  13. char *addBinary(char *a, char *b) {
  14.     int a1 = 1, b1 = 1, sum1 = 0, sum2 = 0, sum, d = 2;
  15.     int i, j;
  16.     int longth1, longth2;
  17.     longth1 = strlen(a);
  18.     longth2 = strlen(b);
  19.     char *c = (char *)malloc(sizeof(char) * (longth1 + longth2));
  20.     for(j = 0; j < longth1; j++) {
  21.         a1 = a[i];
  22.         for(i = longth1 - 1; i > 0; i--) {
  23.             a1 = 2 * a1;
  24.         }
  25.         sum1 += a1;
  26.     }
  27.     for(j = 0; j < longth2; j++) {
  28.         b1 = b[i];
  29.         for(i = longth2; i > 0; i--) {
  30.             b1 = 2 * b1;
  31.         }
  32.         sum2 += b1;
  33.     }
  34.     sum = sum1 + sum2;
  35.     for(i = 0; d >= 2; i++) {
  36.         c[i] = sum % 2 + '\0';
  37.         d = sum / 2;
  38.     }
  39.     reverse(c);
  40.     return c;
  41. }

  42. int main(void) {
  43.     return 0;
  44. }
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-22 10:06:18 | 显示全部楼层
另外,我用另一种思路写了一下这个题目
  1. #include <stdio.h>
  2. #include <string.h>

  3. void and_gate(char a, char b, char *c) {
  4.     *c = a == '1' && b == '1' ? '1' : '0';
  5. }

  6. void or_gate(char a, char b, char *c) {
  7.     *c = a == '0' && b == '0' ? '0' : '1';
  8. }

  9. #if 0
  10. void xor_gate(char a, char b, char *c) {
  11.     *c = a != b ? '1' : '0';
  12. }
  13. #else
  14. void not_gate(char a, char *b) {
  15.     *b = a == '1' ? '0' : '1';
  16. }

  17. void xor_gate(char a, char b, char *c) {
  18.     char na, nb;
  19.     char r0, r1;
  20.     not_gate(a, &na);
  21.     not_gate(b, &nb);
  22.     and_gate(a, nb, &r0);
  23.     and_gate(b, na, &r1);
  24.     or_gate(r0, r1, c);
  25. }
  26. #endif

  27. void half_adder_1bit(char a, char b, char *s, char *c) {
  28.     xor_gate(a, b, s);
  29.     and_gate(a, b, c);
  30. }

  31. void full_adder_1bit(char a, char b, char ci, char *s, char *co) {
  32.     char temp_s, temp_c[2];
  33.     half_adder_1bit(a, b, &temp_s, &temp_c[0]);
  34.     half_adder_1bit(temp_s, ci, s, &temp_c[1]);
  35.     or_gate(temp_c[0], temp_c[1], co);
  36. }

  37. void full_adder_2bit(const char *a, const char *b, char ci, char *s, char *co) {
  38.     char temp_c;
  39.     full_adder_1bit(a[1], b[1], ci, &s[1], &temp_c);
  40.     full_adder_1bit(a[0], b[0], temp_c, &s[0], co);
  41. }

  42. void full_adder_4bit(const char *a, const char *b, char ci, char *s, char *co) {
  43.     char temp_c;
  44.     full_adder_2bit(&a[2], &b[2], ci, &s[2], &temp_c);
  45.     full_adder_2bit(&a[0], &b[0], temp_c, &s[0], co);
  46. }

  47. void full_adder_8bit(const char *a, const char *b, char ci, char *s, char *co) {
  48.     char temp_c;
  49.     full_adder_4bit(&a[4], &b[4], ci, &s[4], &temp_c);
  50.     full_adder_4bit(&a[0], &b[0], temp_c, &s[0], co);
  51. }

  52. void full_adder_16bit(const char *a, const char *b, char ci, char *s, char *co) {
  53.     char temp_c;
  54.     full_adder_8bit(&a[8], &b[8], ci, &s[8], &temp_c);
  55.     full_adder_8bit(&a[0], &b[0], temp_c, &s[0], co);
  56. }

  57. void full_adder_32bit(const char *a, const char *b, char ci, char *s, char *co) {
  58.     char temp_c;
  59.     full_adder_16bit(&a[16], &b[16], ci, &s[16], &temp_c);
  60.     full_adder_16bit(&a[0], &b[0], temp_c, &s[0], co);
  61. }

  62. void binary(char dest[const 32], const char *src) {
  63.     memset(dest, '0', 32);
  64.     size_t l = strlen(src);
  65.     strncpy(dest + (32 - l), src, l);
  66. }

  67. void format(char *dest, const char src[const 32]) {
  68.     const char *p = NULL;
  69.     for(size_t i = 0; i < 32; ++i) {
  70.         if(src[i] == '1') {p = &src[i]; break;}
  71.     }
  72.     if(!p) p = src + 31;
  73.     while(p != src + 32) *dest++ = *p++;
  74.     *dest = '\0';
  75. }

  76. int main() {
  77.     char a[32];
  78.     char b[32];
  79.     char s[32];
  80.     char ci = '0', co;
  81.     char buff[33];
  82.     scanf("%32s", buff); binary(a, buff);
  83.     scanf("%32s", buff); binary(b, buff);
  84.     full_adder_32bit(a, b, ci, s, &co);
  85.     format(buff, s); puts(buff);
  86.     return 0;
  87. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-23 08:23:46 | 显示全部楼层
人造人 发表于 2022-9-22 10:06
另外,我用另一种思路写了一下这个题目

非常感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-23 08:34:15 | 显示全部楼层

修改后的函数好像还是有问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-23 08:34:45 | 显示全部楼层
addendum777 发表于 2022-9-23 08:34
修改后的函数好像还是有问题

无法运行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-23 09:43:39 | 显示全部楼层
addendum777 发表于 2022-9-23 08:34
修改后的函数好像还是有问题

我让你先注释一下你写的那个程序
说一说你的实现思路
因为我看不懂你在做什么
那个程序就只是用软件格式化了一下,又没有修改代码逻辑
看不懂你的代码怎么给你修改?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-24 09:57:35 | 显示全部楼层

我的思路就是先把二进制转换为十进制,然后相加,再把加起来的十进制转为为二进制,然后输出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-24 11:25:07 | 显示全部楼层
addendum777 发表于 2022-9-24 09:57
我的思路就是先把二进制转换为十进制,然后相加,再把加起来的十进制转为为二进制,然后输出

注释一下你的代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-24 11:42:06 | 显示全部楼层
addendum777 发表于 2022-9-24 09:57
我的思路就是先把二进制转换为十进制,然后相加,再把加起来的十进制转为为二进制,然后输出

算了,我按我对你代码的理解,给你改了
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. void reverse(char *s) {
  5.     int lens = strlen(s);
  6.     int i, t;
  7.     for(i = 0; i < (lens / 2); i++) {
  8.         t = s[i];
  9.         s[i] = s[lens - 1 - i];
  10.         s[lens - 1 - i] = t;
  11.     }
  12. }

  13. char *addBinary(char *a, char *b) {
  14.     int sum1 = 0, sum2 = 0, sum;
  15.     int j;
  16.     int length1, length2;
  17.     length1 = strlen(a);
  18.     length2 = strlen(b);
  19.     /*
  20.     for(j = 0; j < length1; j++) {
  21.         a1 = a[i];
  22.         for(i = length1 - 1; i > 0; i--) {
  23.             a1 = 2 * a1;
  24.         }
  25.         sum1 += a1;
  26.     }
  27.     */
  28.     for(j = 0; j < length1; j++) {
  29.         sum1 *= 2;
  30.         sum1 += a[j] - '0';
  31.     }
  32.     /*
  33.     for(j = 0; j < longth2; j++) {
  34.         b1 = b[i];
  35.         for(i = longth2; i > 0; i--) {
  36.             b1 = 2 * b1;
  37.         }
  38.         sum2 += b1;
  39.     }
  40.     */
  41.     for(j = 0; j < length2; j++) {
  42.         sum2 *= 2;
  43.         sum2 += b[j] - '0';
  44.     }
  45.     sum = sum1 + sum2;
  46.     char *c = malloc((length1 > length2 ? length1 : length2) + 2);
  47.     /*
  48.     for(i = 0; d >= 2; i++) {
  49.         c[i] = sum % 2 + '\0';
  50.         d = sum / 2;
  51.     }
  52.     */
  53.     char *p = c;
  54.     do {
  55.         *p++ = (sum % 2) + '0';
  56.         sum /= 2;
  57.     } while(sum);
  58.     *p = '\0';
  59.     reverse(c);
  60.     return c;
  61. }

  62. int main(void) {
  63.     char a[33], b[33];
  64.     scanf("%32s", a);
  65.     scanf("%32s", b);
  66.     char *c = addBinary(a, b);
  67.     puts(c);
  68.     free(c);
  69.     return 0;
  70. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 07:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表