1、问题描述

自幂数:一个n位数,每个位上的数字的n次方之和等于它本身的数字;

例:153 = 3^3 + 5^3 + 1 ^3,就为自幂数;


2、代码实现

#include<stdio.h>constinttable[][10]={//table[3][6]代表:6的3次方,做一张表直接查询,效率比较高;//0123456789/*0次方*/1,1,1,1,1,1,1,1,1,1,/*1次方*/0,1,2,3,4,5,6,7,8,9,/*2次方*/0,1,2*2,3*3,4*4,5*5,6*6,7*7,8*8,9*9,/*3次方*/0,1,2*2*2,3*3*3,4*4*4,5*5*5,6*6*6,7*7*7,8*8*8,9*9*9,/*4次方*/0,1,2*2*2*2,3*3*3*3,4*4*4*4,5*5*5*5,6*6*6*6,7*7*7*7,8*8*8*8,9*9*9*9,/*5次方*/0,1,2*2*2*2*2,3*3*3*3*3,4*4*4*4*4,5*5*5*5*5,6*6*6*6*6,7*7*7*7*7,8*8*8*8*8,9*9*9*9*9,/*6次方*/0,1,2*2*2*2*2*2,3*3*3*3*3*3,4*4*4*4*4*4,5*5*5*5*5*5,6*6*6*6*6*6,7*7*7*7*7*7,8*8*8*8*8*8,9*9*9*9*9*9,/*7次方*/0,1,2*2*2*2*2*2*2,3*3*3*3*3*3*3,4*4*4*4*4*4*4,5*5*5*5*5*5*5,6*6*6*6*6*6*6,7*7*7*7*7*7*7,8*8*8*8*8*8*8,9*9*9*9*9*9*9,/*8次方*/0,1,2*2*2*2*2*2*2*2,3*3*3*3*3*3*3*3,4*4*4*4*4*4*4*4,5*5*5*5*5*5*5*5,6*6*6*6*6*6*6*6,7*7*7*7*7*7*7*7,8*8*8*8*8*8*8*8,9*9*9*9*9*9*9*9,/*9次方*/0,1,2*2*2*2*2*2*2*2*2,3*3*3*3*3*3*3*3*3,4*4*4*4*4*4*4*4*4,5*5*5*5*5*5*5*5*5,6*6*6*6*6*6*6*6*6,7*7*7*7*7*7*7*7*7,8*8*8*8*8*8*8*8*8,9*9*9*9*9*9*9*9*9,};voidselfNumber(intnum);intselfLen(intnum);intselfLen(intnum){if(num>0&&num<10){return1;}elseif(num>10&&num<100){return2;}elseif(num>100&&num<1000){return3;}elseif(num>1000&&num<10000){return4;}elseif(num>10000&&num<100000){return5;}elseif(num>100000&&num<1000000){return6;}elseif(num>1000000&&num<10000000){return7;}elseif(num>10000000&&num<100000000){return8;}elseif(num>100000000&&num<1000000000){return9;}return-1;}voidselfNumber(intnum){intn;intlen=selfLen(num);intsum=0;for(n=num;n;n/=10){sum+=table[len][n%10];//此处就是求每一位的n次幂的和,利用的就是在表中直接查询的方法;}if(sum==num){printf("%d是自幂数\n",num);}}voidmain(void){inti;intcount;printf("请输出多少位以内的自幂数:");scanf("%d",&count);for(i=0;i<count;i++){selfNumber(i);}}


3、结果截图



4、算法分析

是查表法,根本不用计算,再加上if...else if判断几位数,效率非常的高效!!!


5、算法题:输入一个大于100000,小于21亿的一个整数n,要求输出7^n的个位上的数字?

(1)、算法分析:


(2)、代码实现

#include<stdio.h>voidmain(void){intvalue[]={1,7,9,3};intn;printf("请输入7的n次方,n=");scanf("%d",&n);printf("7^n的个位数为:%d\n",value[n%4]);}

(3)、结果截图