本人第一次发文,没有经验,用的是笨办法但在网站里运行无误,不喜勿喷,谢谢!
题目:1161:转进制
题目描述:
用递归算法将一个十进制数X转换成任意进制数M(M≤16)
输入:
用递归算法将一个十进制数X转换成任意进制数M(M≤16)
输出:
输出结果
输入样例:
31 16 {将十进制31转化为十六进制数}
进制转换,无论在普及组还是提高组中都是很常见的,无非是相同的思路使用不同的的方法或者时间复杂度。普及组中出现的一般是直接计算或者简单的多组数据计算(或判断),因此,除非出题人在时间复杂度这一方面提出了一些特殊的要求(比如:必须在500ms内运行,当然这只是极端举例),否则我们可以直接用简单的while或for循环嵌套,但是能省掉的尽量省,不需要紧张,做就行了(记得运行,不要出现细微的差错)
这道题考察我们对进制转换的理解,而且是其他进制转十进制。我们只需要用十进制整除该进制,然后倒叙取余,由于数据范围是从二进制到16进制,所以要注意:十六进制到十一进制这一部分要注意将那些数位上的两位数转成字母,如:(1)(14)就得转成1E。这部分要运用一些字符和数字之间的简单算法。
程序:
简单,用的是直接思考的方法
#include<iostream> //只需要调用iostream库,万能头看似好用,但在NOiP考试中要慎用,之前有个例子就是一些学生在考试中使用万能头,结果导致了大量失分
using namespace std;
long long n,x=0; //由于数据中十进制数的范围是1位数到10^14(读作:十的十四次方)最大是15位数,int类型用起来不方便,所以要用长整型long或超长整形long long。n是那个输入的十进制数,x是用来计算答案位数的
int m; //m是是要转的进制,为2到16,所以用int就足够了
int a[10001]; //定义数组,标记数位上的数字
int main() //主程序部分
{
cin>>n>>m; //输入那个要转的十进制数和该进制
while(n!=0) //在n不等于0时进行转换
{
x++; //数位增加,每一位保存一个数
a[x]=n%m; //相当于取余的过程
n=n/m; //让n减小,模拟取余后该数的减小
}
for(int i=x;i>=1;i--) //由于我们先是正序存储并取余,所以我们要用i--倒序输出
{
if(a[i]>9) cout<<char(a[i]+'A'-10); //11进制到16进制中要用字母,我们就可以用一个小算法。
else cout<<a[i]; //输出即可
}
return 0; //return 0,程序终止
}