1到100的阶乘之和 编出C语言程序后, 请问其时间复杂度怎么求

1到100的阶乘之和 编出C语言程序后, 请问其时间复杂度怎么求,第1张

时间复杂度:T(n) = O(f(n));

f(n)表示算法中基本 *** 作重复执行的次数,算法执行时间的增长率和f(n)增长率相同

阶乘核心算法:

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

{

for(j = 2;j<=i;j++)

{

temp = tempj;

}

sum += temp;

temp = 1;

}

循环的次数为:0+1+2+3+。。+99

时间复杂度为:O(4950)

你好,100的阶乘结果大概有150位,用简单的do while语句是无法计算准确的结果的(结果最后100多位全是0,而正确的结果0也就20个左右)。

程序1:

#include   <stdioh> 

#define    M   1000

 main()

 {  

  int a[M], i, n, j, flag = 1; 

  printf("n=");  

  scanf("%d",&n);  

  printf("n!=");   

  a[0] = 1;  

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

   a[i] = 0;  

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

  {    

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

    a[i] = j;    

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

    if(a[i] >= 10)     

    {      

     a[i+1] += a[i]/10;    

     a[i] = a[i] % 10;       

     if(i == flag-1) 

      flag++; 

    }    

 }   

  for(j = flag - 1;j >= 0; j--)

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

 }

程序2:

#include <stdioh>

#include <stringh>

void f(int n)

{

 void cheng(char s[],int n);

 void jia(char s1[], char s2[]);

 int jinwei=0, bai, shi, ge, num;

 char b[1000], c[1000];

 static char a[1000]={"1"};

 strcpy(b,a);

 strcpy(c,a);

 num=strlen(a);

 bai = n/100;

 shi = n%100/10;

 ge = n%10;

 cheng(a, ge);

 if(shi)

 {

  cheng(b, shi);

  num=strlen(b);

  b[num]=48;

  b[num+1]=0;

  jia(a, b);

 }

 if(bai)

 {

  cheng(c, bai);

  num=strlen(c);

  c[num]=48;

  c[num+1]=48;

  c[num+2]=0;

  jia(a, c);

 }

 printf("%d%d%d!=",bai,shi,ge);

 puts(a);

}

void jia(char s1[], char s2[])

{

 int i, m, n, k, jinwei=0;

 m=strlen(s1);

 n=strlen(s2);

 if(m>=n)

 {

  for(i=n; i>=0; i--)

   s2[i+m-n]=s2[i];

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

   s2[i]=48;

 }

 else

 {

  for(i=m; i>=0; i--)

   s1[i+n-m]=s1[i];

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

   s1[i]=48;

 }

 for(i=m-1; i>=0; i--)

 {

  k=s1[i]+s2[i]+jinwei-96;

  s1[i]=k%10+48;

  jinwei=k/10;

 }

 if(jinwei)

 {

  for(i=m; i>=1; i--)

   s1[i]=s1[i-1];

  s1[0]=49;

  s1[m+1]=0;

 }

}

void cheng(char s[], int x)

{

 int i, m, n, jinwei=0;

 n=strlen(s);

 for(i=n-1; i>=0; i--)

 {

  m=(s[i]-48)x+jinwei;

  s[i]=m%10+48;

  jinwei=m/10;

 }

 if(jinwei)

 {

  {

   for(i=n; i>=1; i--)

    s[i]=s[i-1];

   s[0]=jinwei+48;

  }

  s[n+1]=0;

 }

}

void main()

{

 int i, n;

 printf("请输入1--150之内的整数!");

 scanf("%d",&n);

 if(n>0&&n<=150)

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

   f(i);

}

//

/ 描述:             /

/  输入一个数,然后计算其阶乘       /

/  阶乘通过数组进行计算,结果位数可调     /

/  N的值为结果的位置,如果越界,可以增大N    /

/               /

/               /

//

#include<stdioh>

#define N 200

void show(int a[]){     //显示结果函数,省略前面的0

 int i = 0,j = 0;

 for(i = 0;i < N;i ++){

  if(a[i] == 0)

   continue;

  for(j = i;j < N;j ++){

   printf("%d|",a[j]);  //以竖线隔开每一位,如果不想这样,可以去掉%d后的竖线

  }

  printf("\n");

  break;

 }

}

void cheng(int a[],int n){   //乘计算函数,结果数组乘以参数n

 int i = 0,j = 0,temp = 0;

 int b[N] = {0};

 for(i = N-1;i+1;i--){

  temp = a[i]  n;

  a[i] = temp % 10 +b[i];

  if(a[i]>= 10){

   b[i-1] = a[i] / 10;

   a[i] = a[i] % 10;

  }

  if(i != 0 && temp != 0){

   b[i-1] += temp/10;

  }

 }

}

int main(){

 int a[N] = {0};

 int i = 0,j = 1,m = 100;

 scanf("%d",&m);     //输入一个整数

 a[N-1] = 1;      //初始化数组,末位为1

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

  cheng(a,i);

 show(a);

 return 0;

}

double

类型不能用

%

运算符,只有

char

,short,int,long

类型能用

%

类型的运算符!!!

因此:

f(a%10==0)

是错的,编译通不过。

另外,这道题目根本不是这么算的!你算法就有问题。100

的阶乘是很大的数,double

类型即使能保存的下,

也会有挺大的误差了。

题的算法是:统计数字

1

~

100

中间,因子2

因子

5

出现的次数。哪个出现的次数少,设少的出现

n

次,那么最终结果就是

n

10。

比如,先简单点的,统计

10

的阶乘,计算结果有多少个

10。

设因子

2

出现次数为

x,因子

5

出现次数为

y。开始

x=y=0。

1

~

10

中:

1,1

即不能被

2

整除(没有因子2),也不能被

5

整除(没有因子5);x=y=0。

2,1

能被

2

整除(有因子2),但是不能被

5

整除(没有因子5);x=x+1

=

1,

y=0。

3,3

即不能被

2

整除(没有因子2),也不能被

5

整除(没有因子5);x=1,y=0。

4,4

能被

2

整除(有两个因子2),但是不能被

5

整除(没有因子5);x=x+2=3,

y=0。

5,x=3,y=y+1

=

1

6,x=x+1=4,y=1

7,x=4,y=1

8,x=x+3=7,y=1

9,x=7,y=1

10,x=x+1=8,y=y+1=2

最终

x=8,y=2,他们中较小的是

2,因此最终的结果中有

2

个零。

实际上

10!

=

3628800,结果确实是有

2

个零。

下面是程序:

#include

int

main(int

argc,

char

argv[])

{

//

计算

n

的阶乘

int

n=100;

//

x

统计因子

2

出现的次数,y

统计因子

5

出现的次数

int

x=0,y=0;

int

i,t;

for(i=1;

i<=n;

i++)

{

t

=

i;

while(t%2

==

0)

{

x++;

t/=2;

}

while(t%5

==

0)

{

y++;

t/=5;

}

}

printf("%d!

has

%d

zeros

at

end!\n",

n,

(x<=y

x

:

y));

return

0;

}

以上就是关于1到100的阶乘之和 编出C语言程序后, 请问其时间复杂度怎么求全部的内容,包括:1到100的阶乘之和 编出C语言程序后, 请问其时间复杂度怎么求、c语言用do while 语句写1x 2x 3 x 4 ....x 100,就是100的阶乘,怎么、C语言中计算100的阶乘,如何保证不会数据溢出。最好是模拟笔算的那种方法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9326335.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-27
下一篇2023-04-27

发表评论

登录后才能评论

评论列表(0条)

    保存