经典算法题——水仙花数——算出一个数的各个位数

原题如下:
水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=1​3​​+5​3​​+3​3​​。 本题要求编写程序,计算所有N位水仙花数。
输入格式:
输入在一行中给出一个正整数N(3≤N≤7)。
输出格式:
按递增顺序输出所有N位水仙花数,每个数字占一行。
输入样例:
3

输出样例:
153
370
371
407
下面是我的代码:

#include
main()
{
 int N,g,s,b,q,w,sw,bw,i,j=0,a[1000000];
 scanf("%d",&N);
 if(N==3)
 {
  for(i=100;i<=999;i++)
  {
   g=i%10;
   s=i/10%10;
   b=i/100;
   if(g*g*g+s*s*s+b*b*b==i) a[j++]=i;
  }
 }
 else if(N==4)
 {
  for(i=1000;i<9999;i++)
  {
   g=i%10;
   s=i/10%10;
   b=i/100%10;
   q=i/1000;
   if(g*g*g*g+s*s*s*s+b*b*b*b+q*q*q*q==i) a[j++]=i;
  }
 }
 else if(N==5)
 {
  for(i=10000;i<99999;i++)
  { 
      g=i%10;
   s=i/10%10;
   b=i/100%10;
   q=i/1000%10;
   w=i/10000;
   if(g*g*g*g*g+s*s*s*s*s+b*b*b*b*b+q*q*q*q*q+w*w*w*w*w==i) a[j++]=i;
  }
 }
 else if(N==6)
 {
  for(i=100000;i<999999;i++)
  { 
      g=i%10;
   s=i/10%10;
   b=i/100%10;
   q=i/1000%10;
   w=i/10000%10;
   sw=i/100000;
   if(g*g*g*g*g*g+s*s*s*s*s*s+b*b*b*b*b*b+q*q*q*q*q*q+w*w*w*w*w*w+sw*sw*sw*sw*sw*sw==i) a[j++]=i;
  }
 }
 else if(N==7)
 {
  for(i=1000000;i<9999999;i++)
  { 
      g=i%10;
   s=i/10%10;
   b=i/100%10;
   q=i/1000%10;
   w=i/10000%10;
   sw=i/100000%10;
   bw=i/1000000;
   if(g*g*g*g*g*g*g+s*s*s*s*s*s*s+b*b*b*b*b*b*b+q*q*q*q*q*q*q+w*w*w*w*w*w*w+sw*sw*sw*sw*sw*sw*sw+bw*bw*bw*bw*bw*bw*bw==i) a[j++]=i;
  }
 }
    for(i=0;i

说明:
①方法通俗易懂,先判断数的位数,然后分离出各个位上的数,再将各个位数乘以对应正确的幂次方并相加,最后判断即可。
②可是我想借此题总结的并非是如何判断水仙花数,而主要是如何分离出不同的位的数,它各个队应位上的数。
③也就是/100…和%10如何配合作用,使得算出各个位上的数。
(1)首先需要知道的是,每个数%10既是得到个位上的数
(2)如三位数:123:%10得个位上的3;/10得到除去个位上的3之后剩下的12,所以要得到十位上的2,需要将123/10%10;最后算百位上的1,可/100%10,也可直接/100
(3)四位数如1234:%10得个位上的4;1234/10%10得十位上的3;1234/100%10得百位上的2;最后算千位上的1,可/1000%10,也可直接/1000;
(4)其实,五位数,六位数都不用再多举例了,可以知道这个算法很固定:任何数%10得个位数;/10%10得十位数;/100%10得百位数;/1000%10得千位数;/10000%10得万位数;/100000%10得十万位上的数…
(5)同时,最后%10都是固定的,而/号后面的数是由要求的哪个位上的数决定的,而且规律也很明显,十位数/10,百位数/100,千位数/1000,万位上的数/10000…
说明:其实以前一直在脑子里只是觉得这种东西很简单,当自己需要用的时候要能够完完整整准确无误的提出来,是需要这样总结一下的。

你可能感兴趣的:(学习C语言记录)