首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • C语言笔试题(求助) [已结贴,结贴人:wldp1006]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-12-19 18:52:42 楼主
    1  写一行表达式,判断一个数是否是2的幂(the power of 2)

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

    3 编写程序,输入一个数,输出所有序列,如输入3 ,则输出123,132,213,231,312,321
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-12-19 19:04:181楼 得分:0
    // the 1st
    #include <bitset>
    using namespace std;

    bool is_power_of_2( const unsigned int &ui)
    {
      bitset <32>b ( ui );
      return( 1 == b.count() );
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-12-19 19:07:122楼 得分:0
    1.是整数吗?
    2.写一个脚本,执行脚本就行了,或者采用remote thread inject
    3.全排列
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-12-19 19:11:213楼 得分:0
    好难!等高手ing
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-12-19 19:24:184楼 得分:0

    //我是菜鸟,水平不怎么样,有比较好的 楼主也要发上来啊
    #include <stdio.h>
    void main()
    {
    int i,j,k,a,n;
    scanf("%d",&n);
    if(n <1) printf("error");
    else if(n==1) printf("%d",n);
    else if (n==2) printf("12 21");
    else {
    switch(n)
    {
    case 3:
    for(i=1;i <=n;i++)
    for(j=1;j <=n;j++)
    for(k=1;k <=n;k++)
    if(i!=j&&i!=k&&j!=k)
    printf("%d%d%d ",i,j,k);
    printf("\n");
    case 4:
    for(i=1;i <=n;i++)
    for(j=1;j <=n;j++)
    for(k=1;k <=n;k++)
    for(a=1;a <=n;a++)
    if(i!=j&&i!=k&&j!=k&&i!=a&&j!=a&&k!=a)
    printf("%d%d%d ",i,j,k,a);
    printf("\n");

    }
    }
    }

    /*只写了1-4这个是最笨的方法
    还可以将后面的简化
    给个例子给你自己琢磨一个*/
    #include <stdio.h>
    void main()
    {
            int i,j,k;
            for(i=1;i <=2;i++)
            {
                    for(j=i+1;j <=3;j++)
                    {
                            for(k=j+1;k <=4;k++)
                            {
                                    printf("%d\n",100*i+10*j+k);
                                    printf("%d\n",100*i+10*k+j);
                                    printf("%d\n",100*j+10*i+k);
                                    printf("%d\n",100*j+10*k+i);
                                    printf("%d\n",100*k+10*i+j);
                                    printf("%d\n",100*k+10*j+i);
                            }
                    }
            }
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-12-19 19:25:455楼 得分:0
    我写的是3
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-12-19 19:44:276楼 得分:0
    the 3rd:
    C++ standard library提供了两个生成排列的algorithms:next_permutation()与prev_permutation()

    so, help yourself to do with that.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-12-19 20:10:557楼 得分:0
    这是我今天的笔试题,没做出来,所以求助大家啊!!!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-12-19 20:27:228楼 得分:2
    c++库函数 以及pow(2, log(n)/log(2)) == n

    问题2 就不太清楚是什么意思了,是free吗,空间free掉,还是什么
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-12-19 20:36:359楼 得分:2
    1. 这个貌似看到过 ,
    C/C++ code
    #define POW2(X) (X)&(X-1)?(TRUE):(FALSE)// 判断是不是2的幂
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-12-19 20:40:4810楼 得分:2
    Top
    3 楼Rainsea(飞龙在天)回复于 2002-08-22 18:29:32 得分 100

    运行后,才被自身删除吧!? 
      要不程序怎么正确启动呢? 
     
      我的做法: 
      用过DOS的朋友应该还记得批处理文件吧,新建一个批处理文件a.bat,编辑其内容为:del  %0,然后运行它,怎么样?a.bat把自己删除掉了!!!好,我们就用它来进行程序的“自杀”! 
        找一个EXE可执行文件,比如说abc.exe,新建一个批处理文件a.bat,编辑其内容为: 
      :pp 
      del  abc.exe 
      if  exist  abc.exe  goto  pp 
      del  %0 
      先运行abc.exe,再运行a.bat,然后将abc.exe退出,你会发现a.exe和a.bat都没有了!!!按照这个思路,我们可以在程序中根据文件名称写一个批处理,将上面的abc.exe换成自己的EXE文件名就可以了。运行Delphi,新建一个工程,添加一个Button到窗体上,点击 Button,写下如下代码: 
     
      procedure  TForm1.Button1Click(Sender:  TObject); 
      var  Selfname,BatFilename,s1,s2:string; 
      BatchFile:  TextFile; 
      begin 
      Selfname:=Extractfilename(application.exename);//取EXE文件自己的名称 
      BatFilename:=ExtractFilePath(Application.ExeName)+  'a.bat';//批处理文件名称 
      S1:='@del  '+Selfname; 
      S2:='if  exist  '+Selfname+'  goto  pp'; 
      assignfile(BatchFile,BatFilename); 
      rewrite(BatchFile); 
      writeln(BatchFile,':pp'); 
      writeln(BatchFile,S1); 
      writeln(BatchFile,S2); 
      writeln(BatchFile,'@del  %0'); 
      closefile(BatchFile); 
      winexec(pchar(BatFilename),sw_hide);//隐藏窗口运行a.bat 
      application.Terminate;//退出程序 
      end; 
        那我们的事情是不是就完了?NO!上面的程序原理是对的,但如果你的程序是运行在系统目录下如Windows目录下或者Windows\System等目录下,除非你打开那个目录看着它删除,否则根本没法卸掉的。这可能是因为Windows对系统目录有保护功能,那怎么办?别急,我们请出一个函数CreateProcess,它的原型为: 
      BOOL  CreateProcess( 
      LPCTSTR  lpApplicationName,  //  pointer  to  name  of  executable  module   
      LPTSTR  lpCommandLine,  //  pointer  to  command  line  string 
      LPSECURITY_ATTRIBUTES  lpProcessAttributes,  //  pointer  to  process  security  attributes   
      LPSECURITY_ATTRIBUTES  lpThreadAttributes,  //  pointer  to  thread  security  attributes   
      BOOL  bInheritHandles,  //  handle  inheritance  flag   
      DWORD  dwCreationFlags,  //  creation  flags   
      LPVOID  lpEnvironment,  //  pointer  to  new  environment  block   
      LPCTSTR  lpCurrentDirectory,  //  pointer  to  current  directory  name   
      LPSTARTUPINFO  lpStartupInfo,  //  pointer  to  STARTUPINFO   
      LPPROCESS_INFORMATION  lpProcessInformation  //  pointer  to  PROCESS_INFORMATION   
      ); 
      这个函数和OpenProcess、ReadProcessMemory、WriteProcessMemory使用可以用来读取和修改内存数据,常用的游戏修改器就是用它。由于这些不是本文的重点所以这里不作详细介绍,感兴趣的读者可自行翻阅Delphi自带的帮助文件。用CreateProcess函数创建一个进程就可以完美的完成我们的“程序自杀”了。 
      运行Delphi,新建一个工程,添加一个Button到窗体上,全部代码如下: 
     
      unit  Unit1; 
     
      interface 
     
      uses 
      Windows,  Messages,  SysUtils,  Classes,  Graphics,  Controls,  Forms,  Dialogs, 
      StdCtrls; 
      type 
      TForm1  =  class(TForm) 
      Button1:  TButton; 
      procedure  My_DeleteMe;  //自定义程序自杀过程 
      procedure  Button1Click(Sender:  TObject); 
      private 
      {  Private  declarations  } 
      public 
      {  Public  declarations  } 
      end; 
     
      var 
      Form1:  TForm1; 
     
      implementation 
     
      {$R  *.DFM} 
     
      procedure  TForm1.Button1Click(Sender:  TObject); 
      begin 
      My_DeleteMe; 
      end; 
      procedure  TForm1.My_DeleteMe;  //程序自杀 
      var 
      BatchFile:  TextFile; 
      BatchFileName:  string; 
      ProcessInfo:  TProcessInformation; 
      StartUpInfo:  TStartupInfo; 
      begin 
      {By  Lovejingtao.http://Lovejingtao.126.com,Lovejingtao@21cn.com} 
      BatchFileName  :=  ExtractFilePath(ParamStr(0))  +  '$$a.bat'; 
      AssignFile(BatchFile,  BatchFileName); 
      Rewrite(BatchFile); 
      Writeln(BatchFile,  ':try'); 
      Writeln(BatchFile,  'del  "'  +  ParamStr(0)  +  '"'); 
      Writeln(BatchFile, 
      'if  exist  "'  +  ParamStr(0)  +  '"'  +  '  goto  try'); 
      Writeln(BatchFile,  'del  "'  +  BatchFileName  +  '"'); 
      Writeln(BatchFile,  'cls'); 
      CloseFile(BatchFile); 
      FillChar(StartUpInfo,  SizeOf(StartUpInfo),  $00); 
      StartUpInfo.dwFlags  :=  STARTF_USESHOWWINDOW; 
      StartUpInfo.wShowWindow  :=  SW_HIDE; 
      if  CreateProcess(nil,  PChar(BatchFileName),  nil,  nil, 
      False,  IDLE_PRIORITY_CLASS,  nil,  nil,  StartUpInfo, 
      ProcessInfo)  then 
      begin 
      CloseHandle(ProcessInfo.hThread); 
      CloseHandle(ProcessInfo.hProcess); 
      end; 
      Application.Terminate; 
      end; 
      end. 

     

    http://topic.csdn.net/t/20020822/18/962406.html
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-12-19 20:41:5411楼 得分:1
    题目1 :pow(2,  log(n)/log(2))  ==  n
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-12-19 21:11:4412楼 得分:1
    C/C++ code
    #define ISPOW2(X) (X)&(X-1) ?false:true


    一个牛人以前在csdn上写的,比楼上的好用
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-12-19 21:46:3513楼 得分:0
    //  the  1st 
    C/C++ code
    int a = 8; while (!(a&1) && (a>>=1) ); if (a == 1) { printf("YES"); } else { printf("NO"); }


    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-12-19 21:55:4714楼 得分:2
    #define ISPOW2(X)  (X)&(X-1) ?false:true

    当X = 0 的时候, 这个就不对了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yu_xm
    • 等级:
    发表于:2007-12-19 21:57:1215楼 得分:0
    #define POW2(X)  (X)&(X-1)?(TRUE):(FALSE)// 判断是不是2的幂

    9楼强
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-12-19 22:12:3316楼 得分:0
    0 为2的n次方

    看看这个
    http://topic.csdn.net/u/20071031/22/16c91473-34b3-4f00-96d0-b68a6728cf24.html
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-12-19 22:13:2717楼 得分:0
    我在9楼写反了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yu_xm
    • 等级:
    发表于:2007-12-19 22:17:3818楼 得分:0
    atexit()在main函数退出后执行的
    这个能删除自己吗
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-12-20 11:05:2919楼 得分:0
    3.全排列的算法是什么啊?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • visulcer
    • 等级:
    发表于:2007-12-20 14:25:4120楼 得分:0
    // 自删除
    HMODULE module = GetModuleHandle(0);
    CHAR buf[MAX_PATH];
    GetModuleFileName(module, buf, sizeof buf);
    CloseHandle(HANDLE(4));
    __asm
    {
    lea eax, buf;
    push 0;
    push 0;
    push eax;
    push ExitProcess;
    push module;
    push DeleteFile;
    push UnmapViewOfFile;
    ret;
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • visulcer
    • 等级:
    发表于:2007-12-20 14:27:5721楼 得分:0
    o,楼上的错了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-12-20 15:06:5522楼 得分:0
    #define  ISPOW2(X)    (X)&(X-1)  ?false:true
      好方法!!!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-12-20 17:11:0223楼 得分:0
    9楼的方法太妙了!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-12-20 17:17:3524楼 得分:0
    mark
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-12-20 17:42:4025楼 得分:2
    C/C++ code
    #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; }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-12-20 21:40:2826楼 得分:0
    #define      ISPOW2(X)          (X)&(X-1)      ?false:true
    佩服佩服
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-12-20 22:35:4827楼 得分:0
    if (x&(x-1))
      //不是2的幂
    看到上面有人说0不行,试问2的多少次方为0?

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

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

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-12-21 00:40:4228楼 得分:2
    认真想下吧。12楼那个情况才是对的。
    回14楼。既然大部分情况都考虑了,我可以很轻易地加一个If将0排除开来的。那个方法还是很强的。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-12-21 08:45:0329楼 得分:0
    study
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • comman_ndsc
    • 等级:
    发表于:2007-12-21 09:52:3330楼 得分:0
    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 是源程序 */
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-12-21 09:57:5431楼 得分:0
    楼上的我有点不明白 6的二进值是0x110,6&1等于0 但是6不是2的幂哦
    修改 删除 举报 引用 回复