程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 代碼意識流——花朵數問題(七)

代碼意識流——花朵數問題(七)

編輯:關於C語言

20.驗算
   驗算過程的基本思路是求出“和”中各個數字有多少個,然後與得到這個"和"的數字組合比較,如果兩者一致則“和”是一個花朵數。
   例如,由一個5、一個3和一個1可以得到這三個數字的3次方的和為5^3+3^3+1^3==153,而153恰好是由一個5、一個3和一個1這三個數字構成這時就可以斷定153是花朵數。
   反之,由一個5、一個3和一個2可以得到這三個數字的3次方的和為,5^3+3^3+2^3==160,160中有一個6、一個1和一個0,與求得160的三個數字的組合(5,3,2)不符,這就表明160不是花朵數。
   這種算法首先要記錄求出數字N次方之和的各個數字的個數。
  
記錄各數字的個數

在"2_窮舉.c"定義這種數據類型

typedef unsigned int SHUZI_GESHU[JINZHI];
//SHUZI_GESHU[d]存儲數字d的個數    

在xunhuan()中定義這種類型的局部變量,顯然這應該是static類別的

static SHUZI_GESHU sz_gs ;

記錄遞歸過程中各個數字的個數,並測試

static void xunhuan( const int gssx /*個數上限*/,                      const int sz /*關於哪個數字*/,                      DASHU (*p_hang)[WEISHU + 1] /*指向一行數據*/)  {   static DASHU he  = { { 0 } }   ;//static DASHU he    ; // =0   待完成    DASHU        he_ = he ;        //記錄累加前的值     //記錄累加前的值    static SHUZI_GESHU sz_gs ;      if( sz > 0 ){      int i;      for( i = 0 ; i <= gssx ; i++ ){         sz_gs[sz] = i ;          //記錄數字的個數          ds_jiaru ( &he , *p_hang + i ) ;          xunhuan( gssx - i , sz - 1 , p_hang + 1 );         he = he_ ;                  //恢復原來的值       }   }   else{      sz_gs[sz] = gssx ;          //記錄數字的個數       #ifdef CESHI          {           int i;           for ( i = 0 ; i < JINZHI ; i++ ){              printf("%d*%d " , sz_gs[i] , i  );            }           putchar( );          }       #endif      //驗算<=>記錄結果   }}測試通過。
接著在xunhuan()中寫出驗算的代碼,判斷“和”中數字出現的次數與sz_gs 中的記錄是否一致

xunhuan()
{
     ……
     if( 吻合 ( & sz_gs , &he ) == 是 ){ //驗算
          //<=>記錄結果
      }

}

吻合 ( & sz_gs , &和 )
{
   int 和中各數字的個數[JINZHI];

   if( 超過W位(和) == 是  || 不足W位(和) == 是 ){   //#include "3_大數.h"
     return 否;
   }

   求和中各數字的個數( &和中各數字的個數 , &和 );//#include "3_大數.h"

   if ( memcmp (和中各數字的個數 ,sz_gs ,sizeof 和中各數字的個數 )==0 ){ //#include <string.h>
      return 是;
   }
   return 否;
}

這段代碼涉及到很多回答是或否的問題,由於討厭在寫代碼時費神用0或1思考這樣的問題,在工程中加入了這樣一個文件

/*常用.h*/ #ifndef CHANGYONG_H#define CHANGYONG_H     typedef enum { SHI , FOU } SF ;     #endif // CHANGYONG_H並分別在"2_窮舉.h"、"3_大數.h"中添加了
#include "常用.h"

現在,“2_窮舉.h”演變成

/*2_窮舉.h*/#ifndef QIONGJU_H#define QIONGJU_H               /**************************類型定義**************************/    #include "3_大數.h"    #include "常用.h"/**************************函數原型**************************/       extern void qiongju( void );   #include <stdlib.h>                 //malloc()     #endif // QIONGJU_H
2_窮舉.c演變成

/*2_窮舉.c*/#include "2_窮舉.h"#include "0_問題.h"typedef unsigned int SHUZI_GESHU[JINZHI];//SHUZI_GESHU[d]存儲數字d的個數 typedef DASHU SHUJUBIAO[JINZHI-1][WEISHU + 1];//0*(JINZHI-1)^N  1*(JINZHI-1)^N ……WEISHU*(JINZHI-1)^N//0*(JINZHI-2)^N  1*(JINZHI-2)^N ……WEISHU*(JINZHI-1)^N//……//0*(1)^N         1*(1)^N        ……WEISHU*(1)^Nstatic void xunhuan(const int , const int , DASHU (*)[WEISHU + 1] ) ;static void jianli_sjb ( SHUJUBIAO * * ); //建立數據表static SF wenhe( SHUZI_GESHU * const , const DASHU * const);static SF wenhe( SHUZI_GESHU * const p_sz_gs ,                  const DASHU * const p_he ){   int sz_gs_he[JINZHI] = { 0 }; //和中各數字的個數   if(  chaoguo_W(p_he) == SHI  // 超過W位 || 不足W位       || buzu_W   (p_he) == SHI ){       return FOU ;   }    qiu_sz_gs( &sz_gs_he , p_he ); // 求和中各數字的個數      if ( memcmp ( sz_gs_he , *p_sz_gs , sizeof sz_gs_he )==0 ){      return SHI ;   }   return FOU ;}//建立數據表 static void jianli_sjb ( SHUJUBIAO * * p_p_sjb ){   if( (* p_p_sjb = malloc(sizeof(SHUJUBIAO)) ) == NULL ){ //#include <stdlib.h>       exit(!EXIT_SUCCESS);   }   {        int i , j  ;      for( i = 0 ; i < JINZHI - 1 ; i ++){         ds_fuzhi( *( * * p_p_sjb + i ) + 0   , 0 );//第一列為0          ds_fuzhi( *( * * p_p_sjb + i ) + 1   , 1 );//第二列先賦值為1         for( j = 0 ; j < N ; j ++ ){               //求N次冪             ds_chengyi( *( * * p_p_sjb + i ) + 1   , JINZHI - 1 - i );         }          for( j = 2 ; j <= WEISHU ; j ++ ){            (*( * * p_p_sjb + i ))[j] = (*( * * p_p_sjb + i ))[j-1] ;            ds_jiaru ( *( * * p_p_sjb + i ) + j , *( * * p_p_sjb + i ) + 1 ) ;         }      }    } } extern void qiongju( void ){  SHUJUBIAO *p_sjb = NULL ;  jianli_sjb ( & p_sjb ); //建立數據表   xunhuan( WEISHU , JINZHI-1 , *p_sjb ) ;  free ( p_sjb );}sta

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved