—————————————————————————————————
原题题目
—————————————————————————————————
题目传送门
—————————————————————————————————
代码实现
—————————————————————————————————
#include<stdio.h>
#include<math.h>
int is_daff(int m)
{
int s=0;
int sum=0;
int i=0;
for(i=1;i<5;i++)
{
s=pow(10,i);
sum+=(m%s)*(m/s);
}
if(sum==m)
return 1;
else
return 0;
}
int main()
{
for(int n=10000;n<99999;n++)
{
if(is_daff(n))
{
printf("%d ",n);
}
}
return 0;
}
—————————————————————————————————
重点分析
—————————————————————————————————
此题的重点在如何才能将题目给的数字拆分开来?我们从题目入手,1461可以拆成1和461 ,14和61,146和1。做过前面题目可以知道,这似乎是用到了求余和除法。其次,1461/1000=1。1461/100=14。 1461%100=61。 那我们就可以知道了,这个拆分无非是一个求得的是余数,一个求得的是除之后的数(我数学不是很好,只能这样表达进行除法之后的结果)。
既然这样我们用一个循环来实现这个步骤。
for(int i=1;i<5;i++)
{
s=pow(10,i);//10的i次方
sum+=(m%s)*(m/s);
}
求余后的乘以除之后的,就可以得到我们想要的结果。随后再根据循环,从10到10^2(10的平方)10的3次方。。一直到10的4次方。
为了代码的优越性,我们最好把他写成一个函数的形式,这对我们代码习惯的养成也十分关键,百利而无一害。