社区
C++ 语言
帖子详情
淘宝笔试题 大家来看看啊
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
打赏
收藏
淘宝笔试题 大家来看看啊
如果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++
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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;
}
美伊小公主的奶爸
2008-10-16
打赏
举报
回复
[Quote=引用 44 楼 richbirdandy 的回复:]
大哥们 比4小的就三个数 处理一下不就完了
4楼和23楼的兄台 希望你们不是像我一样正在找工作 不然比我还凄惨。。。
[/Quote]
这位,晒晒你的学校?
不过就是个算法,知道就知道了,不知道当然就不知道,这也没什么阿,靠一个算法就觉得你多强?真臭屁
美伊小公主的奶爸
2008-10-16
打赏
举报
回复
这位,晒晒你的学校?
不过就是个算法,知道就知道了,不知道当然就不知道,这也没什么阿,靠一个算法就觉得你多强?真臭屁
猫已经找不回了
2008-10-13
打赏
举报
回复
应该是近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
打赏
举报
回复
确实不错的算法
猫已经找不回了
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)
淘宝
笔试题
及答案
/*
淘宝
笔试题
: 给定一个字符串, 比如"我爱alibaba", 写个函数截取字符串, 比如:我截取前5个字节, 为 “我爱a”, 接3个字节, 就是 “我爱", 半个汉字的就必须截取完 */ #include
#include
char* subString(const char* str, int nSubLength) { if (str == nullptr) return nullptr; int nLength =
淘宝
2012校园招聘
笔试题
淘宝
2011.9.21校园招聘会
笔试题
一、单选题 1、我们有很多瓶无色的液体,其中有一瓶是毒药,其它都是蒸馏水,实验的小白鼠喝了以后会在5分钟后死亡,而喝到蒸馏水的小白鼠则一切正常。现在有5只小白鼠,请问一下,我们用这五只小白鼠,5分钟的时间,能够检测多少瓶液体的成分(C)
淘宝
校园
笔试题
鸡蛋与篮子
淘宝
校园
笔试题
goengine N 个鸡蛋放到 M 个篮子中,篮子不能为空,要满足:对任意不大于 N 的数量,能用若干个 篮子中鸡蛋的和表示。 写出函数,对输入整数 N 和 M,输出所有可能的鸡蛋的放法。 比如对于 9 个鸡蛋 5 个篮子 解至少有三组: 1 2 4 1 1 1 2 2 2 2 1 2 3 2 1 /* 64、
淘宝
校园
笔试题
goengine N 个鸡蛋放到 M 个篮子中,篮子不...
2015秋季校招
淘宝
笔试题
今天的
淘宝
笔试题
1.输出二叉树某一层结点(从左到右) 把输出二叉树第K层结点转换成:分别输出"以该二叉树根结点的左右子树为根的两棵子树"中第K-1层结点。 void PrintNodeAtLevel(Node *root , int level) { if(!root
C++ 语言
65,211
社区成员
250,514
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章