标题:C语言 大数的进制转换问题
只看楼主
neebla
Rank: 2
等 级:论坛游民
帖 子:16
专家分:29
注 册:2016-12-8
结帖率:100%
已结贴  问题点数:20 回复次数:7 
C语言 大数的进制转换问题
//十进制转为二进制
void ChaNumber(int radix,struct bigInt *a,struct bigInt *q)     //radix = 2,a作为输入,q作为输出。
{
    int i,j;
    struct bigInt temp,rt;

    if(IsZero(a))
    {
        printf("wrong!");
        return;
    }
    else {

        for(i = a->length - 1 , j=0 ; i >= 0 ; i--,j++)
        {
            if(q->array[i] >= 2)
            {
                rt.array[j] = temp.array[i] % radix;
                temp.array[i] = temp.array[i] / radix;
            }
            else {
                temp.array[i] = temp.array[i] + 10;
                rt.array[j] = temp.array[i] % radix;
                temp.array[i] = temp.array[i] / radix;
                temp.array[i-1] = temp.array[i-1] - 1;
            }
        }
    /* 确定运算结果的符号位 */
    rt.sign = a->sign;

    /* 复制商和余数 */
    CopyBigInt(q,&rt);
    }
}

结果一直为0,请问中间有什么问题吗?应该怎么修改比较好呢?麻烦帮我看看,谢谢。
搜索更多相关主题的帖子: return 二进制 C语言 十进制 wrong 
2016-12-08 21:16
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
temp.array[i] = temp.array[i] + 10;
这里加10是什么意思?
代码不完整,不好测试。
2016-12-08 21:26
neebla
Rank: 2
等 级:论坛游民
帖 子:16
专家分:29
注 册:2016-12-8
得分:0 
回复 2楼 吹水佬
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX 100
/*
void ReadBigInt(struct bigInt *x, const char *s);
void PrintBigInt(const struct bigInt *x);
void ChaNumber(struct bigInt a,int radix);
void CopyBigInt(struct bigInt *p, const struct bigInt *t);
int IsZero(const struct bigInt *x);
*/

struct bigInt {
    int array[MAX]; /*数值*/
    int sign;   /*数值符号位*/
    int length; /*数值位数*/
};

void ReadBigInt(struct bigInt *x, const char *s)
{
    int i,j;

    /* 输入数据必须有正负号 */
    if(s[0] != '-' && s[0] != '+') {
        printf("Input error!\n");
        exit(1);
    }

    /* 读取符号位 */
    if(s[0] == '-')
    {
        x->sign = 1;
    }
    if(s[0] == '+')
    {
        x->sign = 0;
    }

    /*读取数值位,低位数放在数组低下标处 */
    for(i = strlen(s) - 1, j = 0; i > 0; i--, j++) {
        if(isdigit(s[i])) {
            x->array[j] = s[i] - '0';
        } else {
            exit(1);
        }
    }

    /* 初始化数值位数 */
    x->length = strlen(s) - 1;
}

void PrintBigInt(const struct bigInt *x)
{
    int i;

    /* 输出符号位 */
    if(x->sign == 0)
    {
        printf("%c",'+');
    }
    if(x->sign == 1)
    {
        printf("%c",'-');
    }

    /* 输出数值位,从高位到低位显示 */
    for(i = x->length - 1; i >= 0; i--) {
        printf("%d", x->array[i]);
    }
    printf("\n");
}


void CopyBigInt(struct bigInt *p, const struct bigInt *t)
{
    int i;

    for(i = 0; i < t->length; i++) {
        p->array[i] = t ->array[i];
    }
    p->length = t->length;
    p->sign = t->sign;
}

int IsZero(const struct bigInt *x)
{
    if(x->length == 1 && x->array[0] == 0) {
        return 1;
    } else {
        return 0;
    }
}

void ChaNumber(int radix,struct bigInt *a,struct bigInt *q)
{
    int i,j;
    struct bigInt temp,rt;

    if(IsZero(a))
    {
        printf("wrong!");
        return;
    }
    else {

        for(i = a->length - 1 , j=0 ; i >= 0 ; i--,j++)
        {
            if(q->array[i] >= 2)
            {
                rt.array[j] = temp.array[i] % radix;
                temp.array[i] = temp.array[i] / radix;
            }
            else {
                temp.array[i] = temp.array[i] + 10;
                rt.array[j] = temp.array[i] % radix;
                temp.array[i] = temp.array[i] / radix;
                temp.array[i-1] = temp.array[i-1] - 1;
            }
        }
    /* 确定运算结果的符号位 */
    rt.sign = a->sign;

    /* 复制商和余数 */
    CopyBigInt(q,&rt);
    }
}

int main()
{
    struct bigInt a,q;   /*a为十进制数,q为商,t为余数*/
    int k = 2;
    char str[MAX];
    printf("please input number:");
    scanf("%s",str);
    ReadBigInt(&a,str);
    printf("十进制数");
    PrintBigInt(&a);
    ChaNumber(k,&a,&q);
    printf("=二进制数");
    PrintBigInt(&a);
}


+10是向前一位借1
2016-12-08 22:20
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
得分:1 
tem和rt没有初始化。
2016-12-08 23:51
neebla
Rank: 2
等 级:论坛游民
帖 子:16
专家分:29
注 册:2016-12-8
得分:0 
回复 4楼 linlulu001
初始化了
2016-12-09 13:10
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:19 
回复 3楼 neebla
试了一下无符号整数(有符号整数,可以先按无符号转换,之后取反再加1)
/*
    无符号大整数转二进制
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

int _isdigits(const char *s)
{
    while (isdigit(*s++)) NULL;
    return !*--s;
}

char *_dtob(char *s)
{
    int i, j, t, m=0, blen=1, dlen=strlen(s);
    char *d=(char*)calloc(dlen+1, sizeof(char));
    char *b=(char*)calloc(blen, sizeof(char));
    strcpy(d, s);
    for (i=0; i<dlen; i++)
        d[i] -= '0';
    i = 0;
    while (i < dlen)
    {
        m = 0;
        for (j=i; j<dlen; j++)
        {
            t = m;
            m = d[j]%2;
            d[j] = (d[j] + t*10)/2;
        }
        if (d[i] == 0)
            i++;
        blen++;   
        b = (char*)realloc(b, blen);
        b[blen-2] = m + '0';
        b[blen-1] = 0;
    }
    free(d);
    char *p1 = b;
    char *p2 = b + blen - 2;
    for(; p1<p2; p1++, p2--)
    {
        *p1 ^= *p2;
        *p2 ^= *p1;
        *p1 ^= *p2;
    }
    return b;
}

main()
{
    char s[256];
    printf("please input number:");
    gets(s);
    if (!_isdigits(s)) return 0;
    char *b = _dtob(s);
    puts(b);
    free(b);
}

 

[此贴子已经被作者于2016-12-9 23:02编辑过]

2016-12-09 22:37
neebla
Rank: 2
等 级:论坛游民
帖 子:16
专家分:29
注 册:2016-12-8
得分:0 
回复 6楼 吹水佬
谢谢
2016-12-09 23:31
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
无符号整数转成二进制:除 2 取余,高位补零,倒序排列。
漏了高位补0,如果无需补齐,试试改这里:
......
free(d);
/*高位补零*/
blen++;   
b = (char*)realloc(b, blen);
b[blen-2] = '0';
b[blen-1] = 0;
/*倒序排列*/
char *p1 = b;
char *p2 = b + blen - 2;
......
2016-12-10 07:10



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-472152-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.141809 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved