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