一、
题目:
小明写了一个十六进制数ABCDEF,他问你对应的十进制数是多少?
思路:不能被带偏,想要自己将十六进制数转化位十进制数,再输出,其实不需要。只需要利用printf函数使用格式化打印%d即可。
但需要输入前缀0x,不然以为是字符串!
%x是打印十六进制数,十六进制的字母大小写区分和你格式化打印时的x有关。
源码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
printf("%d\n", 0xABC);
printf("%x", 0xABCDE);
return 0;
}
输出结果:
二:
题目:
不使用累计乘法的基础上,利用移位运算符<<计算2的n次方。
思路:
左移运算符对1的二进制位进行左移,每左移一位就是相当于乘一次2!
源码:
#include<stdio.h>
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n );
printf("%d", 1 << n);
return 0;
}
三、
题目:
变种水仙花数:把任意的数字,从中间拆分成两个数字,比如1461可以拆分成(1和461),(14和61),(146和1),如果拆分后的乘积之和等于自身,则满足题目要求。
例如1461=1461+1461+146*1.求出5位数中所有满足题目要求的数字。
思路:
之前一直不会做这种题,把一个数字拆分成上述的形式(想用字符串,可是还要转化为十进制)。
经过老师指点,这类题目有特殊的算法,将这个数字分别/10,%10,就可以得到准确的十进制位,/100,%100以此类推!
只要 求一个数字的 后几位 或者 前几位 就可以%几位数!
源码:
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
for (int i=10000;i<=99999;i++)
{
int sum = 0;
for (int k=10;k<=10000;k*=10)
{
a = i / k;
b = i % k;
sum += a * b;
}
if (i == sum)
{
printf("%d ", i);
}
}
return 0;
}