char型字符串表示十进制数字没有充分利用内存?


在剑指offer的面试题12的扩展中提到:
引用
12.输入数字n,按顺序打印出从1最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999 。

前面的代码中,我们都是用一个char型字符表示十进制数字的一位。8个bit的char型字符最多能表示256个字符,而十进制数字只有0-9的10个数字。因此用char型字符串来表示十进制的数字并没有充分利用内存,有一些浪费。有没有更高效的方式来表示大数。

不知道有什么更高效的方式

6 个解决方案

#1


那就用几个int型的数拼成一个n位的数。

#2


可以使用bitmap算法,这个很有意思。特别是在数据量大的时候,非常高效
所谓bitmap就是用一个bit位来标记某个元素对应的value,而key即是这个元素。由于采用bit为单位来存储数据,因此在可以大大的节省存储空间。具体自己百度下吧

#3


引用 1 楼 a1193561652 的回复:
那就用几个int型的数拼成一个n位的数。
+1

#4


十进制表示方法,不止一种
ASCII
BCD
压缩BCD
这些都是十进制编码,其中压缩BCD可以多存储一倍的数据
其他,
16Bits 可以表示万进制
32Bits 可以表示亿进制,10   亿进制
这些和十进制优势关系密切的表示方法,转换简单
另外一种 多 字节(字,双字,四字)串 表示方法,
是 二进制表示法,
和十进制转换不太方便,不过+,-,*,/ 等数学运算,实现方便.

#5


仅供参考:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
unsigned int iv,i;
unsigned char BCD[5];//定长10位BCD码
unsigned char sv[11];
void main() {
    iv=123456789;//最大10位无符号正整数
    //INT2BCD
    sprintf(sv,"%010u",iv);
    for (i=0;i<10;i+=2) {
        BCD[i/2]=(sv[i]<<4)|(sv[i+1]&0x0F);
    }
    printf("BCD=%02x%02x%02x%02x%02x\n",BCD[0],BCD[1],BCD[2],BCD[3],BCD[4]);
    //BCD2INT
    for (i=0;i<10;i+=2) {
        sv[i]='0'|(BCD[i/2]>>4);
        sv[i+1]='0'|(BCD[i/2]&0x0F);
    }
    sscanf(sv,"%010u",&iv);
    printf("iv=%010u\n",iv);
    getch();
}

#6


考虑一下进制的问题。一般来讲,把十进制数用十六进制表示,位数往往会减少,能否使用256进制来表示一个十进制数?

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号