【算法教程】【C/C++】基础数学:进制转换——程序设计思路与代码实现

faryou6个月前 (03-30)技术教程

前言

        在学习计算机的过程中,我们会碰到不同的进制,如二进制、十六进制等。而这些进制之间的转换,又成为了一个问题。现在,我们来学习写一个程序,实现二~十六进制之间的进制转换。


程序设计思路

        一般情况下,要解决一个算法问题,首先要在数学上解决它。进制就代表着满几进一。因此,我们在进制转换时,只需要不断地除以进制数,并将余数连起来,就是新的数了。在进制转换时,通尝使用短除法。如将256转换为十六进制数:

16          2      5      6               

16    l        1      6············0

16    l        1············0

0············1

        故256=0x100。

        在真正的写程序的时候,由于十六进制中的10~15用字母A~F表示,因此我们不能直接用int相加,而应该用字符串存数据。


代码实现

        以下为题目要求及代码:

IMG_20240705_085350.png

#include <bits/stdc++.h>
using namespace std;

int n,m,ten;//n、m为题目中原义,ten为被转换的数的十进制
char a[15],ans[15];//a存输入,ans存输出

int n_ten(int n){//n进制→十进制
	int answer=0;//answer为结果
	for(int i=0;a[i]!='\0';i++){//数学方式:十进制数=n进制数的第i位数*n^(i-1)
		if(a[i]>='0' && a[i]<='9') answer=answer*n+a[i]-48;
		if(a[i]>='A' && a[i]<='F') answer=answer*n+a[i]-55;
	}
	return answer;
}
void ten_m(int a,int m){//十进制→m进制,即上面的短除法
	int b=0,i=a;//b为计次,i为十进制数
	while(i>0){//在i除完之前循环
		if(i%m<=9) ans[b]=i%m+48;
		if(i%m>=10) ans[b]=i%m+55;
		i = (i-i%m)/m;
		b++;
	}
	return ;
}
//以上两个函数都使用了ASCLL码相关知识,请自行查表
int main(){
	scanf("%d%s%d",&n,a,&m);
	ten=n_ten(n);
	if(m!=10){
		ten_m(ten,m);
		int n=strlen(ans);//获取长度
		for(int i=n-1;i>=0;i--) printf("%c",ans[i]);
	}
	else printf("%d",ten);
	return 0;
}


结语

        进制转换最主要是在数学上理解这个方法,之后就是对照数学方式写程序了。我是faryou,再见!

本文链接:https://blog.faryou.eu.org/post/92.html 转载需经作者授权!

分享到:

扫描二维码推送至手机访问。

版权声明:本文由faryou的博客发布,如需转载请注明出处。

本文链接:https://blog.faryou.eu.org/post/92.html

标签: 算法基础C++
分享给朋友:

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。