十六进制数转八进制数

开始很糊涂的以为要先转变成十进制再转成八进制,结果因为数量级过大,发现此路不通。但是转2进制没有灵感,于是看了别人的代码。

#include <iostream>
#include <string>
using namespace std;
int arr[10000001];

int main()
{
  int n,len_str,i,j;
  string str,str2;
  cin>>n;
  while(n--)
  {
    cin>>str;
    len_str=str.length();
    str2="";

    // 十六进制转换为二进制
    for(i=0;i<len_str;++i)
    {
      switch(str[i])
      {
      case '0':str2+="0000";break;
      case '1':str2+="0001";break;
      case '2':str2+="0010";break;
      case '3':str2+="0011";break;
      case '4':str2+="0100";break;
      case '5':str2+="0101";break;
      case '6':str2+="0110";break;
      case '7':str2+="0111";break;
      case '8':str2+="1000";break;
      case '9':str2+="1001";break;
      case 'A':str2+="1010";break;
      case 'B':str2+="1011";break;
      case 'C':str2+="1100";break;
      case 'D':str2+="1101";break;
      case 'E':str2+="1110";break;
      case 'F':str2+="1111";break;
      default:break;
      }
    }
    
    // 修正位数
    if(len_str%3==1)	str2="00"+str2;
    
    else if(len_str%3==2)	str2="0"+str2;

    
    len_str=str2.length();
    // 二进制转换八进制
    j=0;
    for(i=0;i<=len_str-2;i+=3)
    {
      arr[j]=(str2[i]-'0')*4+(str2[i+1]-'0')*2+(str2[i+2]-'0');
      ++j;
    }

    for(i=0;i<j;++i)
    {
      if(i==0 && arr[i]==0)	continue;
      cout<<arr[i];
    }
    cout<<endl;

  }
  return 0;
}
敲完后提交ac,然后我想用c语言再敲一遍

#include <stdio.h>
#include <string.h>
int ans[10000001];
char arr[10000001];
char arr2[10000001];
char arrr[10000001];
int main()
{
int n,i,j,len;
scanf("%d",&n);
while(n--)
{

memset(arr2,'\0',sizeof(arr2));
scanf("%s",arr);
len=strlen(arr);
for(i=0;i<len;i++)
{
switch(arr[i])
{
case '0':strcat(arr2,"0000");break;
case '1':strcat(arr2,"0001");break;
case '2':strcat(arr2,"0010");break;
case '3':strcat(arr2,"0011");break;
case '4':strcat(arr2,"0100");break;
case '5':strcat(arr2,"0101");break;
case '6':strcat(arr2,"0110");break;
case '7':strcat(arr2,"0111");break;
case '8':strcat(arr2,"1000");break;
case '9':strcat(arr2,"1001");break;
case 'A':strcat(arr2,"1010");break;
case 'B':strcat(arr2,"1011");break;
case 'C':strcat(arr2,"1100");break;
case 'D':strcat(arr2,"1101");break;
case 'E':strcat(arr2,"1110");break;
case 'F':strcat(arr2,"1111");break;
default:break;
}
}
//puts(arr2);
strcpy(arrr,arr2);
//puts(arrr);
if(len%3==1)
{
strcpy(arr2,"00");
strcat(arr2,arrr);
}
else if(len%3==2) 
{
strcpy(arr2,"0");
strcat(arr2,arrr);

}
else
strcpy(arr2,arrr);
//puts(arr2);
len=strlen(arr2);
j=0;
for( i=0;i<len-2;i+=3)
{
ans[j]=((arr2[i]-'0')*4+(arr2[i+1]-'0')*2+(arr2[i+2]-'0'));
++j;
}
for(i=0;i<j;i++)
{
if(i==0&&ans[i]==0) continue;
printf("%d",ans[i]);
}
printf("\n");

}
return 0;
}

可是这个代码竟然超时了!! 和c++版本的一样的思路啊!?

后来 我觉得肯定是c语言的哪个函数太慢,

于是我尝试了百度 “strcat很慢吗”,结果一下找到了答案。

引用http://blog.csdn.net/gantleman/article/details/5643874

我想比较下string比strcat慢多少,因为一个动态分配内存一个是静态分配。

结果大跌眼镜string比strcat还要快而且快的不是一个量级。


 using namespace std;
 char t[100001]={0};
 int tim = GetTickCount();
 for (int i = 0; i< 10000;i ++)
 {
  strcat(t, "11111");
 }
 printf("strcat:%d/r/n", GetTickCount() - tim);


 string str;
 tim = GetTickCount();
 for (int i = 0; i< 10000;i ++)
 {
  str += "11111";
 }
 printf("string:%d/r/n", GetTickCount() - tim);


 getc(stdin);

strcat:94
string:0


posted @ 2015-03-02 11:11  编程菌  阅读(387)  评论(0编辑  收藏  举报