dedecms织梦内容管理系统    
首页 | java | C/C++ | PHP | 操作系统 | ajax | 脚本编程 | 安全技术 | 本站下载页 | flex | CRM | 专题 | QQ群 | 测试中心 | 会员中心 | 积分规则
  当前位置:主页>C/C++>文章内容
算法学习笔记之二
来源: 作者:sidney

      先说数组,很简单,就是一组数,不过这组数有点特性:

      1、数组中的类型都是同一类型,数组的长度在创建时被确定,并且在创建后不变。解释下,声明一个数组的方法是int i[5];,它的意思就是i是个整数(int)类型的数组,它能容纳的最多元素是5个,且元素都必须是整数类型的。                                                                     

      2 、在JAVA语言中,数组是个对象,所以创建数组的应与创建对象一样也是用关键字new来创建的,举个例子,s=new char[20];p=new int[50];。。。 

         在C语言中,数组是个数据,它与JAVA语言相比较,在C语言中,创建一个数组则是与创建一个数据一样,例如int a[5];它表示a是整数(int)类型的数组,它能容纳的最多的整数类型的元素为5个。

      3、数组在被创建后,其元素被自动初始化了,字符元素被初始化为“\u0000”,而对于对象数组都被初始化为null,如果你不初始化的话,在内存中是找不到它的位置。

      4、数组的第一个元素记作第0个,i[0]是数组i的第一个元素。

 

         现在假设a是数组,现在要创建一个数组,应该为int a[4];我们现在研究的是算法,而算法是研究数据的,所以我们研究数组一般都是以C语言为基础的。例如int a[4];它代表什么呢?代表的是a为整数类型的数组,它能容纳的最多元素为4个,切必须是整数类型的。在这里说明下"[ ]"中代表的数字是数组能容纳的最多元素的取值,当然元素也可以少于这个长度,这样结果是在内存中有它的地址,而不会有它的数据。int a[4];代表的是数组。。那么char s[50];呢??

         我们说过,数组的第一位记作“0”,也就是从0开始。举一个例子,int a[4];a[0]=1;

         举一个例子:

        int a[4];

        a[0]=1;

        代表什么?

它代表的是这个整型数组的第一个元素是1;那么:

        int main

       {

           int a[4]={5,48,412,89};

           for(int i=0;i<4;i++){

           printf(a[i]);}

           system="PAUSE";

           return=0;        

         }

代表什么呢?由此看出,数组就是一组数,以第0个开始的一组数。

         一维数组,在内存里面是横着排的一条线。

         二维数组,是一个矩形。表达式为:int a[ ][ ];例如:int a[3][2]={{1,2},{847,46},{41,879}};     int a[3][2];代表着数组a中最多有3个元素,每个元素中最多有2个元素。也就是说,第一个“[ ]”代表数组中含有最多的元素,第二个"[ ]"代表每个元素含有最多的元素。比如说int a[0][0]==1;int a[1][1]==46;那么int a[2][2]==?

没有这个数,这是数组越界,很危险的越界程序。C语言越界后,地址就会暴露,黑客知道地址是多少的话,就可以推算出起始地址,内存中的地址,被人家算出来,他们就可以专门写程序,把数组里面的元素都冲击出来,而取而代之的是他们的代码程序。

  

下面说下著名的“阿拉赛维晒”算法:

先看一段代码:

#define N 100
int main()
{
  int i,j,a[N];
  for (i = 2;i < N;i++) { a[i] = 1;}
  for (i = 2;i < N;i++)
      if (a[i])
         for (j = i; j<=N/i;j++) a[i*j] = 0;
  for (i = 2;i<N;i++)
      if (a[i]) printf("%4d \n",i);
    
  system("PAUSE"); 
  return 0;
}

          这个算法叫做“阿拉赛维筛”,阿拉赛维是公元前3世纪一个数学家,这个程序就是利用他的思想,这里利用数组的索引高效选择。

         先看代码,这个算法的目的是求100以内的素数。我们把100以内是素数的设为1(即a[i]==1),不是素数的设为0(a[i]==0),一共有四个循环,第一次循环,把i=2~99所有的数都设为素数,1不用,因为1既不是合数,又不是素数。所以从2开始。

        for(j=i;i<=N/J;j++)  a[i*j]=0;

这是第三次循环,潜入在if语句中,已知的素数的倍数一定不是素数,比如说i=2,j也等于2吧,N为100,N/i就是50,a[2*2]就是4,4一定是合数。那要是循环的98,这49个数都是合数,所以这些项都等于0,如果i=3,j=3,N/i就是33,循环这32次,a[3*3]=9,这里的32次,从9,27,……,99都是合数。依此类推,现在就是知道的是某某个数的倍数的都是合数,都赋值为0,直到最后。把等于1的索引项拿出来,再用第四个循环把i=1打印出来。就得到结果了。

        阿拉塞维筛,这种算法将数据像过筛子一样,以一种或多种规则筛选。这也是最基本的算法。。。。

 

 

      


上一篇:用 PHP V5 开发多任务应用程序   下一篇:强搜天线 搜出WiFi世界的安全漏洞
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
用户名: 新注册) 密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 §最新评论
  热点文章
·C语言学习
·C语言指针
·C语言数组排序小结
·c语言 最简单的推箱子游戏
·c语言 全国计算机编程大赛复赛试
·c语言 全国计算机编程大赛复赛试
·c++ 数组与指针
·C++中的内存管理(new、delete、
·如何用C语言开发DSP嵌入式系统
·如何用C语言开发DSP嵌入式系统
·Linux下C语言编程
·学习arm的话先看哪本书?
  相关文章
·C程序实现汉字内码与GB码
·用C语言编写Windows服务程序的五
·关于C++程序中的内存划分介绍
·在Visual C++应用程序中彻底清除
·sscanf函数的高级用法
·深入讲解main()返回值问题
·学习继承的一些总结
·C++程序设计之四书五经
·C++箴言:声明为非成员函数时机
·C++箴言:让=返回一个*this的引
·C++箴言:绝不在构造或析构期调
·C++箴言:理解inline的介入和排
  相关信息
copy right @ 百家拳软件项目研究室 2007 辽ICP备07011763