这题怎么搞?

时间:2008-05-30 09:28:00   来源:论坛整理  作者:  编辑:chinaitzhe
Lucy上了初中,她很喜欢数学,经常做数学奥林匹克的题目,可是今天她碰到了难题,于是就向她在南开大学上学的哥哥Feagle请教,聪明的哥哥不一会功夫就编程解决了妹妹的问题(^_^,南开大学的学生就是优秀)! 妹妹的题目是这样的:对给定的f(n) 当 n>=50025002 的时候,f(n)=n-5;当 n <50025002 的时候,f(n)=f(f(n 2005))。现在请您试试编程解决Lucy的难题!
Input
输入有多个测试数据,每行一个 -2147483647 <n <2147483647
Output
每行输出一个对应的f(n)
Sample Input
50025002
50025000

Sample Output
50024997
50026995

Hint
递归嵌套层数过多会导致Runtime Error 或 Memory Limit Exceeded


要害是怎么解决内存问题,是不是把递归函数专为非递归的? 怎么转啊?
网友回复:int f(int x)
{
if (x>50025002)
return x-5;
if (0 <x <50025002)
return ((a-x)/2005 1)*2000 x-5;
}
网友回复:上面那个a就是50025002
网友回复:没环境测试,可能不对哈。。
网友回复:提交了下,他说wrong answer,能说下思路吗,我没看明白..
网友回复:希奇,计算两个测试值没错,提交却说我错了,难道是我写的不对?
C/C code





Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/





#include <stdio.h>



int f(int i)

{

    if(i>=50025002)

        return i-5;

    else 

        return ((50025002-i)/2005  1)*2000 i-5;



}





int main(void)

{    

    

    int i;

    while(1==scanf("%d",&i))

        printf("%d\n",f(i));

    return 0;

}






网友回复:你机器的整型值能表示50025002???
网友回复:int显示50025002 没问题吧。。

#include "stdio.h"
int f(int x)
{
if (x <0) return 0;
return (0 <x&&x <50025002)?(((50025002-x)/2000 1)*2000 x-5):(x-5);
}
int main()
{
printf("%d\n",f(1));
printf("%d\n",f(1234));
return 0;
}
这个应该没问题了。上午的程序那个分母应该是2000。
网友回复:思路:其实小于那个数加2005 再减掉5等于就是加了2000。上午的程序那个分母是2005是没有考虑到减掉5的中途可能就已经小于那个数了。所以每次加2000直到超过那个数,再减掉5就行。
网友回复:额.还是报错
http://acm.nankai.edu.cn/p1002.html
关键字:

相关文章

    无相关信息

文章评论

共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面