logo资料库

递归算法 国王分财产.doc

第1页 / 共2页
第2页 / 共2页
资料共2页,全文预览结束
(二) 题目二:国王分财产。某国王临终前给儿子们分财产。他把财产分为若干份,然后给第一 个儿子一份,再加上剩余财产的 1/10;给第二个儿子两份,再加上剩余财产的 1/10;……;给 第 i 个儿子 i 份,再加上剩余财产的 1/10。每个儿子都窃窃自喜。以为得到了父王的偏爱,孰不 知国王是“一碗水端平”的。请用程序回答,老国王共有几个儿子?财产共分成了多少份? 1. 题目分析 此题与第一题类似,由题“一碗水端平”可知最终每个儿子得到的份数都相等,“给第 i 个儿子 i 份,再加上剩余财产的 1/10”可知,最后财产应该是没有剩余的,而 0 的 1/10 还是 0,所以第 i 个儿子得到的,就是 i 份,与上一题 f[n]=n 是一个意思,通过推导, 此题份数应为 9 的倍数。 2. 算法构造 由 f[i+1]%9!=0 表示份数应该为 9 的倍数,因为 f[]为整型,是 9 的倍数,所以要%9 判 断一下结果,第 i 个儿子是 i 份,则推导 i-1 个儿子的份数,第 i-1 个儿子拿完 i-1 份之 后,又拿了剩余的 1/10,则剩余的 9/10 给了第 i 个儿子,则剩余为 i*10/9,由此推出 f[i]=f[i+1]*10/9+i。 for(i=n-1;i>=1;i--) { if(f[i+1]%9!=0) break; else f[i]=f[i+1]*10/9+i; } 3. 算法实现 #include void main() { int f[100],i=0,n=0; while(1==1) { n=n+9; f[n]=n; for(i=n-1;i>=1;i--) { if(f[i+1]%9!=0) break; else f[i]=f[i+1]*10/9+i; } if(i=1) break; } printf("共有%d个儿子\n财产分为%d份",n,f[1]); getchar(); }
分享到:
收藏