问题描述
给定n个十六进制正整数,输出它们对应的八进制数。

输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。

输出格式
输出n行,每行为输入对应的八进制正整数。

【注意
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。

样例输入
2
39
123ABC

样例输出
71
4435274

提示
先将十六进制数转换成二进制数,再由二进制数转换成八进制。

 由于这题要求的十六进制字符很长,最长有100000,开始我的思路是16进制转换为10进制,但是考虑到这一点,即使是long long 的十进制数也存不下,我转换了下思路,想到了曾经的数字逻辑里面经常有三位二进制数转换为八进制,而二进制是最好表示的,如四位二进制数即可表示‘0’~‘F'的十六进制数,所以有了下面的代码

#include<bits/stdc++.h>
#include<algorithm>
#include<string>
using namespace std;
int main()
{
    int i,n;
    string s1,s2;//s1为输入的16进制字符串,s2为转换的2进制字符串,三位2进制为一个八进制
	cin>>n;
	while(n--)
	{
		cin>>s1;
		s2="";//初始化
		for(i=0;i<s1.size();i++)
		{
			switch(s1[i])
			{
				case '0':s2+="0000"; break;
				case '1':s2+="0001"; break;
				case '2':s2+="0010";break;
				case '3': s2+="0011";break;
				case '4':s2+="0100" ;break;
				case '5':s2+="0101";break;
				case '6':s2+="0110" ;break;
				case '7':s2+="0111";break;
				case '8':s2+="1000";break;
				case '9':s2+="1001";break;\
				case 'A':s2+="1010";break;
				case 'B':s2+="1011";break;
				case 'C':s2+="1100";break;
				case 'D':s2+="1101";break;
				case 'E':s2+="1110";break;
				case 'F':s2+="1111";break;
				default :break;
			}
		}
		int len =s2.size();
		if(len%3==1)//三个一位的二进制串为八进制,确保长度为3的倍数,在前面补零
		s2="00"+s2;
		else if(len%3==2)
		s2="0"+s2;
		int flag=0;
		for(i=0;i<=s2.size()-3;i+=3)
		{
			 int num=4*(s2[i]-'0')+2*(s2[i+1]-'0')+s2[i+2]-'0';
			if(num)
			flag=1;//忽略前导零
			if(flag)
			cout<<num;
		}
		cout<<endl;

	}
}


 2.十六进制转十进制
资源限制
时间限制:1.0s   内存限制:512.0MB
问题描述
从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。
样例输入
FFFF
样例输出
65535
#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{
    char a[8];
    int i;
	scanf("%s",a);
    int l=strlen(a);//计算字符串长度
    long long ans=0;//注意是不超过8位的正的十六进制数字符串,因此数较大,应设为long long
    for(i=0; i<l; i++)
    {
        if(a[i]>='0'&&a[i]<='9')
            ans+=(a[i]-'0')*pow(16,l-1-i);
        else
            ans+=(a[i]-'A'+10)*pow(16,l-1-i);
    }
    printf("%lld\n",ans);
    return 0;
}

还有一段错误代码
#include <stdio.h>
#include <string.h>
int main()
{
    char s[10];
     scanf("%s",s);
    long long sum=0;
    int k=1;
    for(int i=strlen(s)-1;i>=0;i--)
    {
    	if(s[i]>='0'&&s[i]<='9')
    	sum+=k*(s[i]-'0'),k*=16;
    	else sum+=k*(s[i]-'A'+10),k*=16;
	}
    printf("%lld",sum);
    return 0;
}
当然最简单的是下面的
#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    scanf("%x",&n);
    printf("%u",n);
    return 0;
}