C语言笔试题(求助)

wldp1006 2007-12-19 06:52:42
1 写一行表达式,判断一个数是否是2的幂(the power of 2)

2 写一个程序,运行后删除自己

3 编写程序,输入一个数,输出所有序列,如输入3 ,则输出123,132,213,231,312,321
...全文
1774 42 打赏 收藏 转发到动态 举报
写回复
用AI写文章
42 条回复
切换为时间正序
请发表友善的回复…
发表回复
HelloDan 2007-12-21
  • 打赏
  • 举报
回复
认真想下吧。12楼那个情况才是对的。
回14楼。既然大部分情况都考虑了,我可以很轻易地加一个If将0排除开来的。那个方法还是很强的。
bailing_0105 2007-12-21
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

bool is_prower_of_2(int num)
{
int res = num;
int take = 0;
int take2= 0;
while(res != 2) {
take2 = res/2;
take = res%2;
if (take==1)
return false;
else
res = take2;
}
return true;

}

main()
{
int num;
bool flag;
printf("please inter into a number:");
scanf("%d", &num);
flag = is_prower_of_2(num);
if (flag) {
printf("this number is the power of 2");
} else {
printf("this number is not the power of 2");
}
}
这个是第一个题做的一个测试程序,看看行不行!
comman_ndsc 2007-12-21
  • 打赏
  • 举报
回复
2的幂是将2左移n位,例如4的二进值是100是将2左移一位.可以看出2的幂的二进值的高位永远是1而其余位都是0,所以将其减一后原来的高位变0,其余位都是1.用运算符&正好能得出结果0,而不是2的幂所得结果肯定不是0,所以x&(x-1)这个方法正好能判断出结果,不知道我的理解对不,高手请指点.
----------------------------------------------------------
分析得很好!
pxywin 2007-12-21
  • 打赏
  • 举报
回复
2的幂是将2左移n位,例如4的二进值是100是将2左移一位.可以看出2的幂的二进值的高位永远是1而其余位都是0,所以将其减一后原来的高位变0,其余位都是1.用运算符&正好能得出结果0,而不是2的幂所得结果肯定不是0,所以x&(x-1)这个方法正好能判断出结果,不知道我的理解对不,高手请指点.
comman_ndsc 2007-12-21
  • 打赏
  • 举报
回复
PS: 抱歉,是我误解题意了。
pxywin 2007-12-21
  • 打赏
  • 举报
回复
楼上的我有点不明白 6的二进值是0x110,6&1等于0 但是6不是2的幂哦
comman_ndsc 2007-12-21
  • 打赏
  • 举报
回复
1 写一行表达式,判断一个数是否是2的幂(the power of 2)
-------------------------------------------------------------------
如果这个数不是整数的话,用一个表达式可能很困难

如果是整数的话可以这样写: 看 x & 1 是否等于0,结果为0且x本身不为0则x是2的幂,否则不是。
这个方法#define ISPOW2(X) (X)&(X-1) ?false:true的缺点是多了一次运算(x-1)。而且少了一个判断(x是否为0)

2 写一个程序,运行后删除自己
-----------------------------------------
用系统命令函数来实现:system ("del t.c"); /* t.c 是源程序 */
LineAge_Hell 2007-12-21
  • 打赏
  • 举报
回复
study
长安宁 2007-12-21
  • 打赏
  • 举报
回复
楼上的那个做移位的,思路强!
paula2008 2007-12-21
  • 打赏
  • 举报
回复
25楼的代码不错,如果有人再做下分析该多好啊
allen0228 2007-12-21
  • 打赏
  • 举报
回复
#define POW2(X) (X)&(X-1)?(TRUE):(FALSE)
这个怎么在c中实现 也就是说检测一下
p0303230 2007-12-21
  • 打赏
  • 举报
回复
学吧学吧
大家相互学习
allen0228 2007-12-21
  • 打赏
  • 举报
回复
25楼的 我学习了
nkranber 2007-12-21
  • 打赏
  • 举报
回复
第二个:
在linux下:

#include <unistd.h>
int main(int argc, char *argv[])
{
unlink(argv[0]);
}
ppppxx 2007-12-21
  • 打赏
  • 举报
回复
我的排列算法,希望指正

#include "stdafx.h"
#include "stdio.h"
#include <string>
#include <list>

using namespace std;

typedef list<string> STRINGLIST;

void Spliter(char* Sour, int Pos, int Value)
{
int Length = strlen(Sour);
*(Sour + Length + 1) = '\0';
for(int i = 0; i <= Length - Pos; i++)
{
*(Sour + strlen(Sour) - i) = *(Sour + strlen(Sour) - i - 1);
}
*(Sour + Pos) = Value + 48;
}

void Fun(int m, STRINGLIST* strlist)
{
if (m == 1)
{
strlist->push_back(string("1"));
}
else
{
STRINGLIST destlist;
Fun(m - 1, strlist);
STRINGLIST::iterator LI;
for(LI = strlist->begin(); LI != strlist->end(); LI++)
{
for(int i=0; i<= strlen((*LI).c_str()); i++)
{
char temp[100];
strcpy(temp, (*LI).c_str());
Spliter(temp, i, m);
destlist.push_back(temp);
}
}
strlist->clear();
for(LI = destlist.begin(); LI != destlist.end(); LI++)
{
strlist->push_back(*LI);
}
}
}

int main(int argc, char* argv[])
{
STRINGLIST strlist;

Fun(5, &strlist);

STRINGLIST::iterator LI;

int i = 0;

for(LI = strlist.begin(); LI != strlist.end(); LI++)
{
printf("Index=%d: %s\n", ++i, (*LI).c_str());
}

return 0;
}
Holinan 2007-12-20
  • 打赏
  • 举报
回复
3.全排列的算法是什么啊?
zengkun100 2007-12-20
  • 打赏
  • 举报
回复
if (x&(x-1))
//不是2的幂
看到上面有人说0不行,试问2的多少次方为0?

第二个,要删除原程序,在原exe运行的时候,是没有办法的,可以在exe启动之后createprocess另一个进程,把自己的句柄传过去,在那个进程里等待这个句柄signaled,然后删除原来的程序。Jeffrey Richter有一个例子

至于第三个,著名的STL里早就有现成的算法了,楼主可以去看源代码

water_cn 2007-12-20
  • 打赏
  • 举报
回复
#define ISPOW2(X) (X)&(X-1) ?false:true
佩服佩服
p0303230 2007-12-20
  • 打赏
  • 举报
回复
#include<iostream>
using namespace std;
//唯一性
bool can(long num, int n)
{
int len = 0;
while(num)
{
if(num%10 == n)
len++;
if(len >= 2)
return false;
num /=10;
}
return true;
}
//递归求全排列 num:数值、m:递归参数、n:表示1-n排列
void f(long num, int m, int n)
{
if(m > n)
return;
if(m == n)
cout << num << endl;
for(int i = 1; i <= n; i++)
{
if(can(num*10 + i, i))
f(num*10 + i, m + 1, n);
}
}

int main()
{
f(0, 0, 4);
return 0;
}
mochen5460 2007-12-20
  • 打赏
  • 举报
回复
mark
加载更多回复(22)

69,381

社区成员

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

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