一、变种水仙花题目:
把任意的数字,从中间拆分成两个数字,比如1461,可拆分成(1和461)、(14和61)、(146和1),如果所有拆分后的乘积之和等于自身,则是一个变异水仙花数。
二、代码和注释:
#include<stdio.h>
#include<math.h>
int main(){
int num;
printf("请输入要检验的数:");
scanf("%d",&num);
int arr[11];
int index =0;
int temp = num;
int i;
int j;
// 将要验证的数,一位一位存在数组中 655存了后,相当于arr = {5,5,6}
while(temp){
arr[index] = temp%10;
temp/=10;
index++;
}
int sum =0;
// 这段为核心代码
// 纯数学找规律总结下标与变异水仙花的关系
// 可带入输入的数为655(该数为变异水仙花数,6*55+65*5)
// 可算算体验下,由简入繁,可意会、可实践带入,难言传清楚
for(i=0;i<index-1;i++){
int t1=0;
int flag = index-1;
int flag2 = index-1-i;
for(int j=0;j<i+1;j++){
t1+=arr[index-j-1]*pow(10,flag-flag2);
flag--;
}
int t2 = 0;
for(j=i+1;j<index;j++){
t2+=arr[index-j-1]*pow(10,index-j-1);
}
sum+=t1*t2;
}
if(sum==num){
printf("是变异水仙花");
}else{
printf("不是变异水仙花");
}
return 0;
}
三、运行结果验证:
验证655、1461、14610、16420、23610、34420、65500(这些已知是变种水仙花数):
随便输入一个不是变种水仙花的数,进行验证(如22222):
四、方法二代码:
更为巧妙的数学解法
#include<stdio.h>
int main(){
long num;
printf("请输入要验证的数:");
scanf("%ld",&num);
int k=10;
int n1=num/k;
int sum;
int n2;
while(n1!=0)
{ n2=num%k;
sum+=n1*n2;
k*=10;
n1=num/k;
}
if(sum==num){
printf("是变种水仙花数");
}else{
printf("不是变种水仙花数");
}
return 0;
}