日期 :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;
}