蓝桥杯十六进制转八进制(大数)

旧时模样 提交于 2019-12-16 21:32:31

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

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

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

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

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

【提示】
  先将十六进制数转换成某进制数,再由某进制数转换成八进制。
正确答案:

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n,i,m=0,j,k,l,c=0,g;
	int f[400001];
	char s[14],a[100001];
	char map[16][5]={"0000","0001","0010","0011","0100","0101",
	"0110","0111","1000","1001","1010","1011","1100","1101","1110","1111"};
	cin>>n;
	for(int t=0;t<n;t++)
	{
		scanf("%s",a);
		k=0;c=0;g=0;
		s[0]='\0';
		l=strlen(a);
		j=l%3;
		if(j!=0)j=3-j;
		if(j==1)
			{
				strcat(s,"0000");
				k+=4;
			}
			else if(j==2)
			{
				strcat(s,"00000000");
				k+=8;	
			}
		for(i=0;i<l;i++)
		{
			if(a[i]>=65)
				m=a[i]-55;
			else
				m=a[i]-48;
			strcat(s,map[m]);
			k+=4;
			if(k==12)
			{
				for(int t=0;t<12;t+=3)
				{			
					f[c]=(s[t]-'0')*4+(s[t+1]-'0')*2+s[t+2]-'0';
					c++;			
				}
				k=0;
				s[0]='\0';				
			}							
		}
		for(i=0;i<c;i++)
		{
			if(!(g==0&&f[i]==0))
			{
				printf("%d",f[i]);
				g=1;
			}
		}
		cout<<endl;
	}	
}

第一遍错误超时代码:

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
vector<int> b;
void fb(char a)
{
	int n,sum=0;
	vector<int> c;
	if(a>=65)
		n=a-55;
	else
	n=a-48;
//	cout<<n<<endl;
	while(n>0)
	{
		c.push_back(n%2);
		n/=2;
		sum++;
	}	
	for(int i=0;i<4-sum;i++)
	b.push_back(0);
	for(int i=c.size()-1;i>=0;i--)
	b.push_back(c[i]);
} 
int main()
{
	int n,i,m=0,j;
	char a[100001];
	int c[100001];
	cin>>n;
	for(int t=0;t<n;t++)
	{
		scanf("%s",a);
		int k=0;
		for( j=0;j<strlen(a);j++)
		fb(a[j]);
		m=b.size()%3;
		if(m!=0)
		b.insert(b.begin(),3-m,0);	
		for(i=0;i<b.size();i+=3)
		{			
			for(j=i;j<i+3;j++)
				c[k]=c[k]+(b[j]*pow(2,3-j+i-1));
			k++;
		}	
//		for(j=0;j<b.size();j++)
//		cout<<b[j];
//		cout<<endl;	
		int f=0;
		for(j=0;j<b.size()/3;j++)
		{
			if(f==0)
			{
				if(c[j]!=0)
				printf("%d",c[j]);
					f=1;
			}
			else
			{
				printf("%d",c[j]);
				f=1;
			}
		}
		cout<<endl;
		memset(a,0,sizeof(a));
		memset(c,0,sizeof(c));
		b.clear();
	} 
	
} 
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!