C语言练习题

时间:2023-02-22 17:13:03

一、

题目:

小明写了一个十六进制数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;
}

输出结果:

C语言练习题

二:

题目:

不使用累计乘法的基础上,利用移位运算符<<计算2的n次方。

思路:

左移运算符对1的二进制位进行左移,每左移一位就是相当于乘一次2

C语言练习题

源码:

#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以此类推

只要 求一个数字的 后几位 或者 前几位 就可以%几位数!

C语言练习题

源码:

#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;
}