关于大数的进制转换问题
2014-09-29 00:50
423 查看
最近各种笔试面试,碰到了大数的进制转换问题,给一串很长很长的十进制数,要转换成16进制,用常规方法肯定不行的,得换个思路。于是在网上找到了前辈分享的方法:
《浅谈大数的进制转换》
思想掌握了,咱就来敲一遍代码试验一下吧:
#include<iostream>
#include<stack>
#define notation1 10
#define notation2 16
using namespace std;
char Table16[]="0123456789ABCDEF";
//////////////////////////////////////////////
//将十进制字符串 转换为16进制
//
//////////////////////////////////////////////*/
void CharToInt(char *Input,int *num)
{
if(Input==NULL) return;
while(*Input!='\0')
{
if(*Input>='0'&&*Input<='9')
*num++=*Input-'0';
Input++;
}
}
void ConvertCore(int *num,int len )
{
int firstNum0=0,plus; //firstNum0标记着num数组第一个非0的位置,若==len,则表示结束转换
stack<int> residue;
while(firstNum0!=len)//=First0ofnum(num,len))!=len)
{
plus=0;
int flag=false;
for(int i=firstNum0;i<len;i++)
{
int tmp=(plus*notation1+num[i]);
plus=tmp%notation2;
num[i]=tmp/notation2;
if(num[i]!=0) flag=true; //flag标记有没有出现非0的数
if(num[i]==0&&flag!=true) firstNum0++; //若之前没有出现非0的数且当前数为0,则firstNum0++,例如 00001010,后面两个0不会起作用的
}
residue.push(plus);
}
while(!residue.empty()) //倒序查表输出
{
cout<<Table16[residue.top()];
residue.pop();
}
cout<<endl;
}
int main()
{
char str[1000];
cout<<"please input the dec num:\n";
cin>>str;
int len=strlen(str);
int *num=new int[len];
CharToInt(str,num);
for(int i=0;i<len;i++) //测试一下是否有问题
cout<<num[i];
cout<<endl;
ConvertCore(num,len);
return 0;
}
《浅谈大数的进制转换》
思想掌握了,咱就来敲一遍代码试验一下吧:
#include<iostream>
#include<stack>
#define notation1 10
#define notation2 16
using namespace std;
char Table16[]="0123456789ABCDEF";
//////////////////////////////////////////////
//将十进制字符串 转换为16进制
//
//////////////////////////////////////////////*/
void CharToInt(char *Input,int *num)
{
if(Input==NULL) return;
while(*Input!='\0')
{
if(*Input>='0'&&*Input<='9')
*num++=*Input-'0';
Input++;
}
}
void ConvertCore(int *num,int len )
{
int firstNum0=0,plus; //firstNum0标记着num数组第一个非0的位置,若==len,则表示结束转换
stack<int> residue;
while(firstNum0!=len)//=First0ofnum(num,len))!=len)
{
plus=0;
int flag=false;
for(int i=firstNum0;i<len;i++)
{
int tmp=(plus*notation1+num[i]);
plus=tmp%notation2;
num[i]=tmp/notation2;
if(num[i]!=0) flag=true; //flag标记有没有出现非0的数
if(num[i]==0&&flag!=true) firstNum0++; //若之前没有出现非0的数且当前数为0,则firstNum0++,例如 00001010,后面两个0不会起作用的
}
residue.push(plus);
}
while(!residue.empty()) //倒序查表输出
{
cout<<Table16[residue.top()];
residue.pop();
}
cout<<endl;
}
int main()
{
char str[1000];
cout<<"please input the dec num:\n";
cin>>str;
int len=strlen(str);
int *num=new int[len];
CharToInt(str,num);
for(int i=0;i<len;i++) //测试一下是否有问题
cout<<num[i];
cout<<endl;
ConvertCore(num,len);
return 0;
}
相关文章推荐
- java 关于大数的一些问题
- 【编程题目】打印1到最大的n位数——关于大数问题的探讨(C++实现)
- 关于JS中各进制转换问题
- 题目1208:10进制 VS 2进制(进制转换以及大数保存问题)
- js的大数运算 跟经典的收藏 结合前一篇的收藏 解决工作中的一个大数进制转换问题
- 关于大数相乘 溢出的问题
- 关于大数相乘问题(Java实现)
- JAVA与C++::关于JNI中文字符串操作问题总结
- Php 3.x与4.x中关于对象编程的不兼容问题之一 构造器说
- 关于C++&Java中命令行编译的问题
- 关于Borland C++BuilderX的一些问题的回答
- 一个关于#include的问题
- 我用c语言写了一个关于商人过河的问题
- 关于SQL的存储过程一个悬而未决的老问题
- 关于RedHat Linux 9.0下Kylix 3会出现的四个问题的完满解决办法!
- 关于分形的几个问题
- 关于javascript中数组元素删除问题的讨论
- 关于软件注册问题的讨论
- 关于win2000安装的2个问题
- JS中关于对内存的释放问题[待续]