bianchengjun520

开始很糊涂的以为要先转变成十进制再转成八进制,结果因为数量级过大,发现此路不通。但是转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


分类:

技术点:

相关文章: