进制转换相关习题

小丽找半个回文数

小丽同学在编程中学到了回文数的概念,如果一个数正过来读和反过来读是同一个数,那么这个数就是回文数;比如:2、5、8、66、121、686、12321都是回文数,小丽发现,这样的数不算多。于是小丽有个想法,如果这个数不是回文数,但这个数在2进制或者16进制下是回文数,就算这个整数是半个回文数,比如417并不是回文,但417对应的16进制数是1A1是回文数,因此417算半个回文数。
请你编程帮助小丽找符合条件的半个回文数。

第一行是一个整数n(10<=n<=100)
第二行是n个整数(这些整数都是0~999999999之间的整数)

所有符合条件的半个回文数,每行一个。

样例输入
5
121 417 27 100 21
样例输出
417
27
21
代码:
#include<bits/stdc++.h>
using namespace std;
string p(int a,int b)
{
    string s;
    int c=0;
    while(a)
    {
        if(a%b<10)s=char(a%b+'0')+s;
        else s=char(a%b-10+'A')+s;
        a/=b;
    }
    return s;
}
int n,x;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
    {
    	cin>>x;
    	string s1=p(x,2),s2=p(x,16);
    	int w=0,s=0;
    	for(int i=0,j=s1.size()-1;i<=j;i++,j--)
    		if(s1[i]!=s1[j])w=1;
    	for(int i=0,j=s2.size()-1;i<=j;i++,j--)
    		if(s2[i]!=s2[j])s=1;
    	if(w==0||s==0)cout<<x<<endl;
    }
    return 0;
}
 小丽找潜在的素数

小丽同学在编程中学到了二进制数的概念,她发现,有些二进制数,如果转为10进制,就是素数,小丽把这些数称为潜在的素数;比如2进制1101011,转为10进制后为107,就是素数。请编程帮小丽找出,哪些二进制数转为10进制后,是素数,计算出这样的数有多少个?

第一行是一个整数n(10<=n<=100)
接下来n行,每行是一个30位以内的2进制数

一个整数代表所有转为10进制后是素数的2进制数的个数

样例输入
6
1010000
1011
1101001
10111
111
1101011
样例输出
4
代码:
#include<bits/stdc++.h>
using namespace std;
string p(int a,int b)
{
    string s;
    int c=0;
    while(a)
    {
        if(a%b<10)s=char(a%b+'0')+s;
        else s=char(a%b-10+'A')+s;
        a/=b;
    }
    return s;
}
int zs(int x)
{
    for(int i=2;i*i<=x;i++)
        if(x%i==0)return 0;
    return 1;
}
int n,sum;
string x;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>x;
        int s=0;
        for(int j=0;j<x.size();j++)
            s=s*2+int(x[j]-'0');
        if(zs(s)==1)sum++;
    }
    cout<<sum;
    return 0;
}
10进制转D进制

十进制整数N和其他D(D的值为2、8、16)进制数的转换是计算机实现计算的基本问题,其解决方法很多,其中一个简单算法基于下列原理:N = (N div d)×d + N mod d (其中:div 为整除运算,mod 为求余运算)。简单来说,就是除D取余,然后倒过来得到D进制的数。
例如:
(1348)10 = (10101000100)2
(1348)10 = (2504)8
(1000)10 = (3E8)16
(请注意:转16进制时,用A代表余数10,B代表余数11……)
假设现要编制一个满足下列要求的程序:对于输入的任意一个非负十进制整数(n<=1,000,000,000),打印输出与其等值的D进制数。

有两个整数N和D,N表示要转换的十进制非负整数,D代表要转换的进制(2、8或16)

N进制转D进制的结果

样例输入
1348 2
样例输出
10101000100
代码:

 

#include<bits/stdc++.h>
using namespace std;
long long n,d;
string s;
int main()
{
	cin>>n>>d;
	if(n==0) s+='0';
    while(n){
        if(n%d>=10)s=char(n%d+'A'-10)+s;
        else s=char(n%d+'0')+s;
        n/=d;
    }
    cout<<s;
    return 0;
}
小X转进制

小X喜欢研究进制转换。
在了解了进制转换的一般流程后,小X突然想起了以前学过的回文数(正着读倒着读都一样的数),于是开始思考一个奇怪的问题:1到N 中有多少个整数的平方在M进制下是回文数呢? 
小X随手列了几个:
2的平方4,10进制表示为4,是回文数;
3的平方9,2进制表示为 1001,是回文数;
9046的平方81830116,16进制表示为4E0A0E4,是回文数。
小X觉得要全列出来太难了,希望你帮帮他。

第一行包含用一个空格隔开的两个整数N,M。

第一行包含一个整数,表示满足要求的整数个数。

样例输入
2 10
样例输出
2
提示

数据范围
对于30%的数据,M=10。
对于另外30%的数据,M=2。
对于 100%的数据,1≤N≤10000,2≤M≤16。

代码:
#include<bits/stdc++.h>
using namespace std;
int ff(string n){
    for(int i=0,j=n.size()-1;i<=j;i++,j--){
        if(n[i]!=n[j])return 0;
    }
    return 1;
}
string x;
long long n,d,sum;
int main()
{
	cin>>n>>d;
	for(int j=1;j<=n;j++){
	    x="";
	    for(long long i=j*j;i>0;i/=d)
        {
        	if(i%d<=9)x=char(i%d+'0')+x;
        	else x=char(i%d-10+'A')+x;
	    }
	    if(ff(x))sum++;
	}
	cout<<sum;
    return 0;
}
 A变B

给定两个正整数A,B(十进制)(0<A,B<2^63),当A,B用二进制数表示的时候,问把A变成B至少需要改变多少位?
例如:A=3,B=6,则A,B对应的二进制数分别是011,110,显然,把A变成B至少需要改变两位。(这里的改变了多少位,指的是A和B转2进制后右对齐看有多少位不相同)

输入两个正整数A,B,以空格隔开。

输出把A变成B至少需要改变多少位。

样例输入
9 12
样例输出
2
代码:
 
#include<bits/stdc++.h>
using namespace std;
long long n,d=2,sum,m;
string s,x,k;
int main(){
    cin>>n>>m;
    if(n==0)s='0';
    if(m==0)x='0';
	while(n)
    {
    	if(n%d<10)s=char(n%d+'0')+s;
    	else s=char(n%d-10+'A')+s;
    	n/=d;
    }
    while(m)
    {
    	if(m%d<10)x=char(m%d+'0')+x;
    	else x=char(m%d-10+'A')+x;
    	m/=d;
    }
    if(x.size()<s.size()){
    	for(int i=0;i<s.size()-x.size();i++)
    		k+='0';
    	k+=x;
    	for(int i=0;i<k.size();i++)
    		if(k[i]!=s[i])sum++;
    }
    if(x.size()>=s.size()){
    	for(int i=0;i<x.size()-s.size();i++)
    		k+='0';
    	k+=s;
    	for(int i=0;i<x.size();i++)
    		if(x[i]!=k[i])sum++;
    }
    cout<<sum;
    return 0;
}

  • 25
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值