十六进制转八进制算法

mac2024-10-06  59

两种解法:都需要中转一次

第一种:十六转十,十转八.

由于执行多次循环,当数据很大时,超时.

#include<iostream> #include<string> using namespace std; long long lc(int a,int n){ long long sum=1; for(int i=0;i<n;i++) sum=sum*a; return sum; } int main() { char hex[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; string s; int n; cin>>n; while(n--){ cin>>s;//BAC int len=s.size()-1; int j,k; long long sum=0; //16->10 for(j=len;j>=0;j--){ for(k=0;k<16;k++){ if(s[j]==hex[k]) { sum+=k*lc(16,len-j); } } } //10->8 int a[10]; int l=sum; int i=0; while(l){ a[i++]=l%8; l=l/8; } for(i=i-1;i>=0;i--) cout<<a[i]; cout<<endl; } return 0; }

第二种:十六转二,二转八. 

利用字符串解决显然具有巧妙性,枚举出并不多的情况.避免了不必要的循环的出现

#include<iostream> #include<cmath> #include<vector> #include<set> #include<cstring> #include<string> #include<algorithm> using namespace std; int main() { int n; string str1; string str; int k=0; int l=0; int num=0; int v; scanf("%d",&n); while(n--){ cin>>str1; str=""; for(int i=0;i<str1.length();i++){ switch(str1[i]){ case '0':str+="0000";break; case '1':str+="0001";break; case '2':str+="0010";break; case '3':str+="0011";break; case '4':str+="0100";break; case '5':str+="0101";break; case '6':str+="0110";break; case '7':str+="0111";break; case '8':str+="1000";break; case '9':str+="1001";break; case 'A':str+="1010";break; case 'B':str+="1011";break; case 'C':str+="1100";break; case 'D':str+="1101";break; case 'E':str+="1110";break; case 'F':str+="1111";break; } } if(str.length()%3==1){//3位补全 str = "00"+str; }else if(str.length()%3==2){ str = "0"+str; } int flag=0; int num = 0; for(int i=0;i<str.length();i+=3){ num = (str[i]-'0')*4+(str[i+1]-'0')*2+(str[i+2]-'0'); if(num){//防止全为0时出现前导零 flag=1; } if(flag){ printf("%d",num); } } printf("\n"); } return 0; }

 

最新回复(0)