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;
}
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;
}
相关文章推荐
- ACM: 大数运算(正整数)
- ACM_大数运算 模板&&讲解&&各大oj题目
- Acdream 1210 Chinese Girls' Amusement(大数模板运算 + 找规律)
- Catalan数 大数运算&&普通运算
- (高精度运算4.7.27)UVA 10494 If We Were a Child Again(大数除法&&大数取余)
- (高精度运算4.7.27)UVA 10494 If We Were a Child Again(大数除法&&大数取余)
- ACM 大数运算 【计算1000以内的阶乘】
- 大数运算(1)——大数储存
- Gym 100685A Ariel (&运算)
- POJ 2429 GCD & LCM Inverse Pollard_Rho大数分解+Miller_Rabin
- 重载一个+运算符、<<运算符和>运算符。实现对分数的运算
- HDU-1047-Integer Inquiry(Java大数水题 && 格式恶心)
- HDU 1063大数求幂运算
- matlab 中有关矩阵逆的一些运算
- POJ 2429 GCD & LCM Inverse 解题报告(大数因式分解)
- 位运算反(~)与(&)异或(^)或(|)右移(>>)左移(<<)
- 大数运算之快速幂算法
- 大数运算实现加减乘除四则运算
- 大数乘法运算
- poj2305 JAVA大数运算