
时间复杂度: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的阶乘,如何保证不会数据溢出。最好是模拟笔算的那种方法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)