关于水仙花数问题的解析

日期 :2023 -10-30

1.理解到水仙花数的定义

水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。

2.理解题意,并设计程序运行思路

此类问题,依据题意

(1)在数学方面进行考虑:即将一个N位正整数的进行拆分到每一位数字,并对多位数字求N次幂之和,若和与正整数本身相同,则认为该数字为水仙花数。

(2)在程序运行方面考虑;即要实现对于一个整数的逐位分离求和,关键在于对于不限位数的正整数实现逐位的分离,可以考虑从数组的角度出发,但依据章节划分,目前对这类问题的理解和程序设计不涉及有关数组的知识。

3.抓住程序本质

如何取出不同位置的数字

4.程序设计:(使用VS2020编译器)

                                                此图为例题


个人方法一:此方法根据题目设计3-7位整数下的运行方式,但设计时,我有考虑到此方法的局限性,若是对于单题而言,在位数少的情况喜爱,引入switch结构可以实现选择性进入case局部程序运行,但未从根本上实现对不计位数的正整数的逐位分离。
并且遇到一些问题

当输入位数为7位数的时候,此程序运行超时,这正是单纯套用switch结构并通过声明不同位数数字的弊端,当数据过大时,运行for循环的时间过长,程序效率低下

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<math.h>
int main() {
    int n;
    int a1, a2, a3, a4, a5, a6, a7;
    int i, n_i;
    scanf("%d", &n);
    switch (n) {
    case 3:
        for (i = 100; i <= 999; i++)
        {
            a1 = i % 10;
            a2 = i / 10 % 10;
            a3 = i / 100;
            n_i = pow(a1, 3) + pow(a2, 3) + pow(a3, 3);
            if (n_i == i)
            {
                printf("%d\n", n_i);
            }
        }
        break;
    case 4:
        for (i = 1000; i <= 9999; i++)
        {
            a1 = i % 10;
            a2 = i / 10 % 10;
            a3 = i / 10 / 10 % 10;
            a4 = i / 1000;
            n_i = pow(a1, 4) + pow(a2, 4) + pow(a3, 4) + pow(a4, 4);
            if (i == n_i)
            {
                printf("%d\n", i);
            }
        }
        break;
    case 5:
        for (i = 10000; i <= 99999; i++)
        {
            a1 = i % 10;
            a2 = i / 10 % 10;
            a3 = i / 10 / 10 % 10;
            a4 = i / 10 / 10 / 10 % 10;
            a5 = i / 10000;
            n_i = pow(a1, 5) + pow(a2, 5) + pow(a3, 5) + pow(a4, 5) + pow(a5, 5);
            if (i == n_i)
            {
                printf("%d\n", i);
            }
        }
        break;
    case 6:
        for (i = 100000; i <= 999999; i++)
        {
            a1 = i % 10;
            a2 = i / 10 % 10;
            a3 = i / 10 / 10 % 10;
            a4 = i / 10 / 10 / 10 % 10;
            a5 = i / 10 / 10 / 10 / 10 % 10;
            a6 = i / 100000;
            n_i = pow(a1, 6) + pow(a2, 6) + pow(a3, 6) + pow(a4, 6) + pow(a5, 6) + pow(a6, 6);
            if (i == n_i)
            {
                printf("%d\n", i);
            }
        }
        break;
    case 7:
        for (i = 1000000; i <= 9999999; i++)
        {
            a1 = i % 10;
            a2 = i / 10 % 10;
            a3 = i / 10 / 10 % 10;
            a4 = i / 10 / 10 / 10 % 10;
            a5 = i / 10 / 10 / 10 / 10 % 10;
            a6 = i / 10 / 10 / 10 / 10 / 10 % 10;
            a7 = i / 1000000;
            n_i = pow(a1, 7) + pow(a2, 7) + pow(a3, 7) + pow(a4, 7) + pow(a5, 7) + pow(a6, 7) + pow(a7, 7);
            if (i == n_i)
            {
                printf("%d\n", i);
            }
        }
        break;
    }
        return 0;
    }

个人方法二:通过for循环判断出scanf输入正整数的位数,再通过while循环实现逐位提取,并对不同位置的数字实现N次幂的求和,但要注意while循环进行下要对求和的变量进行周期性的清空,除此之外,为了减少运行时间,可以通过设置用户定义函数,来减少代码行数,从而实现降低运行市场;此方法为程序设计合理构想下的可行性方案,但目前未完成相应代码编写。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值