2个32位数字表示的10进制数值转化成字符串

#include "stdio.h"
#include "stdlib.h"
#include "memory.h"

#define VEC_MAX_ROW 65
#define VEC_MAX_COL 32
                                     
//该函数实现将2个32位数字表示的10进制数值转化成字符串以便打印出来的功能
//如果需要将若干个32位数字表示的10进制数值转化成字符串,同可以在此基础上
//进行简单的扩大展,即可实现, 函数操作成功返回字符串指针,操作失败返回NULL
char* XulToStr(unsigned long ulHigh32, unsigned long ulLow32, char *szStr, int nStrLen)
{
    unsigned long ulTmpHigh32 = ulHigh32;
    unsigned long ulTmpLow32 = ulLow32;
    int nVec[VEC_MAX_ROW][VEC_MAX_COL] = {0};
    int nDigit[VEC_MAX_COL] = {0};
    int nCarry = 0;
    int nBitCount = 0;
    int nRowSize = 0;
    int nColSize = 0;
   
 //入参有效性检查
 if ((NULL == szStr) || (nStrLen < 20))
 {                       //表示一个64的数字最少需要20位
  printf("/r/ncann't output formated string.");
  return NULL;
 }

 //填充算法依赖的一个以2为底的幂数的数字向量表,如:
 //2^0   1              {0, 0, 0, 0, 0, 0, 0, 0, 0, 1}
 //2^1   2      
 //2^2   4
 //...                  ...
 //2^32  4294967296     {4, 2, 9, 4, 9, 6, 7, 2, 9, 6}
 nVec[0][VEC_MAX_COL - 1] = 1;
 nCarry = 0;
 for (nRowSize = 1; nRowSize < VEC_MAX_ROW; nRowSize++)
    {
        for (nColSize = VEC_MAX_COL - 1; nColSize >= 0; nColSize--)
        {
            nVec[nRowSize][nColSize] = (nVec[nRowSize - 1][nColSize] * 2) % 10;
            nVec[nRowSize][nColSize] += nCarry;
            nCarry = (nVec[nRowSize - 1][nColSize] * 2) / 10;
            //printf("%d", nVec[nRowSize][nColSize]);
        }
        //printf("/r/n");
    }

 //将低32位表示的10进制数(也是就一个32位系统所能表示的基本数值范围)
 //先转化成一个数字串,后续超出了32位表示的数值的加法操作在此基础上
 //进行
   nColSize = VEC_MAX_COL - 1;
    for (; ulTmpLow32; nDigit[nColSize--] = ulTmpLow32 % 10, ulTmpLow32 /= 10);

 //对高32位进行逐位判断,如果某一位为1,则在上面的数字串基础上加上这
 //一位以2为底的幂的数字串(数字串存放在向量表中)
 if (ulTmpHigh32 > 0)
 {
  for (nBitCount = 0; nBitCount < 32; nBitCount++)
  {
   if (ulTmpHigh32 & (1 << nBitCount))
   {
    for (nColSize = VEC_MAX_COL -1; nColSize >= 0; nColSize--)
    {
                    nDigit[nColSize] += nVec[32 + nBitCount][nColSize];
     nDigit[nColSize - 1] += nDigit[nColSize] / 10;
        nDigit[nColSize] %= 10;
    }
   }
  }
 }

 //将计算完成后的数字串的前导数字0全部过滤掉
 nColSize = 0;
 while (!nDigit[nColSize++]);

 //将计算结果的数字串转化为字符串,作为函数输出
 for (nColSize--; nColSize < VEC_MAX_COL; nColSize++)
 {
  *szStr++ = nDigit[nColSize] + '0';
 }

 return szStr;
}

void main()
{
    char szFormatString[100];

 memset(szFormatString, '/0', 100);
    XulToStr(0xffffffff, 0xffffffff, szFormatString, 100);
    printf("%s", szFormatString);

 getchar();
    return;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值