当前位置:   article > 正文

多种方式实现阶乘_阶乘函数c语言的实现

阶乘函数c语言的实现

自己前几天写学长布置的拓展任务,又写出来了几种阶乘的实现,于是想分享一下;

话不多说~~~

1.递归实现阶乘

  1. #include<stdio.h>
  2. int fun(int m){
  3. if(m==0||m==1)
  4. return 1;//判断是否为1和0,是1和0返回1;
  5. else
  6. return fun(m-1)*m;//不是1和0的其他情况,函数自己调用自己;
  7. }
  8. int main(){
  9. int m;
  10. scanf("%d",&m);
  11. printf("%d",fun(m));
  12. return 0;
  13. }

2.循环实现阶乘

  1. #include<stdio.h>
  2. int main(){
  3. int m,t=1;
  4. scanf("%d",&m);
  5. // for(int i=m;i>1;i--){
  6. // t*=i;
  7. // }
  8. for(int i=1;i<=m;i++){
  9. t*=i;
  10. }
  11. printf("%d",t);
  12. return 0;
  13. }
  14. //两个循环任选一种,均可以实现阶乘
  15. // 第一个for循环是从m开始乘直到1;
  16. // 第二个for循环是从1开始依次往上乘直到m;

3.非递归函数实现阶乘

  1. //本质上和for循环的实现相同
  2. #include<stdio.h>
  3. int fun(int m){
  4. int t=1;
  5. if(m==0||m==1)
  6. return 1;
  7. else{
  8. while(m!=1){
  9. t*=m;
  10. m--;
  11. }
  12. return t;
  13. }
  14. }
  15. int main(){
  16. int m;
  17. scanf("%d",&m);
  18. printf("%d",fun(m));
  19. return 0;
  20. }


   4.从两端进行相乘

  1. //类似于小高斯算1到100的和从两端各取一个数进行相乘
  2. #include<stdio.h>
  3. int main(){
  4. int m,t=1;
  5. int i,j;
  6. scanf("%d",&m);
  7. if(m%2==0){
  8. for(i=1,j=m;i<=m/2,j>m/2;i++,j--){
  9. t*=(i*j);
  10. }
  11. }
  12. //奇数时在原基础上加一或减一进行两端取然后相乘,加一的时候计算结束在最终结果除以多乘的那个数,减一的时候乘以最后一位
  13. //原输入基础减一
  14. else{
  15. for(i=1,j=m-1;i<=(m-1)/2,j>(m-1)/2;i++,j--){
  16. t*=(i*j);
  17. }
  18. t=t*m;
  19. }
  20. //原输入基础加一
  21. /*else{
  22. for(i=1,j=m+1;i<=(m+1)/2,j>(m+1)/2;i++,j--){
  23. t*=(i*j);
  24. }
  25. t=t/(m+1);
  26. }*/
  27. printf("%d",t);
  28. return 0;
  29. }

5.奇数偶数分开乘,最后乘到一起;

  1. #include<stdio.h>
  2. int main(){
  3. int m;
  4. int t1=1,t2=1;//初始化最终结果变量为1,否则会出现答案为0的情况
  5. scanf("%d",&m);
  6. for(int i=1;i<=m;i++){
  7. if(m%2==0){//判断偶数
  8. t1*=i;
  9. }
  10. else{
  11. t2*=i;
  12. }
  13. }
  14. printf("%d",t1*t2);
  15. return 0;
  16. }

 6.从中间向两端相乘

比如:1*2*3*4*5*6

执行过程为(3*4)*(2*5)*(1*6)

  1. #include<stdio.h>
  2. int main(){
  3. int m;
  4. int i,j;
  5. int t=1;
  6. scanf("%d",&m);
  7. //此处仍然需要判断共有偶数还是奇数个相乘的数,与上边类似
  8. if(m%2==0){
  9. for(i=m/2,j=m/2+1;i>0,j<=m;i--,j++){
  10. t*=(i*j);
  11. }
  12. }
  13. else{
  14. for(i=(m-1)/2,j=(m-1)/2+1;i>0,j<=m-1;i--,j++){
  15. t*=(i*j);
  16. }
  17. t*=m;
  18. }
  19. printf("%d",t);
  20. return 0;
  21. }

7.分别从开头和中间开始计算

例如:1*2*3*4*5*6

执行过程为:(1*4)*(2*5)*(3*6)

  1. #include<stdio.h>
  2. int main(){
  3. int m;
  4. int i,j;
  5. int t=1;
  6. scanf("%d",&m);
  7. if(m%2==0){
  8. for(i=1,j=m/2+1;i<m/2,j<=m;i++,j++){
  9. t*=(i*j);
  10. }
  11. }
  12. else{
  13. for(i=1,j=(m+1)/2+1;i<(m+1)/2,j<=m+1;i++,j++){
  14. t*=(i*j);
  15. }
  16. t=t/(m+1);
  17. }
  18. printf("%d",t);
  19. return 0;
  20. }

8.类似于利用数组下标进行计算,本质上还是for循环的使用

  1. #include<stdio.h>
  2. int main(){
  3. int m;
  4. int t=1,i;
  5. scanf("%d",&m);
  6. int a[m];
  7. for(i=0;i<m;i++){
  8. a[i]=i+1;//数组虽然下标是依次增,但是数组下标是从0开始,所以给数组存入元素要从下标加1开始;
  9. }
  10. for(i=0;i<m;i++){
  11. t*=a[i];
  12. }
  13. printf("%d",t);
  14. return 0;
  15. }

如有不对,多多指正,不要喷我,大一初学者,在慢慢努力变成大佬的路上~~~~~~~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/64838
推荐阅读
相关标签
  

闽ICP备14008679号