本文前一部分的链接
http://www.cnblogs.com/KBTiller/archive/2011/06/05/2073421.html

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('\n');
}
#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)^N

static 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 );

}

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 ; //记录数字的个数

if( wenhe ( & sz_gs , &he ) == SHI ){ //验算两者是否"吻合"
#ifdef CESHI
ds_shuchu ( & he );
puts("吻合");
#endif
//<=>记录结果
}
}
}

"3_大数.h"演变为

/*3_大数.h*/

#ifndef DASHU_H
#define DASHU_H

#include "0_问题.h" //DASHU用到了WEISHU

/**************************类型定义**************************/
//gw_sz[0]为个位,gw_sz[WEISHU-1]为最高位
//gw_sz[WEISHU-1]的值大于等于JINZHI表示溢出
typedef struct {
int gw_sz[WEISHU] ;
}
DASHU ;
#include "常用.h"

/**************************函数原型**************************/

extern void ds_fuzhi ( DASHU * const , const int ) ;
extern void ds_shuchu( const DASHU * const ) ;
extern void ds_jiaru ( DASHU * const , const DASHU * const ) ;
extern void ds_chengyi( DASHU * const , const int );
extern SF chaoguo_W(const DASHU * const);
extern SF buzu_W(const DASHU * const);
extern void qiu_sz_gs( int (*)[JINZHI] , const DASHU * const ) ;

#endif // DASHU_H

“3_大数.c”演变为

/*3_大数.c*/
#include "3_大数.h"

static void ds_jinwei ( DASHU * const );

//统计*p_he中的各数字个数=> *p_sz_gs
extern void qiu_sz_gs( int (*p_sz_gs)[JINZHI] , const DASHU * const p_he )
{
int * t = p_he->gw_sz ;
while( t < p_he->gw_sz + WEISHU ){
(*p_sz_gs)[*t++] ++ ;
}

}

extern SF buzu_W(const DASHU * const p_ds)
{
if(p_ds->gw_sz[WEISHU-1] == 0 ){
return SHI ;
}
return FOU ;
}
//判断是否超过WEISHU
extern SF chaoguo_W(const DASHU * const p_ds)
{
if(p_ds->gw_sz[WEISHU-1] >=JINZHI ){
return SHI ;
}
return FOU ;
}

//* p_ds *= cs
extern void ds_chengyi( DASHU * const p_ds , const int cs )
{
int * t = p_ds->gw_sz ;
while( t < p_ds->gw_sz + WEISHU ){
*t++ *=cs ;
}
ds_jinwei ( p_ds );
}

//进位
static void ds_jinwei ( DASHU * const p_ds )
{
int * t = p_ds->gw_sz , * const w = t + WEISHU - 1 ;
while( t < w ){
*( t + 1 ) += * t / JINZHI ;
* t ++ %= JINZHI ;
}
}

// *p_he += *p_js
extern void ds_jiaru ( DASHU * const p_he , const DASHU * const p_js )
{
int *he_t = p_he->gw_sz , * const he_w = he_t + WEISHU ; //- 1 ;
const int *js_t = p_js->gw_sz ;
while( he_t < he_w ){
*he_t++ += *js_t++ ;
}
ds_jinwei ( p_he ); // static void ds_jinwei ( DASHU * const );
}

extern void ds_shuchu( const DASHU * const p_ds )
{
int * const t = p_ds->gw_sz , *w = t + WEISHU - 1 ;
while( w > t && *w == 0 ){ //高位0不输出
w--;
}
while( w > t ){
printf( "%d" , * w -- );
}
printf( "%d\n" , * t ) ;
}

//在*p_ds中写入n
extern void ds_fuzhi ( DASHU * const p_ds , const int n )
{
p_ds->gw_sz[0] = n ;
//可能有进位,同时把高位写为0
{
int *t = p_ds->gw_sz , //指向 p_ds->gw_sz[0]
*w = t + WEISHU - 1 ; //指向 p_ds->gw_sz[WEISHU-1]
while( t < w ){
*( t + 1 ) = * t / JINZHI ;
* t ++ %= JINZHI ;
}
}
}

编译运行,结果为
153
吻合
370
吻合
371
吻合
407
吻合

总算看到点亮了。

转载于:https://www.cnblogs.com/KBTiller/archive/2011/06/07/2074344.html

代码意识流——花朵数问题(七)相关推荐

  1. 代码意识流——花朵数问题(一)

    0.问题                          (黑体,15) 一个N位的十进制正整数,如果它的每个位上的数字的N次方的和等于这个数本身,则称其为花朵数.              (宋体 ...

  2. 代码随想录算法训练营第七天| 哈希表理论基础 ,454.四数相加II, 383. 赎金信, 15. 三数之和, 18. 四数之和

    代码随想录算法训练营第七天| 哈希表理论基础 ,454.四数相加II, 383. 赎金信, 15. 三数之和, 18. 四数之和 454.四数相加II 建议:本题是 使用map 巧妙解决的问题,好好体 ...

  3. 代码随想录算法训练营第七天| 454.四数相加II 、383. 赎金信 、15. 三数之和 、18. 四数之和 。

    454.四数相加II 题目链接 给你四个整数数组 nums1.nums2.nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 <= i ...

  4. 算法笔记_218:花朵数(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 一个N位的十进制正整数,如果它的每个位上的数字的N次方的和等于这个数本身,则称其为花朵数. 例如: 当N=3时,153就满足条件,因为 1^3 + ...

  5. 21位花朵数 C语言(执行时间小于16s)

    一个N位的十进制正整数,如果它的每个位上的数字的N次方的和等于这个数本身,则称其为花朵数. 例如: 当N=3时,153就满足条件,因为 1^3 + 5^3 + 3^3 = 153,这样的数字也被称为水 ...

  6. 让 Python 代码更易维护的七种武器——代码风格(pylint、Flake8、Isort、Autopep8、Yapf、Black)测试覆盖率(Coverage)CI(JK)...

    让 Python 代码更易维护的七种武器 2018/09/29 · 基础知识 · 武器 原文出处: Jeff Triplett   译文出处:linux中国-Hank Chow    检查你的代码的质 ...

  7. 同济高数第七版上册54页例1详细证明过程

    同济高数第七版上册54页例1详细证明过程 题目如下: 证明过程: 此题需要用到等比数列前n项和公式.以1为首项,x为公比(x≠0)的数列前n项和为: 整理后得: 故对于例1,证明如下:

  8. 用git统计代码提交行数

    早上收到pmo邮件,要求统计某个时间范围内代码提交行数,一开始是懵逼的,不只如何下手,后来想到git这么强大的工具,这点小事应该能做到,于是乎搜索了一下,命令如下: git log --since = ...

  9. 【slam十四讲第二版】【课本例题代码向】【第七讲~视觉里程计Ⅱ】【使用LK光流(cv)】【高斯牛顿法实现单层光流和多层光流】【实现单层直接法和多层直接法】

    [slam十四讲第二版][课本例题代码向][第七讲~视觉里程计Ⅱ][使用LK光流(cv)][高斯牛顿法实现单层光流和多层光流][实现单层直接法和多层直接法] 0 前言 1 使用LK光流(cv) 1.1 ...

最新文章

  1. php仓储管理系统 eku_河南物流仓储外包哪里有 极鹭云仓
  2. C#事件与委托的区别
  3. Redis常用命令之操作String类型
  4. 十大经典排序算法之快速排序及其优化
  5. Java并发编程—JUC的Lock锁
  6. raft引入no-op解决了什么问题
  7. Windows环境下搭建Tomcat
  8. nginx subrequest演示示例程序
  9. Android-简单的图片验证码
  10. 机器学习-吴恩达-笔记-7-机器学习系统的设计
  11. 我是如何完美解决WIN10崩溃无法自动恢复启动问题的
  12. android中jni的调用过程,Android中JNI的调用生成头文件步骤
  13. centos 7查看CPU温度
  14. (LINPACK)HPL测试成功步骤整理
  15. WiFi开启热点冲突
  16. 植物大战僵尸修改存档文件-C1认证
  17. 解决Cipher Suites导致的“未能创建 SSL/TLS 安全通道”异常问题
  18. 粗糙集理论应用的实例
  19. 【课堂笔记】模型制作流程
  20. 51单片机 16X16点阵循环滚动显示汉字(基于proteus)

热门文章

  1. perl6检测网站CMS脚本(测试代码)
  2. C# DataTable的Distinct解决方案及表的复制
  3. thinkPhp 3.1.3的验证码无法显示的问题
  4. Javascript中char和int的互相转换的代码(转载)
  5. 在 IIS6 配置使用php的fastcgi模式
  6. JQuery通过后台获取数据遍历到前台
  7. 7-176 求n以内最大的k个素数以及它们的和 (20 分)
  8. 简化的插入排序 (15 分)
  9. AT指令联网---以鸿蒙开发板为例
  10. JavaWeb项目实战(1)数据库环境搭载