zoukankan      html  css  js  c++  java
  • 小算法 : 水仙花数

    水仙花数是指一个 n 位数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身。(例如:1^3 + 5^3 + 3^3 = 153)

    初步代码:

    	int nMax = 9999999;
    	int nResult[9999];
    	int nCount = 0;
    	for( int i = 0; i < nMax; i++ )
    	{
    		if( i < 10 )
    		{
    			if( i == i * i * i )
    			{
    				nResult[nCount] = i;
    				nCount++;
    			}	
    		}
    		else if( i < 100 )
    		{
    			int nG = i % 10;
    			int nS = i / 10 % 10;
    			if( i == nG * nG * nG + nS * nS * nS )
    			{
    				nResult[nCount] = i;
    				nCount++;
    			}
    		}
    		else if( i < 1000 )
    		{
    			int nG = i % 10;
    			int nS = i / 10 % 10;
    			int nB = i / 100 % 10;
    			if( i == nG * nG * nG + nS * nS * nS + nB * nB * nB )
    			{
    				nResult[nCount] = i;
    				nCount++;
    			}
    		}
    		else if( i < 10000 )
    		{
    						
    			int nG = i % 10;
    			int nS = i / 10 % 10;
    			int nB = i / 100 % 10;
    			int nQ = i / 1000 % 10;
    			if( i == nG * nG * nG * nG + nS * nS * nS * nS + nB * nB * nB * nB + nQ * nQ * nQ * nQ)
    			{
    				nResult[nCount] = i;
    				nCount++;
    			}
    		}
    		else if( i < 100000 )
    		{
    						
    			int nG = i % 10;
    			int nS = i / 10 % 10;
    			int nB = i / 100 % 10;
    			int nQ = i / 1000 % 10;
    			int nW = i / 10000 % 10;
    			if( i == nG * nG * nG * nG * nG + nS * nS * nS * nS * nS + nB * nB * nB * nB * nB + nQ * nQ * nQ * nQ * nQ \
    				+ nW * nW * nW * nW * nW )
    			{
    				nResult[nCount] = i;
    				nCount++;
    			}
    		}
    		else if( i < 1000000 )
    		{
    						
    			int nG = i % 10;
    			int nS = i / 10 % 10;
    			int nB = i / 100 % 10;
    			int nQ = i / 1000 % 10;
    			int nW = i / 10000 % 10;
    			int nSW = i /100000 % 10;
    			if( i ==	nG * nG * nG * nG * nG * nG + 
    						nS * nS * nS * nS * nS * nS + 
    						nB * nB * nB * nB * nB * nB + 
    						nQ * nQ * nQ * nQ * nQ * nQ + 
    						nW * nW * nW * nW * nW * nW + 
    						nSW * nSW * nSW * nSW * nSW * nSW )
    			{
    				nResult[nCount] = i;
    				nCount++;
    			}
    		}
    		else if( i < 10000000 )
    		{
    						
    			int nG = i % 10;
    			int nS = i / 10 % 10;
    			int nB = i / 100 % 10;
    			int nQ = i / 1000 % 10;
    			int nW = i / 10000 % 10;
    			int nSW = i /100000 % 10;
    			int nBW = i /1000000 % 10;
    
    			if( i ==	nG * nG * nG * nG * nG * nG * nG + 
    						nS * nS * nS * nS * nS * nS * nS +
    						nB * nB * nB * nB * nB * nB * nB + 
    						nQ * nQ * nQ * nQ * nQ * nQ * nQ +
    						nW  * nW  * nW  * nW  * nW  * nW  * nW + 
    						nSW * nSW * nSW * nSW * nSW * nSW * nSW+
    						nBW * nBW * nBW * nBW * nBW * nBW * nBW )
    			{
    				nResult[nCount] = i;
    				nCount++;
    			}
    		}
    	}
    
    	CString str;
    	for( int j = 0; j < nCount; j++ )
    	{
    		CString strTmp;
    		strTmp.Format ( "%d\r\n", nResult[j] );
    		str += strTmp;
    	}
    
    	AfxMessageBox( str );
    }
    

      显然,上面的代码略显蠢笨,就像笨勤的郭靖,但却很认真。当然,如果要快速求出5位数以内的所有水仙花数,上面上家是最简单也是最快的。

      但是,如果要判断任意一个整数是否是水仙花数,就不是很适用了。参考如下代码,由百度得到(我进行了整理,调试和存在的问题的修改):

        long n;
    long p;
    long c,a,j,s[30],i,q;
    p
    =0;
    a
    =10;
    scanf(
    "%d",&n);
    q
    =n;
        c = n; //JQB ADD

    //计算出位数
    for(i=1;c>10 ;++i)
    {
    c
    =n/a;
    a
    =a*10;
    }

    printf(
    "i=%d,a=%d \n",i,a);

    //得到每一位数,并依次放入数组中
    for (j=1;a>=10 ;++j)
    {
    s[j]
    =n/(a/10);
    n
    =n-s[j]*(a/10);
    a
    =a/10;
    printf(
    "j=%d,a=%d\n",j,a);
    }

    //计算n位数的每一位的n次方的和
    for (j=1;j<=i ;j++)
    {
    p
    +=pow(s[j],i);printf("p=%d,i=%d\n",p,i);
    }

    if (p==q)
    {
    printf(
    "%d 为水仙花数",q);
    }
    else
    {
    printf(
    "%d 该数不是水仙花数",q);
    }

      

  • 相关阅读:
    三部曲搭建本地nuget服务器(图文版)
    用批处理编译*.sln工程
    一组无序的整数找出出现次数大于一半的数字
    程序打怪升级之旅
    web开发有那些牛逼东西可以用
    Visual Studio for mac从入门到放弃1
    svn自动更新服务器最新代码
    WinRT支持GB2312
    初试Node —— node.js的安装
    为什么要重写equals方法和hashcode方法
  • 原文地址:https://www.cnblogs.com/jiqiubo/p/2114858.html
Copyright © 2011-2022 走看看