進制轉換--循環&&字符

八進制轉換成十六進制:
先將八進制轉換爲二進制。一個八進制位對應三個二進制位,再將二進制轉換爲十六進制,四個二進制位對應一個十六進制位。
代碼如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char strD[100000+11];       
int strB[400000+11];            
char strH[300000+11];           
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s",strH);
        int len1=strlen(strH);
        if(len1==1&&strH[0]=='0')
        {
            printf("0\n");
            continue;
        }
        int j;
        int ans=0;
        for(int i=len1-1;i>=0;i--)
        {
            int flag=strH[i]-'0';
            j=3;
            while(j--)
            {
                strB[ans++]=flag%2;
                flag>>=1;
            }
        }
        //int k=ans;
        ans=ans+4-ans%4;
        ans--;
        while(strB[ans]*8+strB[ans-1]*4+strB[ans-2]*2+strB[ans-3]==0)
            ans-=4;
        for(int i=ans;i>=0;i-=4)
        {
            int sum=strB[i]*8+strB[i-1]*4+strB[i-2]*2+strB[i-3];
            if(sum<=9)
                printf("%d",sum);
            else
            {
                char ch=sum-10+'A';
                printf("%c",ch);
            }
        }
        printf("\n");
    }
    return 0;
 } 

十進制轉換成十六進制,依次除以16,取餘數,先得到的餘數最後輸出,用棧的數據結構。
代碼如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
typedef unsigned long long ULL;
using namespace std;
int main()
{
    ULL n;
    stack<char> sta;
    char ch;
    while(~scanf("%ulld",&n))
    {
        if(n==0)
        {
            printf("0\n");
            continue;
         } 
        while(n)
        {
            int flag=n%16;
            if(flag<=9)
                ch=flag+'0';
            else
                ch=flag-10+'A';
            sta.push(ch); 
            n/=16;
        }
        while(!sta.empty() )
        {
            char ans=sta.top() ;
            printf("%c",ans);
            sta.pop() ;
        }
        printf("\n");
    }
    return 0;
}

十六進制轉換成十進制,按位乘以16的n次冪。
代碼如下:

#include<cstdio>            //按位乘以權值 
#include<cstring>
#include<algorithm>
using namespace std;
char strD[10000000+11];
int main()
{
    while(~scanf("%s",strD))
    {
        int len1=strlen(strD);
        int flag;
        long long sum=0,k=1; 
        for(int i=len1-1;i>=0;i--)
        {
            if(strD[i]>='0'&&strD[i]<='9')
                flag=strD[i]-'0';
            else
                flag=strD[i]-'A'+10;
            sum+=flag*k;
            k*=16;
        }
        printf("%lld\n",sum);
    }
    return 0;
}

十六進制轉換成二進制,倒序轉換,連除四次,取餘。
代碼如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char strD[100000+11];
int strB[400000+11];
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s",strD);
        int len1 = strlen(strD);
        if(len1 == 1 && strD[0] == '0'){
            printf("0\n");
            continue;
        }
        int sign = 1;
        int flag;
        for(int i = len1-1 ;i>=0;i--){
            if(strD[i]<='9') flag = strD[i]-'0';
            else flag = strD[i]-'A'+ 10;
            strB[sign++] = (flag%2);
            flag>>=1;
            strB[sign++] = (flag%2);
            flag>>=1;
            strB[sign++] = (flag%2);
            flag>>=1;
            strB[sign++] = (flag%2);
            flag>>=1;
        }
        sign--;
        sign = 3-sign%3+sign;
        while(strB[sign]*4+strB[sign-1]*2+strB[sign-2] == 0) sign-=3;
        for(int i = sign;i>0;i-=3){
            printf("%d",strB[i]*4+strB[i-1]*2+strB[i-2]);
        }
        printf("\n");
    }
    return 0;
}
發佈了88 篇原創文章 · 獲贊 18 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章