1.十进制转六进制
题目描述:
小乐乐在课上学习了二进制八进制与十六进制后,对进制转换产生了浓厚的兴趣。因为他的幸运数字是6,所以他想知道一个数表示为六进制后的结果。
题目任务:
输入一个正整数n ,输出一行为正整数n表示为六进制的结果。
输入输出要求:
输入要求:输入一个正整数n (1 ≤ n ≤ 109)。
输出要求:输出一行,为正整数n表示为六进制的结果。
输入输出案例:
案例1
输入:6
输出:10
案例2
输入:120
输出:320
代码实现:
#include <stdio.h>
int main()
{
//定义变量满足输入要求
int n = 0;
scanf("%d", &n);
//创建数组将六进制的每一位存入,并定义一个计数变量
int count = 0;
int arr[100] = { 0 };
//将十进制的数转化为六进制
while (n)
{
arr[count] = n % 6;
count++;//多执行了一次
n /= 6;
}
//输出
for (int i = count - 1; i >= 0; i--)//count需要-1
{
printf("%d", arr[i]);
}
return 0;
}
补充:
这个题目是没有难点的。如果我们的数学基础比较好,对于十进制的任何数求其对应的其他进制数应该游刃有余。例如我们求十进制数 6 的六进制数。
这个计算过程高中数学应该讲过,如果有疑问可以自行百度,这里不再赘述。
可以看到代码的核心部分,每次取余的结果都存入数组中,每次取商的结果都用作下一次取余。但是在输出的循环部分,循环体的限制条件我定为了:count-1。这是因为:当n为1进入核心部分的循环之后,count++会执行一次,接下来执行n/6的操作,但是此时n/6的结果为0,下一次循环不进入,所以count++多余执行了一次。
这个算法并不是最优的算法,但是是我本人极限脑子爆炸能力有限太菜了想到的最优算法。
2.回文对称数
题目描述:
今天牛牛学到了回文串,他想在数字里面找回文,即回文数,回文数是正着读与倒着读都一样的数,比如1221,343是回文数,433不是回文数。请输出不超过n的回文数。
题目任务:
输入一个整数n,从1开始按从小到大的顺序输出所有回文数。
输入输出要求:
输入要求:输入一个整数n(1 <= n <= 100000)。
输出要求:从1开始按从小到大的顺序输出所有回文数。
输入输出案例:
案例1
输入:10
输出:1
2
3
4
5
6
7
8
9
代码实现:
#include <stdio.h>
int main()
{
//定义满足输入要求的变量
int n = 0;
scanf("%d", &n);
//判断回文并按序输出
int i = 0;
for (i = 1; i <= n; i++)
{
int func = 0;
int num = i;
while (num)
{
//将数字的最后一位单独拿出来,然后把它放在高位
func = func * 10 + num % 10;
num /= 10;
}
if (func == i)
printf("%d\n", func);
}
return 0;
}
补充:
这个题大概率会往数组倒序那方面考虑包括我这个菜鸡在内。其实当我们认真分析一下,数字回文,不就是正着看和倒着看的值一样么?
所以我对for循环里面的while循环作出解释,例如我们判断 123 是不是回文:
原理就是这么个原理,但是代码这块我只能这么解释:本来的func值为0,我们取123的3放如func中,此时func就变成了3,下一次进来func*10=30 再加上123的2,就等于32,下一次进来func*10=320 再加上123的1 ,就等于321。
为什么定义num变量在上一篇博客有讲。