求一个三位数,其值等于其各位阶乘之和

写在前面:

题解是对具体题目的编程实现,不会具体讲解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. 在每次计算阶乘的时候应该先赋予初值1,否则会在遗留之前留下的值继续乘,会出错!
  2. 变量是可以随用随定义的,不一定要定义在一起。只是定义在哪一个块{}中,他就只可以存在于某一个块中。一旦越过了‘}’,它就不再存在了。

一点改进

(用到了数组,有的同学可能还没有学~)

其实可以发现,我们从始自终只需要求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,做最扎实的程序员 ----

旨在用心写好每一篇文章,平常会把笔记汇总成推送更新~

在这里插入图片描述

 

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值