作者;张煜
今天科创实验室进行了一次考核, 其中有一个算法,将16进制转化为8进制
//==============================================================
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
注意
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
//============================================================
这个题目有一个明确的规定,那就是16进制的长度不超过10w,用极限的思想思考一下,如果我们就是要做10w长度的16进制的转化该怎么办?
如果没有这个规定,我们可以用如下的算法来计算:
#include<iostream>
#include<stack>
using namespace std;
int main()
{
void fun(char *);
void fun_2(int n);
char Put_In[10][100];
int T;
cout << "How many number do you want :" << endl;
cin >> T;
getchar();
for (int i = 0; i < T; i++)
{
cin.getline(Put_In[i], 100);
}
for (int j = 0; j < T; j++)
{
fun(Put_In[j]);
cout << endl;
}
return 0;
}
void fun_2(int n)
{
if (n<8)
cout << n;
if (n >= 8)
{
fun_2(n / 8);
cout << n % 8;
}
}
void fun(char *str)
{
int Hot[10];
int n;
int x = 0;
int m = 1;
int size = 0;
int cout = 0;
int Result = 0;
for (int j = 0; str[j] != '\0'; j++)
{
switch (str[j])
{
case '1': n = 1; break;
case '2': n = 2; break;
case '3': n = 3; break;
case '4': n = 4; break;
case '5': n = 5; break;
case '6': n = 6; break;
case '7': n = 7; break;
case '8': n = 8; break;
case '9': n = 9; break;
case '0': n = 0; break;
case 'A': n = 10; break;
case 'B': n = 11; break;
case 'C': n = 12; break;
case 'D': n = 13; break;
case 'E': n = 14; break;
case 'F': n = 15; break;
default:
break;
}
Hot[j] = n;
size++;
}
for (int k = 0; k < size; k++)
{
for (int a = 0; a < k; a++)
{
m = m * 16;
}
Result = Result + Hot[size - k -1] * m;
}
fun_2(Result);
}
先将16进制转化为10进制再转化为8进制,但是如果加了呢?
那么我们就要考虑int类型的数据结构能否放入转化后的10进制和8进制? 答案很明显是不能
我们可以用下面的算法进行计算
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int main()
{
int m;
scanf("%d", &m);
int i, j, a[100000], sum = 0, sum8 = 0, val;
int len, n = 0;
char s[100000] = "0";
while (m--)
{
sum = 0;
sum8 = 0;
n = 0;
s[100000] = "0";
scanf("%s", s);
len = strlen(s);
for (i = 0; i < len; i++)
{
if (s[len - i - 1] >= 'A' && s[len - i - 1] <= 'F')
{
a[i] = s[len - i - 1] - 'A' + 10;
}
else
a[i] = s[len - i - 1] - '0';
}
for (i = 0; i<len; i++)
{
sum = sum + a[i] * pow(16, n);
n++;
}
i = 0;
while (sum>0)
{
a[i] = sum % 8;
++i;
sum = sum / 8;
n = i;
}
for (i = n - 1; i >= 0; i--)
{
sum8 = sum8 * 10 + a[i];
}
printf("%d\n", sum8);
}
return 0;
}
这个是c语言版的,解决了100000长度的数据存储
如需转载请声明原创地址:
http://blog.youkuaiyun.com/algolc/article/details/35583713