进制转换

进制转换的方法

十进制转其他进制认准短除法:用要转换的数和转换的进制不断求余,存入数组,再倒叙输出。

其他进制转十进制:从右向左,第一个数乘20(即1),第二个数乘21,以此类推。

T1:进制转换

题目描述
输入一个十进制下的正整数 N 和 R,输出这个整数N对应的R进制数。
输入
一行,包含两个正整数N和R。(N<=1e9,2<=R<=16)
输出
一行,表示将整数N转换为R的结果。
输入样例 复制
【输入样例1】
10 2

【输入样例2】
90 16
输出样例 复制
【输出样例1】
1010

【输出样例2】
5A

思路

其实2很简单,用短除法就可以轻松解决。

代码

#include<bits/stdc++.h>
using namespace std;
long long m,n,x[10000000],z=1;
char a[26]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
int main()
{
    cin>>m>>n;
    while(1)
    {       
        x[z]=m%n;
        m=m/n;
        if(m==0) break;
        z++;
    }
    for(int i=z;i>=1;i--)
    {
        if(x[i]>=10) cout<<a[x[i]-10];
        else cout<<x[i];
    }
    return 0;
}

T2:斜二进制数

题目描述
当一个数字是十进制数,每项的基数表现为10的K次方。 (数字是有限的,从右边到左边,在最末的数字是10的0次方)。 举例来说,
81307(10) = 8 * 10^4 + 1 * 10 ^3 + 3 * 10^2 + 0 * 10^1 + 7 * 10^0
= 80000 + 1000 + 300 + 0 + 7
= 81307

当一个数字是二进制数, 每项的基数表现为2的k次方。 举例来说,
10011(2) = 1 * 2^4 + 0 * 2^3 + 0 * 2^2 + 1 * 2^1 + 1 * 2^0
= 16 + 0 + 0 + 2 + 1
= 19

在斜二进制中,每项的基数表现 2的(k+1)次方减1。举例来说,
10120(skew) = 1 * (2^5-1) + 0 * (2^4-1) + 1 * (2^3-1) + 2 * (2^2-1) + 0 * (2^1-1)
= 31 + 0 + 7 + 6 + 0
= 44

例如:最初 10个数字在斜的二进制中是 0,1,2,10,11,12,20,100,101 和 102 。

输入
包括一行数据,一个斜二进制整数(不超过30位)。
输出
输出斜二进制数字的十进制值,要是超过2147483647,则输出“too long!”
输入样例 复制
【输入样例1】
11

【输入样例2】
10120
输出样例 复制
【输出样例1】
4

【输出样例2】
44

思路

用我们的方法做也很轻松,就是会爆,没办法,只能用高精:)。

代码

#include<bits/stdc++.h>
using namespace std;
long long ans,a[41];
string n;
int main()
{
    cin>>n;
    for(int i=0;i<n.size();i++)
    {
        a[n.size()-i]=n[i]-48;
    }
    for(int i=1;i<=n.size();i++)
    {
        ans+=a[i]%10*(pow(2,i)-1);
    }
    if(ans>2147483647) cout<<"too long!";
    else cout<<ans;
    return 0;
}

T2:特别的十进制数

题目描述
特别的十进制数是指具有如下特征的数:它的各位数字之和等于该数的16进制表示的各位数字之和,并且还等于该数的12进制表示的各位数字之和。

例如,2991的各位数字之和为 2+9+9+1=21,它的12进制表示是1893,各位数字之和也是21。但是2991的16进制表示是BAF,并且11+10+15=36,所以2991不具备指定的特征。

又如,2992在全部三种表示法中各位数字之和都是22,所以2992具备指定的特征。故2992是一个特别的十 进制数。
输入
只有一个长度不超过9位的十进制正整数。
输出
第一行为输入的十进制数所对应的十六进制数各位数字之和,第二行为分"Yes"(具备特征)或"No"(不具备特征)。
输入样例 复制
【输入样例1】
3

【输入样例2】
112

思路

这道题也就麻烦了一点,硬打就行。

代码

#include<bits/stdc++.h>
using namespace std;
long long a,b,c,n;
int main()
{
    cin>>n;
    int g=n;
    while(g!=0)
    {
        a+=g%10;
        giao/=10;
    }
    int m=n;
    while(1)
    {       
        b+=m%16;
        m=m/16;
        if(m==0) break;
    }
    if(a!=b)
    {
        cout<<b<<endl<<"No";
        return 0;
    }
    m=n;
    while(1)
    {       
        c+=m%12;
        m=m/12;
        if(m==0) break;
    }
    if(a==c) cout<<b<<endl<<"Yes";
    else cout<<b<<endl<<"No";
    return 0;
}

T3:进制回文数

题目描述
我们说一个数字 X 如果从左到右和从右到左是一样得就是回文数。例如75457就是一个回文数。当然,这性质还依赖它的进制。17在十进制下不是回文数,不过在二进制下就是回文数了(10001) 。现在就是要判断一个数在2到16进制下是否为回文数。

输入
输入数据由多个整数构成。每个给出的数字 0 < n < 50000各占一行,并且都是以十进制形式给出。输入以零为结束。
输出
你的程序要输出令所给数 X 是回文数的进制。如果这个数在2到16进制里都不是回文数,你的程序就要输出这个数不是回文数的信息。
输入样例 复制
17
19
0
输出样例 复制
Number 17 is palindrom in basis 2 4 16
Number 19 is not a palindrom

思路

要说麻烦这道题才是真麻烦,硬敲是真的累,纯模拟。

代码

#include<bits/stdc++.h>
using namespace std;
long long n,a[17],x[20],z=1;
int main()
{
    while(1)
    {
        cin>>n;
        if(n==0) break;
        bool f=false;
        memset(a,0,sizeof(a));
        for(int i=2;i<=16;i++)
        {
            memset(x,0,sizeof(x));
            z=1;
            int m=n;
            while(1)
            {       
                x[z]=m%i;
                m=m/i;
                if(m==0) break;
                z++;
            }
            int g=1,y=z;
            bool f1=false;
            while(g<y)
            {
                if(x[g]!=x[y])
                {
                    f1=true;
                    break;
                }
                g++;
                y--;
            }
            if(f1==false)
            {
                a[i]=1;
                f=true;
            }
        }
        if(f==true)
        {
            cout<<"Number "<<n<<" is palindrom in basis ";
            for(int i=1;i<=16;i++)
            {
                if(a[i]==1) cout<<i<<" ";
            }
            cout<<endl;
        }
        else cout<<"Number "<<n<<" is not a palindrom"<<endl;
    }
    return 0;
}

T4:贝贝的波浪数

题目描述
贝贝从小就对数字感兴趣,喜欢研究数字的规律。一天,他发现有些数据是很有特点的,比如像1212121这样在一对数之间交替转换的数,他称之为波浪数。

   刚好贝贝学会了进制转换,如果某个数在两种进制下都是波浪数就叫双重波浪数,比如十进制数191919是一个十进制下的波浪数,将其转换为对应的十一进制数121212也是一个波浪数,所以十进制数191919是一个双重波浪数。

类似的可以定义三重波浪数,三重波浪数在三种不同的进制中都是波浪数。甚至还有四重波浪数,如十进制数300=606(七进制)=363(九进制)=454(八进制)=1A1(十三进制)…,你的任务就是在2秒内在指定范围内找出双重、三重、四重波浪数。
输入
一行,包含五个用空格隔开的十进制整数,前两个数表示进制的范围(232),第三与第四个数表示指定的范围(110000000),第五个数位2,3,4中的一个,表示要找的波浪数的重数。
输出
从小到大,以十进制形式输出指定范围内的指定重数的波浪数,一行输出一个数。
输入样例 复制
10 11 190000 960000 2
输出样例 复制
191919

思路

这道题的思路既难想到又难理解,中心就是创造波浪数,其余解释在代码中呈现。

代码

#include<bits/stdc++.h>
using namespace std;
long long a,b,c,x,y,p,q,m[10000000];
int main() 
{
    cin>>a>>b>>x>>y>>c;
    for(int i=a;i<=b;i++)//枚举进制
    {
        for(int j=1;j<i;j++)//枚举奇数位的数
        {
            for(int k=0;k<i;k++)//枚举偶数位的数
            {
                if(k==j) continue;//重复的数如11不是波浪数
                p=0,q=0;
                while(p<=y)//构建波浪数
                {
                    if(q%2==0) p=p*i+k;//难点:构建的同时转换
                    else p=p*i+j;
                    q++;
                    if(p>=x&&p<=y) m[p]++;//存重数
                }
            }
        }
    }
    for(int i=x;i<=y;i++)
    {
        if(m[i]==c) cout<<i<<endl;//判断并输出
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值