个人资料Wellsleep存作业的地方日志列表 工具 帮助
2月6日

干掉DLL木马~~~

终于费尽的干死DLL木马……Kapasky报木马,Iparmar找不到,木马分析专家找不到。OK,现学现卖,用System Repair Engneering。传闻Hi jackthis扫描不到线程,真是恐怖……
 
方法:
Kapasky报找到 irjrt.dll为后门病毒,并且无法删除,怀疑挂接系统关键线程。用SRE扫描得到验证,挂接的正是重要的Rundll32.exe。找到dll的目录为windows/system32/wbem/irjit.dll,记住路径,重起进入纯DOS,del irjit.dll,重起进win,不再报马。
1月25日

二进制转八、十六进制&十进制转N进制方法

二进制转为 8 进制,可以 3 位二进制位编为一组(不够左侧补 0),然后从右边开始每三位按如下方式替换:
000 - 0, 001 - 1, 010 - 2, 011 - 3,
100 - 4, 101 - 5, 110 - 6, 111 - 7.
比如转换二进制数 1110101010100 那么分组为
001 110 101 010 100 按照转换方法对应转换
  1   6   5   2   4
所以 1110101010100(2) = 16524(8)
又如转换为 16 进制
0000 - 0, 0001 - 1, 0010 - 2, 0011 - 3
0100 - 4, 0101 - 5, 0110 - 6, 0111 - 7
1000 - 8, 1001 - 9, 1010 - A, 1011 - B
1100 - C, 1101 - D, 1110 - E, 1111 - F
此时分组为 4 位二进制数为一组
比如转换二进制 0101010100101011010,分组:
0010 1010 1001 0101 1010
   2    A    9    5    A
所以0101010100101011010(2) = 2A95A(16)
如果要 16 转 2,8 转 2,方法类似,
如果是 16 转 8,可以转换为 2 再转 8

十进制转各进制
  要将十进制转为各进制的方式,只需除以各进制的权值,取得其余数,第一次的余数当个位数,第二次余数当十位数,其余依此类推,直到被除数小于权值,最后的被除数当最高位数。
一、十进制转二进制
如:55转为二进制
2|55
27――1 个位
13――1 第二位
6――1 第三位
3――0 第四位
1――1 第五位
最后被除数1为第七位,即得110111
  二、十进制转八进制
如:5621转为八进制
8|5621
702 ―― 5  第一位(个位)
    87 ―― 6  第二位
    10 ―― 7  第三位
     1 ―― 2  第四位
最后得八进制数:127658
三、十进制数十六进制
如:76521转为十六进制
16|76521
  4726 ――5 第一位(个位)
   295 ――6 第二位
    18 ――6 第三位
     1 ―― 2 第四位
最后得1276516
二进制与十六进制的关系
2进制     0000     0001     0010     0011     0100     0101     0110     0111
16进制     0     1     2     3     4     5     6     7
2进制     1000     1001     1010     1011     1100     1101     1110     1111
16进制     8     9     a(10)     b(11)     c(12)     d(13)     e(14)     f(15)
可以用四位数的二进制数来代表一个16进制,如3A16 转为二进制为:
  3为0011,A 为1010,合并起来为00111010。可以将最左边的0去掉得1110102
  右要将二进制转为16进制,只需将二进制的位数由右向左每四位一个单位分隔,将各单位对照出16进制的值即可。
二进制与八进制间的关系
二进制     000     001     010     011     100     101     110     111
八进制     0     1     2     3     4     5     6     7
  二进制与八进制的关系类似于二进制与十六进制的关系,以八进制的各数为0到7,以三位二进制数来表示。如要将51028 转为二进制,5为101,1为001,0为000,2为010,将这些数的二进制合并后为1010010000102,即是二进制的值。
  若要将二进制转为八进制,将二进制的位数由右向左每三位一个单位分隔,将事单位对照出八进制的值即可。
12月21日

SOS!!!失败的数组实验,求高手帮忙~!

题目要求:在[3][6]的数组中,前五列储存3个学生的成绩,每行最后一列是该行的平均数。按数组格式打印(我没有写这个格式的代码)。SOS!
 
int aver(int arr[5])
{
  int i,m=0,k;
  for(i=0;i<=4;i++)
  {
   m=m+arr[i];
  }
  k=m/5;
  return k;
}
main()
{
  int i,j,a[3][6];
  for(j=0;j<=2;j++)
    {
    for(i=0;i<=4;i++)
     {
     scanf("%d",&a[j][i]);
     }
    }
  for(j=0;j<=2;j++)
    {
    for(i=0;i<=4;i++)
      {
      a[j][5]=aver(a[j][i]);
      }
    }
  for(j=0;j<=2;j++)
    {
    for(i=0;i<=5;i++)
      {
      printf("%d",a[j][i]);
      }
    }
 getch();
}
12月18日

BT的魔方阵解法@TC FROM Internet

关于魔方阵的解法

作者:unknown 更新时间: 2005-05-10    

 

首先把从1~n2的整数按从小到大的顺序排列成一个n×n的方阵A进行观察。(本文中所有n都是指大于1的奇数,下文中均以"A"代表这类顺序排列的n×n方阵)

5阶阵为例:以下是A方阵

1  2  3  4  5

6  7  8  9  10

11 12 13 14 15

16 17 18 19 20

21 22 23 24 25

下边是魔方阵B:

12 16 25 4  8

6  15 19 23 2

5  9  13 17 21

24 3  7  11 20

18 22 1  10  14

先假设n阶奇次魔方阵B是存在的,从A中可以看出,B的任一元素在A中都有唯一确定的行号和列号组合(y,x)

分离出B中所有元素在A中的行号y来构成n×n方阵I,让I(i,j)等于从B(i,j)分离出来的y(I(1,1) =3,12A中的行号A(3,2);I(1,2)=4,即16A中的行号A(4,1))以下是I方阵:

3  4  5  1  2

2  3  4  5  1

1  2  3  4  5

5  1  2  3  4

4  5  1  2  3

同样分离出B中所有元素在A中的列号y来构成n×n方阵J,让J(i,j)等于从B(i,j)分离出来的x。以下是J方阵

2  1  5  4  3

1  5  4  3  2

5  4  3  2  1

4  3  2  1  5

3  2  1  5  4

观察方阵I特征为:

 

        1.组成方阵的数为1n的整数;

 

        2.任一行、列均遍历1n的所有整数;

 

        3.主对角线上的数均为(n+1)/2,辅对角线遍历1n的所有整数。

 

方阵J特征前两点同I,区别是第三点,辅对角线上的数均为(n+1)/2,主对角线遍历1n的所有整数。 另外还有容易忽略的一点,IJ方阵对应位置上的数字组合[I(i,j)J(i,j)]是唯一的。

       综合以上的结论可以知道:B(i,j)=(I(i,j)-1)×n+J(i,j)。所以只要构造出这样两个只含1n的数的方阵IJ,就可以确定一个n×n的魔方阵。

现在,问题就转化为怎样构造分别满足IJ的特征的两个n×n方阵。其实完成这样的算法是很简单的,可以按以下方法实现:

 

1) 方阵I的第一行由(n+1)/2打头,后面依次为前一个数关于n的循环后继;

 

2)方阵I的第i+1行由第i行循环右移得到。

 

本人给出的程序:

 

main()

{

int n,i,j;

int a[20][20],x[20][20],y[20][20];/* a数组为最后结果数组文中的B方阵,XY分别是文中提到的数组IJ*/

printf("please input the number:");

scanf("%d",&n); /*输入需要的数组维数*/

 x[0][0]=(n+1)/2;

 for(j=1;j<n;j++)

  {

   if(x[0][j-1]==n) x[0][j]=x[0][j-1]+1-n;

   else            x[0][j]=x[0][j-1]+1;

 }/*x中的第一行元素赋值*/

 

for(i=1;i<n;i++)

 for(j=0;j<n;j++)

  {

    if(j-1<0) x[i][j]=x[i-1][j-1+n];

    else       x[i][j]=x[i-1][j-1];

} /*通过变换给X的所有元素赋值*/

clrscr();

printf("X:\n");

for(i=0;i<n;i++)

 for(j=0;j<n;j++)

 {

 printf("%3d",x[i][j]);

 if(j==n-1)printf("\n");

 }/*输出X数组*/

for(i=0;i<n;i++)

 for(j=0;j<n;j++)

 y[i][j]=x[i][n-1-j];/*通过文中提到的公式给Y数组赋值*/

printf("Y:\n");

for(i=0;i<n;i++)

 for(j=0;j<n;j++)

   {printf("%3d",y[i][j]);

   if(j==n-1)printf("\n");

   }/*输出Y数组*/

for(i=0;i<n;i++)

 for(j=0;j<n;j++)

   a[i][j]=(x[i][j]-1)*n+y[i][j];

printf("A:\n");

for(i=0;i<n;i++)

 for(j=0;j<n;j++)

 {printf("%5d",a[i][j]);

 if(j==n-1)printf("\n");}

/*输出A数组结果*/

 

 }

 

 

12月12日

筛法求100以内素数@WinTC By YYH

佩服死他了~自学能有如此成就……
 
#include <stdio.h>
#define N 100  /*划定寻找质数范围在100以内*/
main ()
{
 int a[N]; 
 int i,j;
 for (i=1;i<=N;i++)
  {a[i-1]=i;}
 for (i=2;i<=N-1;i++)
 {
  for (j=1;j<=N-1;j++)
  {
   if (a[j]/i>=2&&a[j]%i==0)/*筛法*/
   a[j]=0;                  /*消去合数*/
  }
 }
 for (i=0;i<=N-1;i++)
 if (a[i]!=0&&a[i]!=1)/*只打印剩下的质数*/
  printf ("%4d",a[i]);
 getch ();
}
 
/*开头的define就把我镇住了,汗,忘记应该用这个定义常数*/
12月10日

求“水仙花数”@WinTC

水仙花数意味,三位数各个数位的数字的立方等于该三位数。
/*ShXHua.c -- <1000 ShuiXianHua shu */
 
#include "stdio.h"
#include "math.h"
int cube(int x)  /*第一次用子函数,好方便*/
 { int k;
   k=pow(x,3);
   return(k);
 }
 
main()
{
  int a,b,c,i;
  for(i=100;i<=999;i++)
   {
     a=i/100;  /*求百位数字*/
     b=(i/10)%10;  /*求十位数字,想出这个方法感觉挺爽的*/
     c=i%10;  /*求个位数字*/
     if(i==cube(a)+cube(b)+cube(c)) /*这一行的“==”真是把我害苦了,先前写的“=”被当作赋值*/
     printf("%d is a ShuiXianHua No.\n",i);
   }
   getch();
}

求"n+nn+nnn+...+n位数"每一位为n的数@Win-TC

/*  n_num.C -- N sum */
 
#include "stdio.h"
#include "math.h"
main()
{
    int i,n,s,k,w=0;
    scanf("%d,%d",&n,&k);  /*n为位数,k为每一位的数字*/  
    for(i=1;i<=n;i++)
      {s=k*i*pow(10,n-i);
      w=w+s;}
    printf("%d\n",w);
    getch();  /*神奇的WinTC在XP环境下必须加上的函数,似乎用来暂停*/
}
 
尚未添加列表。