蓝桥杯的算法练习循序渐进,本例引入递归、循环,对初学者学习算法非常有启发,代码及思路如下:
#include<stdio.h>
int a[30],i=0; //定义全局数组a和全局变量i
void getNum(long b)// 将输入的数除16取余数放入数组,直到这个数小于16
{
int c;
while(b>0) // 将b/16赋给b,当b=0时,b%16<16,循环结束,转化完毕
{
if(b<16)
{
a[i]=b;
break;
}
else
{
c=b/16;
a[i]=b%16;
b=c;
i++;
}
}
}
int main()
{
long num;
int j;
scanf("%ld",&num);
getNum(num); //进制转换
for(j=i;j>=0;j--)// 从最高位索引输出数组元素
{
if(a[j]<10){
printf("%d",a[j]); // 小于10时,直接输出
}
else
{
switch(a[j]) //大于等于10时,使用switch转换输出
{
case 10:
printf("A");
break;
case 11:
printf("B");
break;
case 12:
printf("C");
break;
case 13:
printf("D");
break;
case 14:
printf("E");
break;
case 15:
printf("F");
break;
}
}
}
return 0;
}
几点意见:
(1)使用了一个循环代替了递归;
(2)很多判断,结构和层次更为清晰;
(3)自定义函数实现功能,简化主函数的结构;
(4)全局变量有时候非常好用。
下面是原生代码
#include<stdio.h>
int a[30],i=0;
void getNum(long b)
{
int c;
while(b>0)
{
if(b<16)
{
a[i]=b;
break;
}
else
{
c=b/16;
a[i]=b%16;
b=c;
i++;
}
}
}
int main()
{
long num;
int j;
scanf("%ld",&num);
getNum(num);
for(j=i;j>=0;j--)
{
if(a[j]<10){
printf("%d",a[j]);
}
else
{
switch(a[j])
{
case 10:
printf("A");
break;
case 11:
printf("B");
break;
case 12:
printf("C");
break;
case 13:
printf("D");
break;
case 14:
printf("E");
break;
case 15:
printf("F");
break;
}
}
}
return 0;
}