基于递归的国王分财产问题的求解方法(C语言版)

题目叙述

某国王临终前给儿子们分财产。他把财产分为若干份,然后给第一个儿子一份,再加上剩余财产的1/10;给第二个儿子两份,再加上剩余财产的1/10;……;给第i个儿子i份,再加上剩余财产的1/10。每个儿子都窃窃自喜,以为得到了父王的偏爱,孰不知国王是“一碗水端平”的。请回答老国王共有几个儿子?财产共分成了多少份?

程序清单

#include<stdio.h>

int f(int n,int m){                 // 表示第 n 个孩子看到的财产数量(前一个孩子分后剩下的) 
    m = m - n;
    if( m%10==0 ){              // 判断 m 能否被10整除 
        if(m==0)                    // 递归出口,第 n 个孩子分完剩下的应该是 0,
        {
            return n;                // 当 m 等于 0 时,对应的 n 就是孩子的数量
        }else{
            m=m/10*9;            // 下一个孩子看到的财产数量 
            f(n+1,m);               // 递归判断每个孩子是否符合题意,直至最后剩下的是 0。 
        }
    }else{
        return 0;
    }
}
int main(){
    int m = 2;        // m 等于1时,对应于1个孩子的情况,因为有i个情况,所以m从2开始探测。
    bool endSearchFlag = false;                    // 结束 m 探测的标志 ,找到符合题意的 m 时为真 
    while(endSearchFlag==false){
        int n = f(1,m);
        if( n != 0){
            printf("国王共有 %d 份财产,%d 个儿子。\n",m,n);
            endSearchFlag = true;        
        }else{
            m++;
        }
    }    
    return 0;
}

运行结果

猜你喜欢

转载自blog.csdn.net/tangguofeng/article/details/143026201