进制转换题型总结

01:数制转换

01:数制转换

思路:

以十进制为跳板,实现低位数(转换成十进制后数据在long long以内)的进制转换

代码:

//a->b进制模板(0<a,b<=16)
#include<bits/stdc++.h>
using namespace std;
int a,b,num_10=0;
char str[40],ans[40];
int main(){
    memset(ans,0,sizeof(ans));
    scanf("%d%s%d",&a,str,&b);
    //a进制转换为10进制(累乘,然后叠加)
    for(int x,c=1,i=strlen(str)-1 ; i>=0 ; i--,c*=a){
        if(str[i]>='0'&&str[i]<='9') x=str[i]-'0';
        else if(str[i]>='a'&&str[i]<='z') x=10+str[i]-'a';
        else if(str[i]>='A'&&str[i]<='Z') x=10+str[i]-'A';
        num_10+=x*c;
    }
    //10进制转换为b进制(取余,然后累除)
    int size=0;
    while (num_10!=0){
        int x=num_10%b;
        ans[size++]= x<10? x+'0': x-10+'A';
        num_10/=b;
    }
    if(!size)
        printf("0");
    else
        for(int i=size-1;i>=0;i--)printf("%c",ans[i]);//用%c
}

个例:10进制转为2进制

#include<iostream>
using namespace std;
int main(){
    int n,i,j=0;
    int a[1000];
    cin>>n;
    i=n;//保存n 
    while(i){
        a[j++]=i%2;
        i>>=1;
    }
    for(i=j-1;i>=0;i--)cout<<a[i];
    cout<<endl;
}

个别大位数进制转换

问题描述:

给定n个十六进制正整数,输出它们对应的八进制数。

输入格式

输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A-F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。

输出格式

输出n行,每行为输入对应的八进制正整数。

【注意】

输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。

样例输入

2
39
123ABC

样例输出

71
4435274

思路:

以二进制做跳板,完成转换,注意二进制串前面补0,确保二进制串的长度为3的倍数,最后输出的时候忽略前导0即可

代码:

#include<bits/stdc++.h>
using namespace std;
int n;
map<char,string> mp;
void init(){
    cin>>n;
    mp['0']="0000";mp['1']="0001";mp['2']="0010";mp['3']="0011";mp['4']="0100";
    mp['5']="0101";mp['6']="0110";mp['7']="0111";mp['8']="1000";mp['9']="1001";
    mp['A']="1010";mp['B']="1011";mp['C']="1100";mp['D']="1101";mp['E']="1110";mp['F']="1111";
} 
int main()
{
    init(); 
    for(int k=1;k<=n;k++)
    {
        string s1,s2="";
        cin>>s1;
        for(int i=0,len=s1.length();i<len;i++) s2+=mp[s1[i]];       
        if(s2.length()%3==1)s2="00"+s2;else if(s2.length()%3==2)s2="0"+s2;//注意 
        for(int i=0,flag=0,len=s2.length() ;i<=len-3;i+=3)
        {
            int num=4*(s2[i]-'0')+2*(s2[i+1]-'0')+(s2[i+2]-'0');
            if(num)flag=1;//注意 
            if(flag)cout<<num;
        }
        cout<<endl;
    }
    return 0;
}

D进制的A+B

1022 D进制的A+B (20 分)

#include<stdio.h>
#define ll long long
#define f(i,a,b)  for(int i = a; i < b; ++i)
#define ios ios::sync_with_stdio(false);cin.tie(0); cout.tie(0);
int a,b,c,sum;
int s[35],cnt;
int main(){
    scanf("%d%d%d",&a,&b,&c);
    sum=a+b;
    do{
        int x=sum%c;
        s[cnt++]=x;
        sum/=c;
    }while(sum);
    for(int i=cnt-1;i>=0;i--){
        printf("%d", s[i]);
    }
    return 0;
}

补充几道水题开开心~

在霍格沃茨找零钱

1037 在霍格沃茨找零钱 (20 分)

题目给的数据long long能开下

#include<iostream>
#define ll long long 
using namespace std;
int main(){
    ll a,b,c,d,e,f;
    scanf("%lld.%lld.%lld %lld.%lld.%lld",&a,&b,&c,&d,&e,&f);
    ll count=d*17*29+e*29+f-a*17*29-b*29-c;
    if(count<0){
        cout<<"-";
        count=-count;
    }
    cout<<count/29/17<<"."<<count/29%17<<"."<<count%29;
    return 0;
}

但是数据大于long long但是小于一定范围的时候该怎么办?于是有了下面的代码

#include <iostream>
using namespace std;
int main() {
    int a, b ,c, m, n, t, x, y, z;
    scanf("%d.%d.%d %d.%d.%d",&a, &b, &c, &m, &n, &t);
    if (a > m || (a == m && b > n) || (a == m && b == n && c > t)) {
        swap(a, m); swap(b, n); swap(c, t);
        printf("-");        
    }
    z = t < c ? t - c + 29 : t - c;
    n = t < c ? n - 1 : n;
    y = n < b ? n - b + 17 : n - b;
    x = n < b ? m - a - 1 : m - a;
    printf("%d.%d.%d", x, y, z);
    return 0;
}

General Palindromic Number

1019 General Palindromic Number (20 分)

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
bool Judge(int z[], int num) {
    for(int i = 0; i <= num / 2; i++) {
        if(z[i] != z[num - i - 1]) {
            return false;
        }
    }
    return true;
}
int main() {
    int n, b, z[40], num = 0;
    scanf("%d %d", &n, &b);
    do {
        z[num++] = n % b;
        n /= b;
    }while(n != 0);
    bool flag = Judge(z, num);
    if(flag) 
        printf("Yes\n");
    else 
        printf("No\n");
    for(int i = num - 1; i >= 0; i--) {
        printf("%d", z[i]);
        if(i != 0) {
            printf(" ");
        }
    }
    return 0;
}

Colors in Mars

1027 Colors in Mars (20 分)

#include<stdio.h>
char r[]="0123456789ABC";
int main(){
    int i,n[3];
    for(i=0;i<3;i++) scanf("%d",&n[i]);
    printf("#");
    for(i=0;i<3;i++){
        if(n[i]<13) printf("0%c",r[ n[i] ]);
        else {
            printf("%c%c",r[ n[i]/13 ],r[ n[i]%13 ]);
        }
    }
}

A+B in Hogwarts

1058 A+B in Hogwarts (20 分)

#include<stdio.h>
#define ll long long
int main(){	
    int G = 17*29;
    int S = 29;
    ll g1, s1, k1, g2, s2, k2;
    scanf("%lld.%lld.%lld %lld.%lld.%lld",&g1, &s1, &k1, &g2, &s2, &k2);
    ll ans = g1*G+s1*S+k1 + g2*G+s2*S+k2;
    printf("%lld.%lld.%lld",ans/G , ans%G/S , ans%S);
    return 0;
}

1010 Radix

1010 Radix (25 分)

24分代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;

ll con(string s,ll k){
    ll res=0;
    ll t=1;
    for(auto i=s.rbegin();i!=s.rend();i++){
        int p= isdigit(*i)?*i-'0':*i-'a'+10;
        res+=p*t;
        t*=k;
    }
    return res;
}

ll find(string s,ll num){
    char mx= *max_element(s.begin(),s.end());
    ll l= mx<='9'?mx-'0':mx-'a'+10;
    ll r=max(l,num);
    while(l<r){
        ll m=(l+r)>>1;
        ll temp=con(s,m);
        if(temp>=num || temp<0)r=m;
        else l=m+1;
    }
    if(con(s,l)==num)return l;
    else return -1;
}

int main(){
    string s1,s2;
    ll tag,radix;
    cin>>s1>>s2>>tag>>radix;
    ll res= tag==1?find(s2,con(s1,radix)):find(s1,con(s2,radix));
    if(res==-1)cout<<"Impossible";
    else cout<<res<<endl;
}

25分代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;

ll con(string s,ll k){
    ll res=0;
    ll t=1;
    for(auto i=s.rbegin();i!=s.rend();i++){
        int p= isdigit(*i)?*i-'0':*i-'a'+10;
        res+=p*t;
        t*=k;
    }
    return res;
}

ll find(string s,ll num){
    char mx= *max_element(s.begin(),s.end());
    ll l= mx<='9'?mx-'0':mx-'a'+10;
    ll r=max(l,num)+1;
    while(l<r){
        ll m=(l+r+1)>>1;
        ll temp=con(s,m);
        if(temp>num || temp<0)r=m-1;
        else l=m;
    }
    if(con(s,l)==num)return l;
    else return -1;
}

int main(){
    string s1,s2;
    ll tag,radix;
    cin>>s1>>s2>>tag>>radix;
    ll res= tag==1?find(s2,con(s1,radix)):find(s1,con(s2,radix));
    if(res==-1)cout<<"Impossible";
    else cout<<res<<endl;
}

总结:

要注意二分姿势,还有,要写成ll r=max(l,num)+1;,不然还是24分

就是最后还有一个+1,做到细致认真才可以

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值