赞
踩
自己前几天写学长布置的拓展任务,又写出来了几种阶乘的实现,于是想分享一下;
话不多说~~~
1.递归实现阶乘
- #include<stdio.h>
- int fun(int m){
- if(m==0||m==1)
- return 1;//判断是否为1和0,是1和0返回1;
- else
- return fun(m-1)*m;//不是1和0的其他情况,函数自己调用自己;
- }
- int main(){
- int m;
- scanf("%d",&m);
- printf("%d",fun(m));
- return 0;
- }
2.循环实现阶乘
- #include<stdio.h>
- int main(){
- int m,t=1;
- scanf("%d",&m);
- // for(int i=m;i>1;i--){
- // t*=i;
- // }
- for(int i=1;i<=m;i++){
- t*=i;
- }
- printf("%d",t);
- return 0;
- }
- //两个循环任选一种,均可以实现阶乘
- // 第一个for循环是从m开始乘直到1;
- // 第二个for循环是从1开始依次往上乘直到m;
3.非递归函数实现阶乘
- //本质上和for循环的实现相同
- #include<stdio.h>
- int fun(int m){
- int t=1;
- if(m==0||m==1)
- return 1;
- else{
- while(m!=1){
- t*=m;
- m--;
- }
- return t;
- }
- }
- int main(){
- int m;
- scanf("%d",&m);
- printf("%d",fun(m));
- return 0;
- }
4.从两端进行相乘
- //类似于小高斯算1到100的和从两端各取一个数进行相乘
- #include<stdio.h>
- int main(){
- int m,t=1;
- int i,j;
- scanf("%d",&m);
- if(m%2==0){
- for(i=1,j=m;i<=m/2,j>m/2;i++,j--){
- t*=(i*j);
- }
- }
- //奇数时在原基础上加一或减一进行两端取然后相乘,加一的时候计算结束在最终结果除以多乘的那个数,减一的时候乘以最后一位
- //原输入基础减一
- else{
- for(i=1,j=m-1;i<=(m-1)/2,j>(m-1)/2;i++,j--){
- t*=(i*j);
- }
- t=t*m;
- }
- //原输入基础加一
- /*else{
- for(i=1,j=m+1;i<=(m+1)/2,j>(m+1)/2;i++,j--){
- t*=(i*j);
- }
- t=t/(m+1);
- }*/
- printf("%d",t);
- return 0;
- }
5.奇数偶数分开乘,最后乘到一起;
- #include<stdio.h>
- int main(){
- int m;
- int t1=1,t2=1;//初始化最终结果变量为1,否则会出现答案为0的情况
- scanf("%d",&m);
- for(int i=1;i<=m;i++){
- if(m%2==0){//判断偶数
- t1*=i;
- }
- else{
- t2*=i;
- }
- }
- printf("%d",t1*t2);
- return 0;
- }
6.从中间向两端相乘
比如:1*2*3*4*5*6
执行过程为(3*4)*(2*5)*(1*6)
- #include<stdio.h>
- int main(){
- int m;
- int i,j;
- int t=1;
- scanf("%d",&m);
- //此处仍然需要判断共有偶数还是奇数个相乘的数,与上边类似
- if(m%2==0){
- for(i=m/2,j=m/2+1;i>0,j<=m;i--,j++){
- t*=(i*j);
- }
- }
- else{
- for(i=(m-1)/2,j=(m-1)/2+1;i>0,j<=m-1;i--,j++){
- t*=(i*j);
- }
- t*=m;
- }
- printf("%d",t);
- return 0;
- }
7.分别从开头和中间开始计算
例如:1*2*3*4*5*6
执行过程为:(1*4)*(2*5)*(3*6)
- #include<stdio.h>
- int main(){
- int m;
- int i,j;
- int t=1;
- scanf("%d",&m);
- if(m%2==0){
- for(i=1,j=m/2+1;i<m/2,j<=m;i++,j++){
- t*=(i*j);
- }
- }
- else{
- for(i=1,j=(m+1)/2+1;i<(m+1)/2,j<=m+1;i++,j++){
- t*=(i*j);
- }
- t=t/(m+1);
- }
- printf("%d",t);
- return 0;
- }
8.类似于利用数组下标进行计算,本质上还是for循环的使用
- #include<stdio.h>
- int main(){
- int m;
- int t=1,i;
- scanf("%d",&m);
- int a[m];
- for(i=0;i<m;i++){
- a[i]=i+1;//数组虽然下标是依次增,但是数组下标是从0开始,所以给数组存入元素要从下标加1开始;
- }
- for(i=0;i<m;i++){
- t*=a[i];
- }
- printf("%d",t);
- return 0;
- }
如有不对,多多指正,不要喷我,大一初学者,在慢慢努力变成大佬的路上~~~~~~~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。