鱼C论坛

 找回密码
 立即注册
查看: 2863|回复: 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
看不懂你写的那个 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[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;
}

int main(void) {
    return 0;
}
11.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[4096] = {0} , x1 , x2 , * p                  ;
        int c , d , e , i , n                               ;
        for(c = 0 ; a[c] ; c ++)                            ;  // c = a 的长度
        for(d = 0 ; b[d] ; d ++)                            ;  // d = b 的长度
        for(i = e = 0 , n = (c < d) ? d : c ; i < n ; i ++) {  // 加法计算按长字符串长度安排循环
                s[i] = e                                    ;
                x1 = (i < c) ? a[c - i - 1] : '0'           ;  // 短字符串的不足部分一律按字符 '0' 充数
                x2 = (i < d) ? b[d - i - 1] : '0'           ;
                s[i] = s[i] + x1 - '0' + x2 - '0'           ;
                e = s[i] / 2                                ;  // 2 就是二进制的二
                s[i] %= 2                                   ;  // 2 就是二进制的二
        }
        if(e) s[n ++] = e                                   ;
        p = (char *) malloc(n + 1)                          ;
        for(i = 0 ; i < n ; i ++) p[i] = s[n - i - 1] + '0' ;
        p[n] = '\0'                                         ;
        return p                                            ;
}

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

使用道具 举报

发表于 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[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;
}

int main(void) {
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[2];
    half_adder_1bit(a, b, &temp_s, &temp_c[0]);
    half_adder_1bit(temp_s, ci, s, &temp_c[1]);
    or_gate(temp_c[0], temp_c[1], co);
}

void full_adder_2bit(const char *a, const char *b, char ci, char *s, char *co) {
    char temp_c;
    full_adder_1bit(a[1], b[1], ci, &s[1], &temp_c);
    full_adder_1bit(a[0], b[0], temp_c, &s[0], co);
}

void full_adder_4bit(const char *a, const char *b, char ci, char *s, char *co) {
    char temp_c;
    full_adder_2bit(&a[2], &b[2], ci, &s[2], &temp_c);
    full_adder_2bit(&a[0], &b[0], temp_c, &s[0], co);
}

void full_adder_8bit(const char *a, const char *b, char ci, char *s, char *co) {
    char temp_c;
    full_adder_4bit(&a[4], &b[4], ci, &s[4], &temp_c);
    full_adder_4bit(&a[0], &b[0], temp_c, &s[0], co);
}

void full_adder_16bit(const char *a, const char *b, char ci, char *s, char *co) {
    char temp_c;
    full_adder_8bit(&a[8], &b[8], ci, &s[8], &temp_c);
    full_adder_8bit(&a[0], &b[0], temp_c, &s[0], co);
}

void full_adder_32bit(const char *a, const char *b, char ci, char *s, char *co) {
    char temp_c;
    full_adder_16bit(&a[16], &b[16], ci, &s[16], &temp_c);
    full_adder_16bit(&a[0], &b[0], temp_c, &s[0], co);
}

void binary(char dest[const 32], 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 32]) {
    const char *p = NULL;
    for(size_t i = 0; i < 32; ++i) {
        if(src[i] == '1') {p = &src[i]; break;}
    }
    if(!p) p = src + 31;
    while(p != src + 32) *dest++ = *p++;
    *dest = '\0';
}

int main() {
    char a[32];
    char b[32];
    char s[32];
    char ci = '0', co;
    char buff[33];
    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;
}
想知道小甲鱼最近在做啥?请访问 -> 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
我的思路就是先把二进制转换为十进制,然后相加,再把加起来的十进制转为为二进制,然后输出

算了,我按我对你代码的理解,给你改了
#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[i];
        s[i] = s[lens - 1 - i];
        s[lens - 1 - i] = 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[i];
        for(i = length1 - 1; i > 0; i--) {
            a1 = 2 * a1;
        }
        sum1 += a1;
    }
    */
    for(j = 0; j < length1; j++) {
        sum1 *= 2;
        sum1 += a[j] - '0';
    }
    /*
    for(j = 0; j < longth2; j++) {
        b1 = b[i];
        for(i = longth2; i > 0; i--) {
            b1 = 2 * b1;
        }
        sum2 += b1;
    }
    */
    for(j = 0; j < length2; j++) {
        sum2 *= 2;
        sum2 += b[j] - '0';
    }
    sum = sum1 + sum2;
    char *c = malloc((length1 > length2 ? length1 : length2) + 2);
    /*
    for(i = 0; d >= 2; i++) {
        c[i] = 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[33], b[33];
    scanf("%32s", a);
    scanf("%32s", b);
    char *c = addBinary(a, b);
    puts(c);
    free(c);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-16 21:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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