n的阶乘

4 篇文章 0 订阅
1 篇文章 0 订阅

链接:https://www.nowcoder.com/acm/contest/75/E
来源:牛客网
 

题目描述

给定一个整数N(0≤N≤10000),求取N的阶乘

输入描述:
多个测试数据,每个测试数据输入一个数N
输出描述:
每组用一行输出N的阶乘

示例1

输入

1
2
3

输出

1
2
6

 

 

代码:

#include<bits/stdc++.h>
using namespace std;

int main(void)
{
	int n,a[100000];
	int i,j,h,p;
	while(~scanf("%d",&n)&&n>=0)//
	{
		a[1]=1;//0和1的阶乘都是1; 
		p=1;//
		for(i=2;i<=n;i++)
		{
			for(j=1,h=0;j<=p;j++)
			{
				a[j]=a[j]*i + h;//
				h=a[j]/10;//
				a[j]%=10;
			}
			while(h>0)
			{
				a[j++]=h%10;
				h/=10;
			}
			p=j-1;//
			//printf("p=%d,a[p]=%d\n",p,a[p]);
		}
		for(i=p;i>=1;i--)
		printf("%d",a[i]);
		printf("\n");
	}
	return 0;
 } 

 

摘:直接看代码比较难理解,可以举个例子,比如说我们现在得到了4!= 24,在数组中是以倒序的方式存储,即42,a[1] =  4,a[2] = 2(数组下标从1开始),现在要计算5!,内层for循环对目前的两位4和2进行处理,即每一位都乘以5,首先a[1] = a[1]*5 + 0(h)= 20,h从0变为2,a[1] = 0;然后a[2] = a[2] * 5 + 2 = 12,h从2变为1,a[2] = 2;这时内层for循环执行结束。

总结1:内层for循环的作用是更新已经存在的位数中的每一位与i的乘积的结果.
接着执行while循环,目前h = 1,a[3] = 1,h 从1变为0,然后退出while循环。处理结束就得到了5! = 120.p的位数增加到3.
总结2:while循环的作用是计算p更新之前的位数之后的进位,比如说p = 2的时候,数组中为42,然后内层for循环把42更新为02,while循环增加进位1,整个数组变为021.

 

代码:

#include <iostream>
using namespace std;


int main() {
    int n, i, j, num, h;    //h进位
    int a[100005];
    while(~scanf("%d", &n)) {
        a[1] = 1;    //0和1的阶乘等于1,低位在前
        num = 1;    //位数
        for(i = 2; i <= n; ++i) {    //i为阶乘需要乘的数从2到n
            for(j = 1, h = 0; j <= num; ++j) { //每一位都乘上i
                //a[j] *= i + h;        //错
                a[j] = a[j] * i + h;    //对
                h = a[j] / 10;   //除去最低位
                a[j] %= 10;    //存放最低位
            }
            while(h > 0) {    //剩余的进位也加上
                a[j++] = h % 10;
                h /= 10;
            }
            num = j - 1;    //更新位数
        }
        for(i = num; i >= 1; --i) { //先输出高位,再输出低位
            printf("%d", a[i]);
        }
        printf("\n");
    }
    
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值