@[TOC]
CSDN鏈接:https://blog.csdn.net/qq_34767784/category_8813365.html
Contest100000579 - 《算法筆記》3.5小節(jié)——入門(mén)模擬->進(jìn)制轉(zhuǎn)換
例題
PATB1022
https://pintia.cn/problem-sets/994805260223102976/problems/994805299301433344
題目:
輸入兩個(gè)非負(fù) 10 進(jìn)制整數(shù) A 和 B (≤2
?30
?? ?1),輸出 A+B 的 D (1<D≤10)進(jìn)制數(shù)赏胚。
輸入格式:
輸入在一行中依次給出 3 個(gè)整數(shù) A分预、B 和 D揖庄。
輸出格式:
輸出 A+B 的 D 進(jìn)制數(shù)褐荷。
輸入樣例:
123 456 8
輸出樣例:
1103
//1022 D進(jìn)制的A+B
題析:注意除基取余法應(yīng)用译柏,特別注意標(biāo)注的倒敘輸出從i-1開(kāi)始
以及循環(huán)用do…while(會(huì)出現(xiàn)arr[0]=0情況)
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
void dec2d(int num,int d)
{
int arr[50];int i=0;
do
{
arr[i++]=num%d;
num/=d;
}while(num != 0);
for(int j=i-1;j>=0;j--)//從i-1開(kāi)始而不是i,因?yàn)閍rr[i]==0
{
printf("%d",arr[j]);
}
}
int main()
{
int a,b,d;
while(scanf("%d%d%d",&a,&b,&d) != EOF)
{
int sum=a+b;
dec2d(sum,d);
}
return 0;
}
Codeup練習(xí)題:
http://codeup.cn/contest.php?cid=100000579
1941 Problem A 又一版 A+B
http://codeup.cn/problem.php?cid=100000579&pid=0
題析:注意事項(xiàng)見(jiàn)注釋?zhuān)€是有坑的包括while(num)與while(num!=0)的區(qū)別還是不清楚
//1941ProblemA又一版 A+B
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
void dec2m(long long num,int m)
{
int arr[31];
int i=0;
do
{
arr[i++]=num%m;
num/=m;
}while(num != 0);//此處大坑,while(num)顯示錯(cuò)誤50%埃跷?接癌?
for(int j=i-1;j>=0;j--)//此處注意從i-1開(kāi)始心赶,因?yàn)樽罱K一定是arr[i]==0,
{ //因?yàn)槭莇o...while(區(qū)別于while) ,因?yàn)橛刑厥馇闆r(num==0)時(shí)
printf("%d",arr[j]);
}
}
int main()
{
long long a,b;
int m;
while(scanf("%d%lld%lld",&m,&a,&b)!=EOF)
{
if(m==0)
break;
dec2m(a+b,m);
printf("\n");
}
return 0;
}
1942 Problem B 數(shù)制轉(zhuǎn)換
http://codeup.cn/problem.php?cid=100000579&pid=1
ASCII表
題析:剛開(kāi)始沒(méi)弄清題意缺猛,后來(lái)參考大佬博客
https://blog.csdn.net/privilage/article/details/79959279
主要是字符的處理(將不同進(jìn)制數(shù)作為字符數(shù)組缨叫,然后轉(zhuǎn)換為10進(jìn)制)+除基取余法轉(zhuǎn)換的應(yīng)用
//1942ProblemB數(shù)制轉(zhuǎn)換
#include<iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
long a,b;
char num[100];
char ans[100];
long y=0;
//把n進(jìn)制轉(zhuǎn)換成十進(jìn)制
while(scanf("%ld%s%ld",&a, &num, &b) != EOF)
{
long sum=0;
int len = strlen(num);
//將a進(jìn)制轉(zhuǎn)換為10進(jìn)制
for(int i=0;i<len;i++)//轉(zhuǎn)換,需熟悉ASCII表
{
if(num[i]>='a')//小寫(xiě)字母轉(zhuǎn)化為大寫(xiě)字母待后續(xù)處理
{
num[i]=num[i]-32;
}
//int temp = (num[i] >= 'A'?num[i]-'A'+10:num[i]-'0');
int temp;
if(num[i]>='A')
{
temp = num[i]-'A'+10;
}
else
{
temp = num[i]-'0';
}
sum = sum*a + temp;
}
//將10進(jìn)制轉(zhuǎn)換為b進(jìn)制枯夜,除基取余法
int count=0;
do
{
if(sum%b<=9)
{
ans[count++] = sum%b+'0';
}
else
{
ans[count++] = sum%b+'A'-10;
}
sum/=b;
}while(sum != 0);
//倒敘輸出
for(int j=count-1;j>=0;j--)
{
printf("%c",ans[j]);
}
printf("\n");
}
return 0;
}
1943 Problem C 進(jìn)制轉(zhuǎn)換
http://codeup.cn/problem.php?cid=100000579&pid=2
題析:此題經(jīng)典弯汰,見(jiàn)大神解析
https://blog.csdn.net/ActionBeam/article/details/88355452
//1943ProblemC進(jìn)制轉(zhuǎn)換
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char mod(char num[])//輾轉(zhuǎn)相除法求每一個(gè)余數(shù)
{
int len = strlen(num);
int rem=0,div=0;
for(int i=0;i<len;i++)//注意余數(shù)為1時(shí)要乘以10保留到下一位作為被除數(shù)
{
div = ((num[i]-'0')+rem*10) / 2;
rem = ((num[i]-'0')+rem*10) % 2;
num[i] = div + '0';//將每一位對(duì)應(yīng)的商放回?cái)?shù)組對(duì)應(yīng)的位上
}
return rem+'0';//余數(shù)轉(zhuǎn)換為字符返回
}
bool isEmpty(char num[])//判斷輾轉(zhuǎn)相除法結(jié)束標(biāo)志 ,即是否待轉(zhuǎn)換數(shù)數(shù)組全0
{
int len=strlen(num);
for(int i=0;i<len;i++)
{
if(num[i]!='0')//注意為字符‘0’
{
return 0;
}
}
return 1;
}
char numDec[35];
char numBin[205];
int main()
{
while(scanf("%s",numDec) != EOF)
{
int count=0;
int len=strlen(numDec);
do
{
numBin[count++]=mod(numDec);
// cout<<"dadad"<<endl;
}while(!isEmpty(numDec));
numBin[count]='\0';
for(int i=count-1;i>=0;i--)//除基取余法的倒敘輸出
{
printf("%c",numBin[i]);
}
printf("\n");
}
return 0;
}
1944 Problem D 八進(jìn)制
http://codeup.cn/problem.php?cid=100000579&pid=3
題析:題目簡(jiǎn)單湖雹,運(yùn)用經(jīng)典的除基取余法即可
//1944ProblemD八進(jìn)制
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int octal[105];
int main()
{
int N;
while(scanf("%d",&N) != EOF)
{
int count=0;
do
{
octal[count++]=N%8;
N/=8;
}while(N != 0);
for(int j=count-1;j>=0;j--)
{
printf("%d",octal[j]);
}
printf("\n");
}
return 0;
}