今天写了个关于进制转化的程序,感觉收益匪浅。题目是这样要求的:
其思路就是说先将输入的数字按字符保存,然后要使用字符串来解决内存问题。这样就搞定了
// 十六进制 -> 八进制
#include <iostream>
#include <string>
using namespace std;
int main(void)
{
int n = 0, i = 0, j = 0, k = 0;
int count = 0, length = 0;
int m_num1 = 0, m_num = 0;
string strHexa[10]; // 十六进制
string strBin[10]; // 二进制
string strOct[10]; // 八进制
cin >> n; // 个数
for(i = 0; i < n; i++)
{
cin >> strHexa[i];
}
// 转换为二进制
for(k = 0; k < n; k++)
{
while(strHexa[k][count] != NULL)
{
switch(strHexa[k][count++])
{
case '0':
strBin[k] += "0000";
break;
case '1':
strBin[k] += "0001";
break;
case '2':
strBin[k] += "0010";
break;
case '3':
strBin[k] += "0011";
break;
case '4':
strBin[k] += "0100";
break;
case '5':
strBin[k] += "0101";
break;
case '6':
strBin[k] += "0110";
break;
case '7':
strBin[k] += "0111";
break;
case '8':
strBin[k] += "1000";
break;
case '9':
strBin[k] += "1001";
break;
case 'A':
strBin[k] += "1010";
break;
case 'B':
strBin[k] += "1011";
break;
case 'C':
strBin[k] += "1100";
break;
case 'D':
strBin[k] += "1101";
break;
case 'E':
strBin[k] += "1110";
break;
case 'F':
strBin[k] += "1111";
break;
default:
/*
* 输入的数据有误
*/
break;
}
}
/* 获得字符串的长度 */
while(strBin[k][length++] != NULL);
length--;
/*
* 进行二进制向八进制的转换
*/
for(i = length-1; i >= 0; i--)
{
for(j = i; (j > i-3) && j >= 0; j--)
{
switch((i-j))
{
case 1:
m_num1 = (strBin[k][j]-'0')*2;
m_num += m_num1;
break;
case 2:
m_num1 = (strBin[k][j]-'0')*2*2;
m_num += m_num1;
break;
case 0:
m_num = strBin[k][j]-'0';
break;
}
}
i = i - 2;
strOct[k] += m_num + '0';
}
// 得到八进制字符串的长度
while(strOct[k][count++] != NULL);
count--;
/*
* 第一个是否为 '0'
*/
if(strOct[k][count-1] == '0')
count--;
/* 逆序输出 */
for(i = count-1; i >= 0; i--)
cout << strOct[k][i];
cout << endl;
/* 初始化 */
count = 0;
m_num = 0;
length = 0;
m_num1 = 0;
}
return 0;
}