目录
-
- 01:数制转换
- 个别大位数进制转换
- D进制的A+B
- 在霍格沃茨找零钱
- General Palindromic Number
- Colors in Mars
- A+B in Hogwarts
01:数制转换
01:数制转换
思路:
以十进制为跳板,实现低位数(转换成十进制后数据在long long以内)的进制转换
代码:
//a->b进制模板(0<a,b<=16)
#include<bits/stdc++.h>
using namespace std;
int a,b,num_10=0;
char str[40],ans[40];
int main(){
memset(ans,0,sizeof(ans));
scanf("%d%s%d",&a,str,&b);
//a进制转换为10进制(累乘,然后叠加)
for(int x,c=1,i=strlen(str)-1 ; i>=0 ; i--,c*=a){
if(str[i]>='0'&&str[i]<='9') x=str[i]-'0';
else if(str[i]>='a'&&str[i]<='z') x=10+str[i]-'a';
else if(str[i]>='A'&&str[i]<='Z') x=10+str[i]-'A';
num_10+=x*c;
}
//10进制转换为b进制(取余,然后累除)
int size=0;
while (num_10!=0){
int x=num_10%b;
ans[size++]= x<10? x+'0': x-10+'A';
num_10/=b;
}
if(!size)
printf("0");
else
for(int i=size-1;i>=0;i--)printf("%c",ans[i]);//用%c
}
个例:10进制转为2进制
#include<iostream>
using namespace std;
int main(){
int n,i,j=0;
int a[1000];
cin>>n;
i=n;//保存n
while(i){
a[j++]=i%2;
i>>=1;
}
for(i=j-1;i>=0;i--)cout<<a[i];
cout<<endl;
}
个别大位数进制转换
问题描述:
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A-F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
思路:
以二进制做跳板,完成转换,注意二进制串前面补0,确保二进制串的长度为3的倍数,最后输出的时候忽略前导0即可
代码:
#include<bits/stdc++.h>
using namespace std;
int n;
map<char,string> mp;
void init(){
cin>>n;
mp['0']="0000";mp['1']="0001";mp['2']="0010";mp['3']="0011";mp['4']="0100";
mp['5']="0101";mp['6']="0110";mp['7']="0111";mp['8']="1000";mp['9']="1001";
mp['A']="1010";mp['B']="1011";mp['C']="1100";mp['D']="1101";mp['E']="1110";mp['F']="1111";
}
int main()
{
init();
for(int k=1;k<=n;k++)
{
string s1,s2="";
cin>>s1;
for(int i=0,len=s1.length();i<len;i++) s2+=mp[s1[i]];
if(s2.length()%3==1)s2="00"+s2;else if(s2.length()%3==2)s2="0"+s2;//注意
for(int i=0,flag=0,len=s2.length() ;i<=len-3;i+=3)
{
int num=4*(s2[i]-'0')+2*(s2[i+1]-'0')+(s2[i+2]-'0');
if(num)flag=1;//注意
if(flag)cout<<num;
}
cout<<endl;
}
return 0;
}
D进制的A+B
1022 D进制的A+B (20 分)
#include<stdio.h>
#define ll long long
#define f(i,a,b) for(int i = a; i < b; ++i)
#define ios ios::sync_with_stdio(false);cin.tie(0); cout.tie(0);
int a,b,c,sum;
int s[35],cnt;
int main(){
scanf("%d%d%d",&a,&b,&c);
sum=a+b;
do{
int x=sum%c;
s[cnt++]=x;
sum/=c;
}while(sum);
for(int i=cnt-1;i>=0;i--){
printf("%d", s[i]);
}
return 0;
}
补充几道水题开开心~
在霍格沃茨找零钱
1037 在霍格沃茨找零钱 (20 分)
题目给的数据long long能开下
#include<iostream>
#define ll long long
using namespace std;
int main(){
ll a,b,c,d,e,f;
scanf("%lld.%lld.%lld %lld.%lld.%lld",&a,&b,&c,&d,&e,&f);
ll count=d*17*29+e*29+f-a*17*29-b*29-c;
if(count<0){
cout<<"-";
count=-count;
}
cout<<count/29/17<<"."<<count/29%17<<"."<<count%29;
return 0;
}
但是数据大于long long但是小于一定范围的时候该怎么办?于是有了下面的代码
#include <iostream>
using namespace std;
int main() {
int a, b ,c, m, n, t, x, y, z;
scanf("%d.%d.%d %d.%d.%d",&a, &b, &c, &m, &n, &t);
if (a > m || (a == m && b > n) || (a == m && b == n && c > t)) {
swap(a, m); swap(b, n); swap(c, t);
printf("-");
}
z = t < c ? t - c + 29 : t - c;
n = t < c ? n - 1 : n;
y = n < b ? n - b + 17 : n - b;
x = n < b ? m - a - 1 : m - a;
printf("%d.%d.%d", x, y, z);
return 0;
}
General Palindromic Number
1019 General Palindromic Number (20 分)
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
bool Judge(int z[], int num) {
for(int i = 0; i <= num / 2; i++) {
if(z[i] != z[num - i - 1]) {
return false;
}
}
return true;
}
int main() {
int n, b, z[40], num = 0;
scanf("%d %d", &n, &b);
do {
z[num++] = n % b;
n /= b;
}while(n != 0);
bool flag = Judge(z, num);
if(flag)
printf("Yes\n");
else
printf("No\n");
for(int i = num - 1; i >= 0; i--) {
printf("%d", z[i]);
if(i != 0) {
printf(" ");
}
}
return 0;
}
Colors in Mars
1027 Colors in Mars (20 分)
#include<stdio.h>
char r[]="0123456789ABC";
int main(){
int i,n[3];
for(i=0;i<3;i++) scanf("%d",&n[i]);
printf("#");
for(i=0;i<3;i++){
if(n[i]<13) printf("0%c",r[ n[i] ]);
else {
printf("%c%c",r[ n[i]/13 ],r[ n[i]%13 ]);
}
}
}
A+B in Hogwarts
1058 A+B in Hogwarts (20 分)
#include<stdio.h>
#define ll long long
int main(){
int G = 17*29;
int S = 29;
ll g1, s1, k1, g2, s2, k2;
scanf("%lld.%lld.%lld %lld.%lld.%lld",&g1, &s1, &k1, &g2, &s2, &k2);
ll ans = g1*G+s1*S+k1 + g2*G+s2*S+k2;
printf("%lld.%lld.%lld",ans/G , ans%G/S , ans%S);
return 0;
}