McCarthy is a famous theorician of computer science. In his work, he defined a recursive function, called f91, that takes as input a positive integer N and returns a positive integer defined as follows:
• If N ≤ 100, then f91(N) = f91(f91(N + 11));
• If N ≥ 101, then f91(N) = N − 10.
Write a program, that computes McCarthy’s f91.
Input
The input tests will consist of a series of positive integers, each integer is at most 1,000,000. There will be at most 250,000 test cases. Each number is on a line on its own. The end of the input is reached when the number ‘0’ is met. The number ‘0’ shall not be considered as part of the test set.
Output
The program shall output each result on a line by its own, following the format given in the sample output.
Sample Input
500
91
0
Sample Output
f91(500) = 490
f91(91) = 91
问题链接:UVA10696 f91
问题简述:(略)
问题分析:
这是一个数学函数计算问题,为了快打表是必要的。
程序说明:(略)
题记:(略)
参考链接:https://blog.csdn.net/tigerisland45/article/details/79319615
AC的C++语言程序如下:
/* UVA10696 f91 */
#include <iostream>
using namespace std;
const int N = 1e6; //10的六次方
int f91t[N + 1];
int f91(int n)//还是用递归计算,打表的计算只计算一次,避免重复递归(查表),只是减少递归计算的有效办法
{
if(n <= 100)
return f91(f91(n + 11)); //函数计算(根据题意)
else // if(n >= 101)
return n - 10;
}
void maketable()
{
for(int i=1; i<=N; i++)
f91t[i] = f91(i);
}
int main()
{
maketable(); //先把表打出来
int n;
while(~scanf("%d", &n) && n)
printf("f91(%d) = %d\n", n, f91t[n]);//根据表中的数据,查表
return 0;
}
注意打表、查表可以减少递归运算的次数