一道笔试题

zengkun100 2007-01-13 04:55:32
Trilogy公司的笔试题

如果n为偶数,则将它除以2,
如果n为奇数,则将它加1或者减1。
问对于一个给定的n,怎样才能用最少的步骤将它变到1。
例如:
n= 61
n-- 60
n/2 30
n/2 15
n++ 16
n/2 8
n/2 4
n/2 2
n/2 1


我的想法是这样的:
当n为偶数时,没得选择,除以2就好。所以关键是看对奇数时怎么处理。
当n为奇数时,如果为1,就结束了,如果不为1,那肯定可以表示成下面得等式:
n=m*2+1
此时选择对n是加1还是减1呢?
如果上式中的m是偶数的话,那n减1,因为m可以继续除以2。如果m是奇数的话,n加1,再除以2之后得到m+1,m+1是偶数可以继续除以2。当然n为3的时候应该减去1。

我觉得基本上就是“贪心”的思想。
...全文
445 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
zengkun100 2007-01-14
  • 打赏
  • 举报
回复
fosjos(无聊的菜鸟程序员)
对3的处理不好,

因为3应该是:
3-1=2;
2/2=1
而不是
3+1=4;
4/2=2;
2/2=1
renzaijiang 2007-01-13
  • 打赏
  • 举报
回复
忘了打印后 return
renzaijiang 2007-01-13
  • 打赏
  • 举报
回复
int k=0;
void findpath(int n,int pathcount)
{
if(n==1)
{
for(int i=0;i<k;i++)
cout<<path[i]<<" ";
cout<<"经过了"<<k<<endl;
}
if(n%2==0)
{
path[k++]=2;
findpath(n/2,pathcount+1);
}
else
{
for(int j=-1;j<=1;j+=2)
path[k++]=j;
findpath(n+i,pathcount+1);
k--;
}
}




fosjos 2007-01-13
  • 打赏
  • 举报
回复
if(n&1==0)
n >>= 1;
else if(n&3==3)
n ++;
else
n --;

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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