写在前面:
题解是对具体题目的编程实现,不会具体讲解C语言语法。请先大致学习好语法,自己敲敲代码后再看题解(上来就直接看题解的习惯不好哟~)。在每一题的题解之前,会列出本题涉及到的语法知识供参考,可以在教材或其他学习资源找到这些内容学习。😀
本题的预备知识:
- 变量的定义与赋值操作
- 输入(scanf)输出(printf)语句
- for循环语句及其嵌套
- main函数的结束
求一个三位数,其值等于其各位阶乘之和
成绩 | 10 | 开启时间 | 2020年03月21日 星期六 08:30 |
折扣 | 0.8 | 折扣时间 | 2020年04月15日 星期三 23:30 |
允许迟交 | 否 | 关闭时间 | 2020年05月11日 星期一 23:30 |
编写程序,求某三位数,该数值的大小正好是组成这个数的三个位上的数字阶乘之和.
题解
本题依旧是枚举求解。设我们要求的number的百、十、个位分别是:i、j、k。直接将每一位枚举:i = 1~9, j = 0~9,k = 0~9。依次计算i
、j、k的阶乘num1、num2、num3,检验他们的和是否等于number。
#include <stdio.h> //导入stdio.h库,里面包含输入输出函数
int main() {
int num1, num2, num3; //分别储存百、十、个位数的阶乘
int number;
/* 枚举百位 */
for (int i = 1; i < 9; i++) {
num1 = 1; //赋予初值!!!!(一定要注意!不可以省略)
for (int t = 2; t <= i; t++) //求 百位 的阶乘
num1 *= t;
/* 枚举十位 */
for (int j = 0; j < 9; j++) {
num2 = 1; //赋予初值!!!!(一定要注意!不可以省略)
for (int t = 2; t <= j; t++) //求 十位 的阶乘
num2 *= t;
/* 枚举个位 */
for (int k = 0; k < 9; k++) {
num3 = 1; //赋予初值!!!!(一定要注意!不可以省略)
for (int t = 2; t <= k; t++) //求 个位 的阶乘
num3 *= t;
/* 判断枚举的情况是否符合题意 */
number = 100 * i + 10 * j + k;
if (num1 + num2 + num3 == number) {
printf("%d\n", number); //输出结果
return 0; //结束主程序
}
}
}
}
}
主要注意:
- 在每次计算阶乘的时候应该先赋予初值1,否则会在遗留之前留下的值继续乘,会出错!
- 变量是可以随用随定义的,不一定要定义在一起。只是定义在哪一个块{}中,他就只可以存在于某一个块中。一旦越过了‘}’,它就不再存在了。
一点改进
(用到了数组,有的同学可能还没有学~)
其实可以发现,我们从始自终只需要求0~9的阶乘,可是我们在枚举的时候肯定是有多次重复求的。那么我们可以考虑哦用一个数组将他们储存起来,比如 d[i] 储存 i 的阶乘。之后就不需要再去求阶乘了,直接调用数组取值即可。
#include <stdio.h> //导入stdio.h库,里面包含输入输出函数
int main() {
int d[10]; //储存0~9的阶乘
int temp = 1;
/* 计算0~9的阶乘,结果存在数组d中 */
d[0] = 1; //0的阶乘特殊处理
for(int i = 1; i < 10; i++) {
temp *= i;
d[i] = temp;
}
/* 枚举百位 */
for (int i = 1; i < 9; i++) {
/* 枚举十位 */
for (int j = 0; j < 9; j++) {
/* 枚举个位 */
for (int k = 0; k < 9; k++) {
/* 判断枚举的情况是否符合题意 */
int number = 100 * i + 10 * j + k;
if (d[i] + d[j] + d[k] == number) {
printf("%d\n", number); //输出结果
return 0; //结束主程序
}
}
}
}
}
有任何问题欢迎评论交流,如果本文对您有帮助不妨点点赞,嘻嘻~
end
欢迎关注个人公众号“ 鸡翅编程 ”,这里是认真且乖巧的码农一枚。
---- 做最乖巧的博客er,做最扎实的程序员 ----
旨在用心写好每一篇文章,平常会把笔记汇总成推送更新~