C++ 算法

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

faryou faryou 发表于2024-05-04 12:36:08 浏览11 评论0

抢沙发发表评论

前言

        生活中,人们最常用的是10进制(即满10进1),但在计算机的世界中,2进制、16进制的使用或许更为普便。那么,我们能否写一个程序,实现2~16进制之间的转换呢?

IMG_20240325_210259.png


数学思路

        要解决一个算法问题,首先就要在数学上解决它。

        首先看n进制转10进制。这个可以从意义上来说,我们都知道10进制数123=1*102+2*101+3*100,同理,八进制数12345就可以表示为1*84+2*83+3*82+4*81+5*80。有了这个思路,10进制转n进制也可以直接倒推出来,就是利用短除法把要转换的数不断的除以n,再把余数倒序排列即可。


程序思路

        我们都知道,在2~16进制中,1~9用阿拉伯数字表示,10~15用字母a~f表示,这样看来,我们首先肯定要用字符串存储数据。这里用string和char均可。之后再把上述思路中的10进制到n进制和n进制到10进制都写入函数。最后套一个输入输出的壳即可。


代码

#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进制转10进制
	int answer=0;//answer为答案
	for(int i=0;a[i]!='\0';i++){//当a[i]为结束标识符'\0'时,退出
		if(a[i]>='0' && a[i]<='9') answer=answer*n+a[i]-48;//当原数第i位为1~9时,将原答案自乘n(整体增大一位)加上原数第i位(-48为ASCLL码)
		if(a[i]>='A' && a[i]<='F') answer=answer*n+a[i]-55;//当原数第i位为A~F时,将原答案自乘n(整体增大一位)加上原数第i位(-55为ASCLL码)
	}
	return answer;//返回答案
}
void ten_m(int a,int m){//10进制转m进制
	int b=0,i=a;//b为指针,i为原数
	while(i>0){//为短除法过程,不再赘述
		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 ;
}

int main(){
	scanf("%d%s%d",&n,a,&m);//输入
	ten=n_ten(n);//先转到10进制
	if(m!=10){//当m为10时,不进行10进制转m进制
		ten_m(ten,m);//10进制转m进制
		printf("%s",ans);//输出
	}
	else printf("%d",ten);
	return 0;
}


结语

        进制转换最大的难点在于数学上解决,程序中要灵活多变,不必烦琐。我是faryou,再见!

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

分享到:

访客留言

访客