小丽找半个回文数
小丽同学在编程中学到了回文数的概念,如果一个数正过来读和反过来读是同一个数,那么这个数就是回文数;比如: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;
}