进制转换的方法
十进制转其他进制认准短除法:用要转换的数和转换的进制不断求余,存入数组,再倒叙输出。
其他进制转十进制:从右向左,第一个数乘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;//判断并输出
}
}