一个ACM的题做了几次还是错的

gig886 2011-07-23 10:49:50
Lucy上了初中,她很喜欢数学,经常做数学奥林匹克的题目,可是今天她遇到了难题,于是就向她在南开大学上学的哥哥Feagle请教,聪明的哥哥不一会功夫就编程解决了妹妹的问题(^_^,南开大学的学生就是优秀)! 妹妹的题目是这样的:对给定的f(n) 当 n>=50025002 的时候,f(n)=n-5;当 n<50025002 的时候,f(n)=f(f(n+2005))。现在请您试试编程解决Lucy的难题!
我的代码是:
#include<stdio.h>
int main()
{
int n;
printf("请输入n的值:");
scanf("%d",&n);
int f(n)
{
if( n >= 50025002)
{
return n-5;
}
else
{
return f(n + 2005);
}
}
printf("f(n) = %d\n",f(n));

return 0;
}
没提示错在哪,还请各位高手指点一二;
...全文
266 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jade0709 2011-08-02
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 gig886 的回复:]
引用 20 楼 zhangxfeng112 的回复:

引用 13 楼 zhangxfeng112 的回复:

由:
f(n)=n-5; //当 n>=50025002
f(n)=f(f(n+2005)) //当 n<50025002
推出:
f(n)=n-5; //当 n>=50025002
f(n)=f(n + 2000) //当 n<50025002


C/C++ ……
[/Quote]
f(n)=f(f(n+2005)) //当 n<50025002
退出f(n)=f(n + 2000) //当 n<50025002
还有一个前提是n+2005>=50025002
所以应该是
f(n)=n-5; //当 n>=50025002
f(n)=f(n + 2000) //当 500252-2005<n<50025002
f(n)=f(f(n+2005))//else

反例就是比如n=3时有f(3)=f(2003)吗?
LZS535261548 2011-07-23
  • 打赏
  • 举报
回复
#include<stdio.h>
int f(int n)
{
if( n >= 50025002)
{
return n-5;
}
else
{
return f(n + 2005);
}
}


int main()
{
int n;
printf("请输入n的值:");
scanf("%d",&n);

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

return 0;
}
把递归函数放在外面;定义f()时候怎么可以直接f(n)??
demobin 2011-07-23
  • 打赏
  • 举报
回复
错太多了 好好反省
银蝈蝈 2011-07-23
  • 打赏
  • 举报
回复
代码我就不写了!
明显的错误:你的代码连递归都写错了。
有一点提醒,搞ACM,代码的效率很重要~~ 你的代码可以优化~
还有就是数据的范围可能会超,用long或者__64int~
希望楼主基础知识补充一下~
好运~~
zhangxfeng112 2011-07-23
  • 打赏
  • 举报
回复
说错了,是 20楼和21楼
zhangxfeng112 2011-07-23
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 gig886 的回复:]

不完整的代码怎么提交··
[/Quote]
怎么不完整了,12楼,13楼的都可以。
只是12楼有些多余的部分,在13楼去掉了。
zhangxfeng112 2011-07-23
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 jade0709 的回复:]

引用 13 楼 zhangxfeng112 的回复:

由:
f(n)=n-5; //当 n>=50025002
f(n)=f(f(n+2005)) //当 n<50025002
推出:
f(n)=n-5; //当 n>=50025002
f(n)=f(n + 2000) //当 n<50025002


f(n)=f(n + 2000) //当 n<50025002 这个……
[/Quote]
请举个反例。
gig886 2011-07-23
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 zhangxfeng112 的回复:]

引用 13 楼 zhangxfeng112 的回复:

由:
f(n)=n-5; //当 n>=50025002
f(n)=f(f(n+2005)) //当 n<50025002
推出:
f(n)=n-5; //当 n>=50025002
f(n)=f(n + 2000) //当 n<50025002


C/C++ code

#include <stdio.h>


……
[/Quote]
不完整的代码怎么提交··
Jade0709 2011-07-23
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 zhangxfeng112 的回复:]

由:
f(n)=n-5; //当 n>=50025002
f(n)=f(f(n+2005)) //当 n<50025002
推出:
f(n)=n-5; //当 n>=50025002
f(n)=f(n + 2000) //当 n<50025002
[/Quote]

f(n)=f(n + 2000) //当 n<50025002 这个貌似有问题吧
zhangxfeng112 2011-07-23
  • 打赏
  • 举报
回复

#include <stdio.h>
int main()
{
long m;
printf("输入m:");
scanf("%ld",&m);
if(m>=50025002)
printf("\nf(m)=%ld", m-5);
else
printf("\nf(m)=%ld", 50025002 + (50025002 + 5 - n) % 2000);
return 0;
}
zhangxfeng112 2011-07-23
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 zhangxfeng112 的回复:]

由:
f(n)=n-5; //当 n>=50025002
f(n)=f(f(n+2005)) //当 n<50025002
推出:
f(n)=n-5; //当 n>=50025002
f(n)=f(n + 2000) //当 n<50025002
[/Quote]


#include <stdio.h>


long fun(long n)
{

}

void main()
{
long m;
printf("输入m:");
scanf("%ld",&m);
if(m>=50025002)
printf("\nf(m)=%ld", m-5);
else
printf("\nf(m)=%ld", 50025002 + (50025002 + 5 - n) % 2000);
}


用上面的代码提交一下看看呢。
zhangxfeng112 2011-07-23
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 zhangxfeng112 的回复:]
由:
f(n)=n-5; //当 n>=50025002
f(n)=f(f(n+2005)) //当 n<50025002
推出:
f(n)=n-5; //当 n>=50025002
f(n)=f(n + 2000) //当 n<50025002
[/Quote]
f(n)=n-5; //当 n>=50025002
f(n)=f(n + 2000) = 50025002 + (50025002 + 5 - n) % 2000; //当 n<50025002

递归证法证明:
证明 f(50025002 + 5 + x - 2000*m) = 50025002 + x // 0<=x<2000

当 m = 1时:f(50025002 + 5 + x - 2000) = f(f(50025002 + 5 + x + 5))
= f(50025002 + 5 + x) = 50025002 + x //重复将f(n)=n-5带入,结果成立
假设 m = k时:f(50025002 + 5 + x - 2000*m) = 50025002 + x 成立
接下来证明 m = k+1时也成立
f(50025002 + 5 + x - (k+1)*2000) = f(f((50025002 + 5 + x - (k+1)*2000)+ 2005))
= f(f(50025002 + 5 + (x+5) - k*2000))
= f(50025002 + (x +5))
= 50025002 + x //也成立。
gig886 2011-07-23
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 w170532934 的回复:]

lz,这题目最大的问题是用递归就会栈溢出。所以不能采取递归。退一万步来讲,如果采用递归的话,你觉得ACM出这题有意义了吗?好在这函数处理问题不是复杂,我们可以模拟函数调用。我写了个,麻烦你试试看了。
long f(long n)
{
int i = 1;
if(n>=50025002)
return (n-5);
else
{
while (n<50025002)
{
++i……
[/Quote]
不懂何为模拟函数
gig886 2011-07-23
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 seknight121 的回复:]

C/C++ code
#include<stdio.h>
#include<iostream.h>
int f(int *n)
{
if( *n>= 50025002)
*n-=5;
else
{
while(*n<50025002)
*n+=2005;
}
}


int main()
{
int n;
printf("请输入n的值:");
scanf("%d",&n);
f……
[/Quote]
呵呵~有一段时间没摸C语言了
gig886 2011-07-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hezhe1008 的回复:]

C/C++ code

#include <stdio.h>
int f(int n);
int main()
{
int n;
printf("请输入n的值:");
scanf("%d",&n);

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

return 0;
}

int f(int n)
{
if( n >= 50025002)
……
[/Quote]
就是这个意思
W170532934 2011-07-23
  • 打赏
  • 举报
回复
抱歉,刚才的那个贴错了。
long f(long n)
{
int i = 0;
if(n>=50025002)
return (n-5);
else
{
while (n<50025002)
{
++i;
n += 2005;
}
return f(n-(i*5));
}
}
W170532934 2011-07-23
  • 打赏
  • 举报
回复
lz,这题目最大的问题是用递归就会栈溢出。所以不能采取递归。退一万步来讲,如果采用递归的话,你觉得ACM出这题有意义了吗?好在这函数处理问题不是复杂,我们可以模拟函数调用。我写了个,麻烦你试试看了。
long f(long n)
{
int i = 1;
if(n>=50025002)
return (n-5);
else
{
while (n<50025002)
{
++i;
n += 2005;
}
return (n-(i*5));
}
}
zhangxfeng112 2011-07-23
  • 打赏
  • 举报
回复
由:
f(n)=n-5; //当 n>=50025002
f(n)=f(f(n+2005)) //当 n<50025002
推出:
f(n)=n-5; //当 n>=50025002
f(n)=f(n + 2000) //当 n<50025002
seKnight121 2011-07-23
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<iostream.h>
int f(int *n)
{
if( *n>= 50025002)
*n-=5;
else
{
while(*n<50025002)
*n+=2005;
}
}


int main()
{
int n;
printf("请输入n的值:");
scanf("%d",&n);
f(&n);
printf("f(n) = %d\n",n);
system("pause");
return 0;
}

要是真的是ACM题目的话递归的效率肯定达不到,因此用指针传递+while循环速度应该会快很多!
楼主应该好好学一下基础知识啊,递归都写不对啊
zhangxfeng112 2011-07-23
  • 打赏
  • 举报
回复
ACM除了结果正确,要的还有技术效率,用这样的递归,效率肯定是通不过的,用从递归公式中找到内在的规律才行,而不仅仅是表面上的递归。
加载更多回复(8)

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧