十六进制转八进制

来源:互联网 发布:网上淘宝刷单是真的吗 编辑:程序博客网 时间:2024/04/29 05:43
时间限制:1.0s   内存限制:512.0MB
问题描述
  给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
  输入的第一行为一个正整数n (1<=n<=10)。
  接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
  输出n行,每行为输入对应的八进制正整数。
注意
  输入的十六进制数不会有前导0,比如012A。
  输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274

分析:该题的大致思路就是把十六进制转化成二进制,再把二进制转化为八进制。
     十六进制转二进制:将十六进制每一位变成四位的二进制,可用欧几里得算法;
     二进制转八进制:将二进制每三位变成八进制的一位。

接下来就是数据量的问题:
十六进制数据的最大长度为100000位,即最大数为FFFFFF=1118480(十进制)<20147483648(整数类型可以表示的最大值),也就是可以用整型表示数据,但是算法设计不当可能会出现超时或者超内存。

方法一:省内存,花时间。
使用字符串存储十六进制数,使用整数类型存储二进制和八进制数。

<span style="font-size:14px;">#include <iostream>#include <algorithm>#include <vector>#include <string>#include <cmath>using namespace std;int main(){    vector<int> v;//存放二进制    vector<int> vv;//存放八进制    string s;    int n;    int m,t;    while(cin>>n)    {        for(int i=0;i<n;i++)        {            v.clear();            vv.clear();            cin>>s;            reverse(s.begin(),s.end());            for(int j=0;j<s.size();j++)            {                if(s[j]=='0') m=0;                else if(s[j]=='1')  m=1;  else if(s[j]=='2')  m=2; else if(s[j]=='3')   m=3;                else if(s[j]=='4')  m=4;  else if(s[j]=='5')  m=5; else if(s[j]=='6')   m=6;                else if(s[j]=='7')  m=7;  else if(s[j]=='8')  m=8; else if(s[j]=='9')   m=9;                else if(s[j]=='A')  m=10; else if(s[j]=='B')  m=11; else if(s[j]=='C')  m=12;                else if(s[j]=='D')  m=13; else if(s[j]=='E')  m=14;  else if(s[j]=='F') m=15;                for(int k=0;k<4;k++)//十六进制转二进制                {                    t=m%2;                    m=m/2;                    v.push_back(t);                }            }            //因为要转换为八进制,所以总位数应是3的倍数,不是则给高位补零            if(v.size()%3==2) v.push_back(0);            else if(v.size()%3==1)            {                v.push_back(0);                v.push_back(0);            }            m=0;            for(int j=0;j<v.size();j++)//二进制转八进制            {                m+=v[j]*pow(2,j%3);                if(j%3==2)                {                    vv.push_back(m);                    m=0;                }            }            reverse(vv.begin(),vv.end());            for(int j=0;j<vv.size();j++)            {                if(j==0&&vv[j]==0) continue;//不输出最高位上的零                else cout<<vv[j];            }            if(i!=n-1) cout<<endl;        }    }}</span>

方法二:省时间,花内存
使用字符串存储各种进制的数据,要声明一个大于等于10000001的整型数组
#include <iostream>#include <string>#include <cmath>using namespace std;int arr[10000001]; // 记录八进制的数int main(){  string str;  int n,m,i,num,j;    cin>>n;  while(n--)  {    cin>>str;    m=str.length();    // 转换成十进制    num=0;    for(i=m-1;i>=0;--i)    {      if(str[i]>='0'&&str[i]<='9')        num+=pow(16,m-1-i)*(str[i]-'0');      else if(str[i]>='A'&&str[i]<='F')        num+=pow(16,m-1-i)*(str[i]-'A'+10);    }        i=0;    while(num/8!=0)    {      arr[i]=num%8;      num/=8;      ++i;    }    arr[i]=num;    for(j=i;j>=0;--j)      cout<<arr[j];    cout<<endl;  }  return 0;}



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 善心汇会员被限制出行怎么办 苹果手机屏碎了怎么办 三国志2017仓库满了怎么办 至尊宝密保手机被改了怎么办 电脑版qq游戏途中死机怎么办 登陆企业qq服务器超时怎么办 qq登录不上怎么办错误00001 苹果手机白屏进不了界面怎么办 苹果8p手机白屏怎么办 苹果5s无法关机怎么办 三星手机白屏了怎么办 电脑能上qq打不开网页怎么办? 电脑打不开机怎么办黑屏 英雄杀连接不上怎么办 炫舞时登陆器卸下载失败怎么办 电视为什么会出现登录超时怎么办 登录app时提示请求超时怎么办 手机来短信断网怎么办 百度网络不给力怎么办 网络连接不给力怎么办 抖音网络不给力怎么办 玩lol老是掉线怎么办 无线网络连接有防火墙怎么办啊 千牛重新获取enc-k怎么办 为什么说不能获取对方信息怎么办 qq炫舞客户端被修改怎么办 win7玩穿越卡顿怎么办 玩dnf就蓝屏怎么办win7 平板玩fgo闪退怎么办 微信总是说空间不足怎么办 激活卡时遇到服务器错误怎么办 悦平台服务器错误是怎么办 手机银行提示登录服务器错误怎么办 qq漂流瓶封了怎么办 我的世界被冻结怎么办 qq里被屏蔽了怎么办 qq领手游礼包账号存在异常怎么办 笔记本电脑太卡怎么办最有效 华为平板电脑忘记开机密码怎么办 平板电脑忘记开机密码怎么办 平板电脑忘了开机密码怎么办