请教C语言的算法 1!+3!+5!+...+n!

请教C语言的算法 1!+3!+5!+...+n!,第1张

1!+3!+5!+…+(2k-1)!的算法

long int calculate_n(int n) //计算n!

{

long int sum=0;

if(n < 1) sum = 0;

else sum = sum calculate_n(n-1);

return sum;

}

void main()

{

int i, n;

long int sum = 0;

scanf("%d",&n);

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

sum += calculate_n(i);

printf("1!+3!+5!+…+(2k-1)!= %ld",sum);

}

上面程序中的sum之所以定义为long int型,是因为计算阶乘考虑到短整形表示数的局限性!!!如果n比较小也可以改成int!

排列组合的公式数学里有

组合的公式是nCm=n!/(m!(n-m)!)

但是排列组合的计算式子快捷方法不是这么做的

n(n-1)……(n-m+1)/m(m-1)……1

设两个循环

#include<stdioh>

void main{

int a=1;

int b=1;

int c;

for(i=N;i>N-M;i--)

{

a=ai;

}

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

{

b=bi;

}

c=a/b;

}

最大公约数c语言编程的常用思路是:按照从大(两个整数中较小的数)到小(到最小的整数1)的顺序求出第一个能同时整除两个整数的自然数,即为所求。

两个数的最大公约数有可能是其中的小数,所以在按从大到小顺序找寻最大公约数时,循环变量i的初值从小数n开始依次递减,去寻找第一个能同时整除两整数的自然数,并将其输出。

需要注意的是,虽然判定条件是i>0,但在找到第一个满足条件的i值后,循环没必要继续下去,如,25和15,最大公约数是5,对于后面的4、3、2、1没必要再去执行,但此时判定条件仍然成立,要结束循环只能借助break语句。

具体代码实现:

#include<stdioh>

int main()

{

int m,n,temp,i;

printf("Input m&n:");

scanf("%d%d",&m,&n);

if(m<n)/比较大小,使得m中存储大数,n中存储小数/

{/交换m和n的值/

temp=m;

m=n;

n=temp;

}

for(i=n;i>0;i--)/按照从大到小的顺序寻找满足条件的自然数/

if(m%i==0&&n%i==0)

{/输出满足条件的自然数并结束循环/

printf("The GCD of%d and%d is:%d\n",m,n,i);

break;

}

return 0;

}

1、算法描述就是用伪代码或其他文字来叙述编程思想,包含内部逻辑,数据流处理等。

2、算法(Algorithm)是指完成一个任务所需要的具体步骤和方法。也就是说给定初始状态或输入数据,能够得出所要求或期望的终止状态或输出数据。算法常常含有重复的步骤和一些比较或逻辑判断。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。

已知鸡和兔的总数量为n,总腿数为m,输入n和m,依次输出鸡的数目和兔的数目。如果无解则输出No answer。

输入:

两个整数b和m,如上所述。

输出:

鸡的数目和兔的数目。

我们假设a = 鸡只数,b = 兔只数(兔的脚数×总只数-总脚数)÷(兔的脚数-鸡的脚数)=鸡的只数,a = ( 4n - m )/2。

总只数-鸡的只数=兔的只数,b = n - a。

具体代码:

#include "stdioh"

int main() {

int a,b,n, m;

// a鸡的数量

// b兔的数量

// n鸡兔总数

// m总脚数

scanf("%d %d", &n,&m);

a = (4 n - m) / 2;//算出鸡的数量

b = n - a;//算出兔的数量

if (a <= 0 || b <= 0) {

//结果小于等于0,答案不成立,无解

  printf("No answer");

} else {

//结果大于0

  printf("%d %d", a, b);

}

return 0;

 }

扩展资料:

鸡兔同笼解题思路:如果先假设它们全是鸡,于是根据鸡兔的总数就可以算出在假设下共有几只脚,把这样得到的脚数与题中给出的脚数相比较,看看差多少,每差2只脚就说明有1只兔,将所差的脚数除以2,就可以算出共有多少只兔。

概括起来,解鸡兔同笼题的基本关系式是:兔数=(实际脚数-每只鸡脚数×鸡兔总数)÷(每只兔子脚数-每只鸡脚数)。类似地,也可以假设全是兔子。

直接手写

size_t lenT, lenP, lenS;

char e;

if ( !T || !P || !S ) return;

e = strstr( T, P );

if ( !e ) return;

lenT = strlen( T );

lenP = strlen( P );

lenS = strlen( S );

memmove( e+lenS, e+lenP, lenT+1-(e-T)-lenP );

memcpy( e, s, lenS );

假定三个长度 t、p、s 。

strstr: O(tp)

strlen3: O(t+p+s)

memmove: O(t-p)

memcpy:O(s)

最终复杂度 O(tp+2(t+s)) -> O(n^2)。

可以看出热点在 strstr 函数。

如果将其通过 kmp 或类似的匹配算法优化成 O(n) 的,那么复杂度可以直接降为 O(n) 。

以上就是关于请教C语言的算法 1!+3!+5!+...+n!全部的内容,包括:请教C语言的算法 1!+3!+5!+...+n!、C语言组合算法、最大公约数和最小公倍数c语言算法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/10636871.html

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

发表评论

登录后才能评论

评论列表(0条)

保存