(二) 题目二:国王分财产。某国王临终前给儿子们分财产。他把财产分为若干份,然后给第一
个儿子一份,再加上剩余财产的 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();
}