【C语言经典题目】水仙花数(daffodil)

206 阅读3分钟

[TOC]

【program】 打印水仙花数(daffodil)

求出0~100000之间的所有“水仙花数”并输出。

【Tips】“水仙花数”是指一个3位数,其各位数字的3次方之和确好等于该数本身,如:153=1^3+5^3+3^3,则153是一个“水仙花数”。


【analysis】分析

又称 阿姆斯特朗数。

∵ daffodil numbers points at三位数,各位上的数字的3三次方之和恰好等于该数本身

∴ 我们可以根据除法和取余运算求出各位上的数字,再求出各位数字三次方并求和。最后比较是否等于该数本身。

仅针对水仙花数(三位数)进行打印

解法一:暴力解题(daffodil)

#include <stdio.h>
#include  <math.h>
int main(){

    // way one
    void daffodil();
    return 0;
}

// waay one 
void daffodil(){
    int a,b,c; // 
    for(int i=0;i<1000;i++){
        a=i/100;
        b=/10%10;
        c=i%10;
        // 改进 可引入 pow(x,y)  (库函数 <math.h>)
        // pow(a,3) +pow(b,3) +pow(c,3) == i 
        if(i == a*a*a+b*b*b+c*c*c){
            printf("%d \n",i);
        }
    }
}

本题目严格的说是求解0-10000中的自幂数

水仙花数只是[自幂数] 的一种,严格来说3位数的3次幂数才称为水仙花数。 水仙花数又称阿姆斯特朗数

附加:

附:其他位数的自幂数名字

一位自幂数:独身数

三位自幂数:水仙花数

四位自幂数:四叶玫瑰数

五位自幂数:五角星数

六位自幂数:六合数

七位自幂数:北斗七星数

八位自幂数:八仙数

九位自幂数:九九重阳数

十位自幂数:十全十美数

三位的水仙花数共有4个:153,370,371,407;

四位的四叶玫瑰数共有3个:1634,8208,9474;

五位的五角星数共有3个:54748,92727,93084;

六位的六合数只有1个:548834;

七位的北斗七星数共有4个:1741725,4210818,9800817,9926315;

八位的八仙数共有3个:24678050,24678051,88593477;

九位的九九重阳数共有4个: 146511208,472335975,534494836,912985153;

十位的自幂数只有1个:4679307774

解法二:破题方法(自幂数)

在了解了以上基础内容之后,再次查看题目要求使用编程思维求解该题;

求出0~100000之间的所有“水仙花数”【自幂数】并输出

#include <stido.h>
#include <math.h>
int main(){

    void daffodil2();
    
    return 0;
    
}

void daffodil2(){
    
    
    for(int i=0;i<100000;i++){
       // 先求解是几位数
       int count = 0;
       int tmp=i;
       while(tmp !=0){
           // tmp 123
           // 1 123 
           // 2 123/10= 23
           // 3 23/10=2
           //   2/10=0,所以count=3 123是三位数,次方数为3
           count++;
           tmp /= 10;
       }
       
       // 求解各位上的数字,并求和
       int tmp=i;
       while(tmp !=0){
         // tmp 123
         // 123%10  == 3
         
         // 12 % 10  == 2
         // 1%10 == 1
         
           sum+=pow(tmp%10,count);
           tmp/=10;
             //tmp  123
           // tmp /10  123/10=12
           // 12 / 10 == 1
           
           
       }
       
       
       // 判断是否相等
       if (i== sum){
           printf("%d \n",i);
       }
    }




}