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

最近在看数据结构,和很多人都在讨论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[N]={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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值