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