淘宝笔试题 大家来看看啊

xuanweizi0612 2008-10-09 11:14:35
如果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

编程用c/c++
...全文
3675 65 打赏 收藏 转发到动态 举报
写回复
用AI写文章
65 条回复
切换为时间正序
请发表友善的回复…
发表回复
swingboard 2011-10-07
  • 打赏
  • 举报
回复
递归的思想很不错
test-20131128 2011-03-27
  • 打赏
  • 举报
回复
[Quote=引用 63 楼 tangwenxue925 的回复:]
引用 2 楼 richbirdandy 的回复:
引用 1 楼 ProgrammerNO1 的回复:
题目有问题

没问题 老题了 近4原则 即考虑二进制位最后两位
01 -1
11 +1


近4原则,学习了~
[/Quote]

3确实比较特殊,需特殊处理,长见识中……
test-20131128 2011-03-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 richbirdandy 的回复:]
引用 1 楼 ProgrammerNO1 的回复:
题目有问题

没问题 老题了 近4原则 即考虑二进制位最后两位
01 -1
11 +1
[/Quote]

近4原则,学习了~
renxufang 2010-03-12
  • 打赏
  • 举报
回复
谢谢分享!!!
IAC378206 2009-10-14
  • 打赏
  • 举报
回复
#include <iostream>

using namespace std;

class CToOne
{
public:
int ToOne(int n)
{
int temp = 0;
int min = 0;

if(n == 0 || n == -1)
{
cout<<n<<std::endl;
return 1;
}

if(n == 1)
{
//cout<<n<<std::endl;
return 0;
}

if(n % 2 == 0)
{
cout<<n<<"/"<<2<<std::endl;
return ToOne(n / 2) + 1;
}
else //ToOne(2n+1)
{
temp = ToOne((n-1) / 2); //ToOne(n)
min = ToOne((n+1) / 2); //ToOne(n+1)

if(min < temp)
{
cout<<2<<"*"<<(n+1) / 2<<"+2"<<std::endl;
}
else
{
min = temp;
cout<<2<<"*"<<(n-1) / 2<<"+2"<<std::endl;
}

return min + 2;
}

}
};

int main(int argc, char** args)
{
CToOne toOne;
cout<<toOne.ToOne(-61)<<std::endl;

return 0;
}
shouwangzhe405 2009-10-13
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

int main(void)
{
int n;
cin >> n;
int stepcount = 0;

while (n > 1)
{
if (n == 3)
{
cout << ++stepcount << ":" << 2 <<endl;
cout << ++stepcount << ":" << 1 <<endl;
break;
}
else if (n % 2 == 0)
{
n /= 2;
}
else if ((n&3) == 3)
{
++n;
}
else
{
--n;
}

++stepcount;
cout << stepcount << ":" << n <<endl;
}

return 0;
}

近4原则,就是让他能够连续除2次。
soarlers 2009-04-23
  • 打赏
  • 举报
回复
#include<iostream>

using namespace std;

int main(){
int num,count=0;
cout<<"请输入一个正整数:";
cin>>num;
while(num!=1){
count++;
if(num%2!=0){
if(num&3==3) {num--;count++;cout<<"-- "<<num<<endl;}
else {num--;count++;cout<<"++ "<<num<<endl;}
}
num/=2;cout<<"/2 "<<num<<endl;
}
cout<<endl<<"总步数:"<<count;

return 0;
}

上面这个运行起来有点错误,红色的是错的
应该改成if((num&3)==1)
好像优先级有点错,而且应该也不是这么个判断法,输入3的时候就也得考虑了,3->2->1
ronliu 2008-10-29
  • 打赏
  • 举报
回复
int divideNum(int a)
{
int ret = 0;
while(a != 1)
{
ret++;
if(a%2 == 0)
a = a >> 1;
else
{
if(a%4 == 1 || a/4 == 0) //特殊情况1和3
a = a - 1;
else if(a%4 == 3)
a = a + 1;
}
}
return ret;
}
  • 打赏
  • 举报
回复
[Quote=引用 44 楼 richbirdandy 的回复:]
大哥们 比4小的就三个数 处理一下不就完了

4楼和23楼的兄台 希望你们不是像我一样正在找工作 不然比我还凄惨。。。
[/Quote]

这位,晒晒你的学校?
不过就是个算法,知道就知道了,不知道当然就不知道,这也没什么阿,靠一个算法就觉得你多强?真臭屁
  • 打赏
  • 举报
回复
这位,晒晒你的学校?
不过就是个算法,知道就知道了,不知道当然就不知道,这也没什么阿,靠一个算法就觉得你多强?真臭屁
  • 打赏
  • 举报
回复
应该是近2的n次方原则(n越大越好),不能近则奇数-1,偶数直接无视/2,这个前提下应该好写了。
xiao9900 2008-10-13
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 Allen_zhang 的回复:]
今天无聊写了一个,供大家参考


C/C++ code
#include "stdafx.h"
#include <iostream.h>
#include <process.h>
#include <string.h>
#include <stdlib.h>

#define BIT_GET(var, bit) ((var >> bit) & 0x01)

void main(int argc, char* argv[])
{
while ( true )
{
char cInChar[20] = {0};
cout<<"input number or exit:";
cin>>cInChar;
if ( strstr( cInChar,…
[/Quote]

你程序还是有问题地
你输入3,或者3的2n倍数试下
Gengoo 2008-10-13
  • 打赏
  • 举报
回复
确实不错的算法
  • 打赏
  • 举报
回复
奇数应该是近2的n次方原则(n越大越好),不能近则奇数-1,偶数直接无视/2,这个前提下应该好写了。

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

void serch_num(int num)
{
int i,te,pnum,ht_num,lt_num;
te=1;
pnum=num;
if(pnum%2==0)
{
num=pnum/2;
printf("%d/2=%d\n",pnum,num);
}
else
{
ht_num=pnum+1;
lt_num=pnum-1;
for(i=1;i<1000;i++)
{
te=te*2;
if(ht_num%te!=0&<_num%te!=0)
break;
else if(ht_num%te==0&<_num%te!=0)
{
printf("%d+1=%d\n",pnum,ht_num);
num=ht_num;
break;

}
else if(ht_num%te!=0&<_num%te==0)
{
printf("%d-1=%d\n",pnum,lt_num);
num=lt_num;
break;
}
}
}
if(num>=2)
serch_num(num);
}

void main()
{
int num=61;
serch_num(num);
}
61-1=60
60/2=30
30/2=15
15+1=16
16/2=8
8/2=4
4/2=2
2/2=1
Press any key to continue
lunarfan 2008-10-13
  • 打赏
  • 举报
回复
如果是偶数不断的右移1位,最后为0然后+1
如果是奇数不断的右移1位,直到剩下最后一位1.
lunarfan 2008-10-13
  • 打赏
  • 举报
回复
偶数除到0然后加1
lunarfan 2008-10-13
  • 打赏
  • 举报
回复
管他是什么不停的除2,奇数刚好1,偶数加161/2=30/2=15/2=7/2=3/2=1-1=0
shunzi__1984 2008-10-12
  • 打赏
  • 举报
回复
mark
fsy412 2008-10-12
  • 打赏
  • 举报
回复
广度优先
Kasmile 2008-10-12
  • 打赏
  • 举报
回复
mark..
加载更多回复(45)

65,211

社区成员

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

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