这个题目看着简单,实际花的功夫却挺大的。找不到大佬的链接了,但是确实值得学习。
/*
进制数转换
给你4个正整数。第一个是2进制,第二个为8进制,第三个为10进制,第四个为16进制。
请依次给出:
2进制数的8进制、10进制、16进制形式。
8进制数的2进制、10进制、16进制形式。
10进制数的2进制、8进制、16进制形式。
16进制数的2进制、8进制、10进制形式。
解题思想,以10进制作为中介
*/
// 初级版本,仅适用于十六进制1位的情况
#include <iostream>
#include <stdlib.h>
#include <string>
#include <sstream>
#include <math.h>
using namespace std;
char* To_Binary(int iVal, int index, char *ch[12])
{
int i, Cnt_unique = 0, T;
int flag = 0;
for (i = 16; i >= 0; --i) // 八进制转二进制
{
T = iVal & (1 << i);
if (T >= 1)
{
ch[index][Cnt_unique] = '1';
flag = 1;
}
if (T == 0 && flag == 1)
ch[index][Cnt_unique] = '0';
if (flag == 1)
++Cnt_unique;
}
ch[index][Cnt_unique] = 0;
return ch[index];
}
int main()
{
FILE *fpSrc, *fpDes;
fpSrc = fopen("execute.txt", "r"); // 打开[没有则创建]文件读取数据
fpDes = fopen("destfile.stdin", "w"); // 打开文件写入数据
if (fpSrc == NULL || fpDes == NULL)
{
printf("文件打开错误!");
exit(-1); // 非正常退出
}
char Tmp, *ch[12], a[12];
int arrInt[10];
int i, len = 0, iTmp = 0, index = 0;
int BaseArr[4] = { 2, 8, 10, 16 };
while (fscanf(fpSrc, "%s", a) == 1 && index < 3) // 将2/8/10进制 转为10进制数
{
ch[index] = (char *)malloc(sizeof(char));
len = strlen(a);
memcpy(ch[index], a, len);
ch[index][len] = 0;
for (i = 0; i < len; i++) // 1.二进制转十进制
iTmp += (ch[index][i] - 48) * pow(BaseArr[index], len - 1 - i);
arrInt[index] = iTmp;
++index;
iTmp = 0;
}
// 4.十六进制数 转为10进制数
fscanf(fpSrc, "%s", a);
ch[index] = (char *)malloc(sizeof(char));
len = strlen(a);
memcpy(ch[index], a, len);
ch[index][len] = 0;
arrInt[index] = 0;
for (i = 0; i < len; i++) // 2.八进制转十进制
{
if (ch[index][i] >= '0' && ch[index][i] <= '9')
iTmp = ch[index][i] - 48;
else if (ch[index][i] >= 'A' && ch[index][i] <= 'F')
iTmp = ch[index][i] - 65 + 10;
else if (ch[index][i] >= 'a' && ch[index][i] <= 'F')
iTmp = ch[index][i] - 97 + 10;
arrInt[index] += iTmp* pow(16, len - 1 - i);
}
fclose(fpSrc);
// 第一个
index = 0;
sprintf(ch[index++], "%o", arrInt[0]);//0
sprintf(ch[index++], "%d", arrInt[0]);//0
sprintf(ch[index++], "%x", arrInt[0]);//2
// 第二个
ch[index] = To_Binary(arrInt[1], index, ch);
ch[++index] = (char *)malloc(sizeof(char));
sprintf(ch[index], "%d", arrInt[1]);//0
ch[++index] = (char *)malloc(sizeof(char));
sprintf(ch[index], "%x", arrInt[1]);//0
// 第3个:10进制数
++index;
ch[index] = (char *)malloc(sizeof(char));
ch[index] = To_Binary(arrInt[2], index, ch);
ch[++index] = (char *)malloc(sizeof(char));
sprintf(ch[index], "%o", arrInt[2]);//0
ch[++index] = (char *)malloc(sizeof(char));
sprintf(ch[index], "%x", arrInt[2]);//0
// 第4个:16进制数
++index;
ch[index] = (char *)malloc(sizeof(char));
ch[index] = To_Binary(arrInt[3], index, ch);
ch[++index] = (char *)malloc(sizeof(char));
sprintf(ch[index], "%o", arrInt[3]);//0
ch[++index] = (char *)malloc(sizeof(char));
sprintf(ch[index], "%d", arrInt[3]);//0
for (i = 0; i < 12; i++)
{
if (i % 3 == 2)
cout << ch[i] << endl;
else
cout << ch[i] << " ";
}
system("pause");
return 0;
}