您的位置:首页 > 理论基础 > 数据结构算法

KMP算法&&大数运算,求1000!&&求n的n次方

2012-01-02 00:14 204 查看
最近在看数据结构,和很多人都在讨论KMP算法,我感觉KMP算法很简洁,最主要是Next数组怎么求,先贴代码,

void GetNext(char T[], int next[])

{

    next[1]=0;

    j=1;k=0;

   while(j<T[0])

       if((k==0)||(T[j]==T[k])){

            j++;

            k++;

            next[j]=k;

        }

        else k = next[k];

}

T的第一个存储时字符串的长度,这段代码写的很牛B,如果是我来写,至少两个循环,但是这里只有一个,最关键是最后一句。

今天在内网上看一篇讨论怎么求1000!的帖子,先看源代码(牛人写的,相当简洁)

#include<stdio.h>

#define N 10

long s
={1,1},n=N,t=2,a=1,b=0;

int main()

{

    for(;a<=*s||(++t<=n?(b=0,a=1):0);(*s==a++&&b)?(*s)++:0)         

    s[a]=(b+=s[a]*t)%10000,b/=10000;     

    for(printf("%d",s[*s]);--*s>0;)         

    printf("%04d",s[*s]);     

    return 0;

}

最主要在第一个for循环,非常巧妙,用10000进制,如果不这样,我试了下,会栈空间不够,因为不是new出来的,并且空间和时间复杂度会很大的,所以说他这样做很巧妙,并且10000进制,我知道int型就60000多一点,所以说很巧妙

计算机求n的n次方,也许很简单,就是两次循环嘛,不过好像很少用,估计有可能内存溢出吧,不太清楚,^_^。一般都是用数组的,其实也简单,就是一位一位的求。源码如下:

#define N 199

#define NN 7000

#include <stdio.h>

int main(void)

{

   static int a[NN]={0},b[NN]={0};

   int i,j,k,m,n,x;

   n=N;i=0;

   while (n!=0)

   {

      a=b=n%10;

      i++;

      n=(n-n%10)/10;

   }

   for(k=1;k<N;k++)

   {

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

  b=a[NN-i-1];

      i=0;

      while (b==0)i++;

      for(m=0;m<NN;m++)

  b[m]=a[m];

      for (m=1;m<N;m++)

      {

/*  printf("k=%d,m=%d\n",k,m);*/

  x=0;

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

  {

     if (b[j]==0&&x==0&&j>NN-i) break;

这里不是很清楚,估计是减少循环的,试了下,注释掉,也能运行,不过貌似速度减慢了

     a[j]=a[j]+b[j]+x;

     if (a[j]>9)

     {

        a[j]=a[j]%10;

        x=1;

     }

     else x=0;

  }

      }

   }

   for (k=0;k<(NN-1)/2;k++)

   {

      x=a[k];a[k]=a[NN-k-1];a[NN-k-1]=x;

   }

   m=0;

   while (a[m]==0)m++;

   printf("%d^%d=",N,N);

   for (k=m;k<NN;k++)

      printf("%d",a[k]);

   printf("\n");

   return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 数据结构 存储