您的位置:首页 > 其它

杭电水题-2031 进制转换

2013-09-05 19:16 351 查看
题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=2031 代码及心得体会如下。。。。
这道题其实还可以吧,用递归做更能体会递归的好处。。但是,为图省事,,暂时选择这种方法了。。

/***** HDOJ 2031 进制转换题 ********/

/******** written by C_Shit_Hu ************/

/****************************************************************************/
/*
输入一个十进制数N,将它转换成R进制数输出。

输入数据包含多个测试实例,每个测试实例包含两个整数N(32位整数)和R(2<=R<=16, R<>10)。

为每个测试实例输出转换后的数,每个输出占一行。如果R大于10,则对应的数字规则参考16进制(比如,10用A表示,等等)。
*/
/****************************************************************************/

#include<stdio.h>

void zh(int a,int n)
{
int x[1000], u=0, i;
while(a!=0)       // 若十进制数不为零
{
x[u++]=a%n;
a=a/n;       // 将输入的十进制数按要求不断进制取余
}
for(i=u-1; i>=0; i--)// 取余后依次输出
{
if(x[i]>=10)       // 如果要求取的进制数大于十进制数,且取余后有大于十的数字
{
x[i]=x[i]+55;    // 将该数字复制给相应的字母
printf("%c",(char)x[i]);    // 输出相应的字母
}
else
printf("%d",x[i]);  // 否则输出相应的小于十的数字即可
}
printf("\n");        // 调用函数结束
}

void main()
{
int a,b;                //  创建临时变量

while(scanf("%d%d",&a,&b)!=EOF)    // 设置输入变量,多个实例,文件结束时结束
{
if(a<0)           // 若输入十进制数为负数
{
printf("-");  // 先输出负号
zh(-a,b);     // 调用函数, 传递的值为正数
}
else
zh(a,b);      // 否则直接调用即可
}
}

/******************************************************/
/********************  心得体会  **********************/
/*
上面的代码重点在对进制转换的算法,即是整除取余法,
不断的將余数取出,并相应的将原数字改变。
然后将得到的余数,也即是转换后的进制数字输出即可。
但是,由于转换后的进制数可能大于十进制数字,因此需要用对应的字母代替。
因此,对于大于十的余数用ASCII码表中的字符代替即可。

最后需要注意的是,输入的十进制数字可能为负数,
为了减少复杂性,可以在输出进制数时,先输出负号即可。
即是构造的调用函数只处理正数。
*/
/******************************************************/

题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=2031 代码及心得体会如下。。。。
这道题其实还可以吧,用递归做更能体会递归的好处。。但是,为图省事,,暂时选择这种方法了。。

/***** HDOJ 2031 进制转换题 ********/

/******** written by C_Shit_Hu ************/

/****************************************************************************/
/*
输入一个十进制数N,将它转换成R进制数输出。

输入数据包含多个测试实例,每个测试实例包含两个整数N(32位整数)和R(2<=R<=16, R<>10)。

为每个测试实例输出转换后的数,每个输出占一行。如果R大于10,则对应的数字规则参考16进制(比如,10用A表示,等等)。
*/
/****************************************************************************/

#include<stdio.h>

void zh(int a,int n)
{
int x[1000], u=0, i;
while(a!=0)       // 若十进制数不为零
{
x[u++]=a%n;
a=a/n;       // 将输入的十进制数按要求不断进制取余
}
for(i=u-1; i>=0; i--)// 取余后依次输出
{
if(x[i]>=10)       // 如果要求取的进制数大于十进制数,且取余后有大于十的数字
{
x[i]=x[i]+55;    // 将该数字复制给相应的字母
printf("%c",(char)x[i]);    // 输出相应的字母
}
else
printf("%d",x[i]);  // 否则输出相应的小于十的数字即可
}
printf("\n");        // 调用函数结束
}

void main()
{
int a,b;                //  创建临时变量

while(scanf("%d%d",&a,&b)!=EOF)    // 设置输入变量,多个实例,文件结束时结束
{
if(a<0)           // 若输入十进制数为负数
{
printf("-");  // 先输出负号
zh(-a,b);     // 调用函数, 传递的值为正数
}
else
zh(a,b);      // 否则直接调用即可
}
}

/******************************************************/
/********************  心得体会  **********************/
/*
上面的代码重点在对进制转换的算法,即是整除取余法,
不断的將余数取出,并相应的将原数字改变。
然后将得到的余数,也即是转换后的进制数字输出即可。
但是,由于转换后的进制数可能大于十进制数字,因此需要用对应的字母代替。
因此,对于大于十的余数用ASCII码表中的字符代替即可。

最后需要注意的是,输入的十进制数字可能为负数,
为了减少复杂性,可以在输出进制数时,先输出负号即可。
即是构造的调用函数只处理正数。
*/
/******************************************************/



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: