反序数:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
int a=0;
cin>>n;
while(n>0){
// a*=10;
// a+=(n%10); // %10可得最低位
a=(a*10) + (n%10);
n/=10; // /10可去掉最低位
}
cout<<a;
return 0;
}
10进制转x进制(x小于10)
思路:
-
(10进制转2进制)短除法:一直除以2,再反序输出,就是二进制。
-
核心:模2、除2、模2、除2...
-
将取模得到的1、0,存入数组中,最后将数组反序输出即可。
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
int x=0;
cin>>n;
int a[100],cnt=0;
while(n>0){ //将n诸位分解
x=n%2; //若转3进制,则模3,以此类推
a[cnt++]=x;
n=n/2; //若转3进制,则除3,以此类推
}
for(int i=cnt-1; i>=0; i--){
cout<<a[i];
}
return 0;
}
x大于10 / 10进制转x进制通用版
思路:
-
依然是模k、除k、模k、除k...,但是在上述代码中做一些改动。
-
存k进制的数组类型应从int型换成char型。数字变成字符需要加'0'。
-
反序输出。
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,k;
int x=0;
cin>>n>>k; // 输入10进制n 和 要转换的进制k
int cnt=0; // 数组下标
char a[100]; // 十进制以上有字符,所以用char存储
while(n>0){
x = n%k;
if(k<10) a[cnt++] = x+'0'; //数字变字符要+'0'
else a[cnt++] = (x-10) +'A'; //大于10的话要-10,对应10是A,11是B。。。若要小写则+'a'
n = n/k;
}
for(int i=cnt-1; i>=0; i--){
cout<<a[i];
}
return 0;
}
x进制转10进制(2进制转10进制)
思路 1011转10进制:从高位开始每位乘2的n-1次方,再相加,即为10进制数。
#include<bits/stdc++.h>
using namespace std;
int main(){
char s[100];
cin>>s; //输入二进制字符串
int ans=0;
int len=strlen(s); //计算字符串的长度
for(int i=0; i<len; i++){
// if(s[i]=='0') ans = ans*2;
// else ans = ans*2+1;
ans = ans*2 + (s[i]-'0'); //简化上两行
}
cout<<ans;
return 0;
}
x进制转10进制通用版
#include<bits/stdc++.h>
using namespace std;
int main(){
char s[100];
int x;
cin>>s>>x; //输入x进制字符串s和进制数x
int ans=0;
int len=strlen(s); //计算字符串的长度
for(int i=0; i<len; i++){
ans=ans*x;
if(s[i]>='0' && s[i]<='9') ans+=(s[i]-'0'); //将字符转化为数字是-'0'
else ans = ans+(s[i]-'A')+10; //字符为字母且大于9,A是10,所以-A,再加10,因为是转10进制
}
cout<<ans;
return 0;
}
x进制转y进制通用版
思路 x进制转10进制,10进制转y进制。(将以上代码结合)
#include<bits/stdc++.h>
using namespace std;
int main(){
char s[100];
int x,y;
cin>>s>>x>>y; //输入字符串s和代表的进制数x和转换的进制数y
// 先将字符串转换为10进制数
int ans=0; //存储10进制数
int len=strlen(s);
for(int i=0; i<len; i++){
ans*=x;
if(s[i]>='0' && s[i]<='9') ans+= (s[i]-'0');
else ans+= (s[i]-'A')+10;//转换为10进制,就+10
}
//cout<<ans<<endl; //输出10进制数(为了验证上半部分转换是否正确)
// 再将10进制数转换为y进制
char out[100];
int cnt=0;
while(ans>0){
int k=ans%y;
if(y<10) out[cnt++] = k+'0'; //数字变字符要+'0'
else out[cnt++] = (k-10)+'A'; //大于10的话要-10,对应10是A,11是B。。。若要小写则+'a'
ans/=y;
}
for(int i=cnt-1; i>=0; i--){
cout<<out[i]<<" ";
}
return 0;
}
小结
一些特别小、容易出错的点注意:
-
单个字符转数字的话是-'0'。 数字转字符是+'0'。
-
小写转大写是-'a'+'A'。
-
0-9的ASCII:48-57
-
A-Z的ASCII:65-90
-
a-z的ASCII:97-122
-
这类题目的核心:数位的拆解与合并。拆解:先取模然后除取整。合并:先乘后加。
-
其他稍微复杂的题都是这些代码的基础上进行小变动,万变不离其宗。核心代码要掌握!
开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 12 天,点击查看活动详情