| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1615 人关注过本帖
标题:超大数字的进制转换
只看楼主 加入收藏
梦客,贪欢
Rank: 1
来 自:西电
等 级:新手上路
帖 子:4
专家分:3
注 册:2013-3-11
收藏
得分:0 
题目是
假定用一个整型数组表示一个长整数,数组的每个元素存储长整数的一位数字,实际的长整数m表示为:m=a[k]×10k-1+a[k-1]×10k-2+….+a[2]×10+a[1]其中a[0]保存该长整数的位数。完成(任选一题): (1) 转换成16进制数输出。(2) 转换成8进制数输出。

C语言菜鸟二号
2013-03-15 15:35
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:3 
闲的!
程序代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAX 20

void Input(int a[])
{  //将数据每 4位拆分存入数组,a[1]单位为 1,a[2]单位为万,a[3]单位为亿、、、、、、
   //a[0]存储数组中有效位。
   //例如 123456789 存储形式为 3 6789 2345 1
    int i, j;
    char str[MAX] = {0};
    
    scanf("%s", str);
    j = strlen(str);a[0] = j / 4 + 1;
    for (i = 1, --j; j >= 0; ++i)
    {
        a[i] = str[j--] - '0';
        if(j < 0)    break;
        a[i] += (str[j--] - '0') * 10;
        if(j < 0)    break;
        a[i] += (str[j--] - '0') * 100;
        if(j < 0)    break;
        a[i] += (str[j--] - '0') * 1000;
    }
}

int Divide(int a[], int n)
{   //除法运算 把 a除以 n的值存入 a,函数返回值为 余数
    //例如 3 6789 2345 1 除以100 后变为 2 4567 123
    int temp = 0;
    for (int i = a[0]; i >= 1; --i)
    {
        temp = a[i] % n;
        a[i] /= n;
        if(i > 1)
        a[i-1] += temp * 10000;
    }
    if (0 == a[1] && 1 == a[0])
    {a[0]=0;return temp;}
    while ( !a[ a[0] ] )    --a[0];
    return temp;
}

char Get(int n, int base)
{
    if (n < 0 || n > base)
    {
        puts("Data Error!");
        exit(0);
    }
    return n < 10 ? n + '0' : n + 'A' - 10;
}

void my_itoa(int a[], char *str, int base)
{    //底除取余法
    for (int i = 0; a[0];)
        str[i++] = Get(Divide(a, base), base);
    str[i] = '\0';
    strrev(str);    //倒写余数
}

int main()
{
    int a[MAX/4+3] = {0};
    char str[MAX] = {0};
    Input(a);
    my_itoa(a, str, 16);
    puts(str);
    return 0;
}


[ 本帖最后由 azzbcc 于 2013-3-15 22:35 编辑 ]
收到的鲜花
  • 语言者2013-03-16 07:31 送鲜花  3朵   附言:我很赞同


[fly]存在即是合理[/fly]
2013-03-15 16:28
语言者
Rank: 2
等 级:论坛游民
帖 子:20
专家分:14
注 册:2012-12-18
收藏
得分:0 
我要的是通用算法  不是局域性的
2013-03-15 18:30
语言者
Rank: 2
等 级:论坛游民
帖 子:20
专家分:14
注 册:2012-12-18
收藏
得分:0 
2013-03-15 18:30
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
回复 13楼 语言者
什么叫通用性?

局域又是啥?


[fly]存在即是合理[/fly]
2013-03-15 20:25
语言者
Rank: 2
等 级:论坛游民
帖 子:20
专家分:14
注 册:2012-12-18
收藏
得分:0 
azzbcc  你的代码我看不懂,你可以把你的算法描述一么????
2013-03-15 20:57
语言者
Rank: 2
等 级:论坛游民
帖 子:20
专家分:14
注 册:2012-12-18
收藏
得分:0 
azzbcc  你可以告诉我用字符窜储蓄数字后,怎么向十六进制转化吗??
2013-03-15 20:59
刘邦
Rank: 2
等 级:论坛游民
帖 子:32
专家分:36
注 册:2013-3-22
收藏
得分:0 
定位解权法  先用这种方法把10进制转化成2进制 再四位一体把2进制转为16进制。  不懂就BAIDU收定位解权法。应该可以解决LZ的问题吧。
2013-03-22 14:47
快速回复:超大数字的进制转换
数据加载中...
 
   



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

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