小学数学题,你会吗?

  一日,某小学生问作业:“将16分解为若干素数的和,求这些素数积的最大值”。不禁被吓了一跳。怎么小学生的数学题变得这么难了?  细细询问,小学生没学不等式,没学数学归纳法……。那么只能用最笨的办法——穷举,一个个地试的办法来解决。  穷举之道,在于一一举来,不多不少;而不多不少,则在于有条有理,服务器空间,从容不乱。  小于16的素数依次为:2,3,5,7,11,13。显然,最大积是16和{2,3,5,7,11,13}的函数,将这个最大积记为    F(16,{2,3,5,7,11,13})  该最大积中可能有素因子2也可能没有,因此

    F(16,{2,3,5,7,11,13}) =      MAX(         2 * F(14 ,{2,3,5,7,11,香港空间,13}) ,         F(16 ,{3,5,7,11,13} ) ,       )  同理,    F(14,{2,3,5,7,香港服务器,11,13}) =      MAX(         2 * F(12 ,{2,3,5,7,11,13}) ,         F(14 ,{3,5,7,11,13} ) ,       )

    F(16,{3,5,7,11,13}) =      MAX(         3 * F(3 ,{2,3,5,7,11,13}) ,         F(16 ,{5,7,11,13} ) ,       )    ……  由此不难看出这构成了一个递归过程,终止的条件为F(n,{})中的素数集合为空或n<=0。  下面用C语言描述这个过程。  用程序解决问题显然不应该只解决分解16这样单独的问题,而应该至少能解决一类问题。为此将问题描述为:  将正整数n分解为若干素数的和,求这些素数积的最大值。

#include <stdio.h>void input( unsigned * );unsigned maxmul( unsigned , 素数集合类型 );unsigned maxmul_( unsigned , 素数集合类型 );unsigned max( unsigned , unsigned );int main( void ){unsigned n ;素数集合类型 素数集合; //这里需要一个素数集合;input( &n );//输入n printf(, maxmul( n , 素数集合 ) ); ;}unsigned max( unsigned u1 , unsigned u2 ){return u1 > u2 ? u1 : u2 ;}unsigned maxmul_( unsigned n , 素数集合类型 素数集合 ){if ( 素数集合为空 || n < 素数集合中的最小元素 ){return 0;}if ( n == 素数集合中的某个元素 ){return n;}return max (素数集合中的某元素 * maxmul_( n – 素数集合中的某元素 , 素数集合 ) ,maxmul_( n , 素数集合删掉一个元素 ));}unsigned maxmul( unsigned n , 素数集合类型 素数集合 ){;return maxmul_( n , 素数集合 );}void input( unsigned * p ){ puts( ); scanf( , p );}人生就像是一场旅行,遇到的既有感人的,

小学数学题,你会吗?

相关文章:

你感兴趣的文章:

标签云: