首页 > 其他分享 >[NOIP1998 普及组] 阶乘之和

[NOIP1998 普及组] 阶乘之和

时间:2023-11-04 11:01:19浏览次数:37  
标签:10 普及 样例 xy 100000 NOIP1998 阶乘 本题

[NOIP1998 普及组] 阶乘之和

题目描述

用高精度计算出 [NOIP1998 普及组] 阶乘之和_i++[NOIP1998 普及组] 阶乘之和_i++_02)。

其中 ! 表示阶乘,定义为 [NOIP1998 普及组] 阶乘之和_数组_03。例如,[NOIP1998 普及组] 阶乘之和_数组_04

输入格式

一个正整数 [NOIP1998 普及组] 阶乘之和_数据_05

输出格式

一个正整数 [NOIP1998 普及组] 阶乘之和_i++_06,表示计算结果。

样例 #1

样例输入 #1

3

样例输出 #1

9

提示

【数据范围】

对于 [NOIP1998 普及组] 阶乘之和_数组_07 的数据,[NOIP1998 普及组] 阶乘之和_i++_08

【其他说明】

注,《深入浅出基础篇》中使用本题作为例题,但是其数据范围只有 [NOIP1998 普及组] 阶乘之和_数组_09,使用书中的代码无法通过本题。

如果希望通过本题,请继续学习第八章高精度的知识。

#include<bits/stdc++.h>//万能头文件
using namespace std;
int a[100000],n,i,y,xy[100000],s[100000];//s[0]和a[0]表示两个数组的长度
//s表示答案,a表示阶乘,先算出阶乘,放在a里,再把s和它相加,更新s
void add()//表示s=s+a
{
    int i;
    memset(xy,0,sizeof(xy));//xy为辅助数组,先将a+s放入xy,再将s更新为xy
    xy[0]=max(s[0],a[0]);//更长的为xy数组长度
    for (i=1;i<=xy[0];i++)
    {
        xy[i]+=s[i]+a[i];//将每一位相加
        xy[i+1]=xy[i]/10;//进位
        xy[i]%=10;//进位
     }
    while (xy[xy[0]+1]>0) //进位
        {
            xy[xy[0]+2]=xy[xy[0]+1]/10;
            xy[xy[0]+1]%=10;
            xy[0]++;
        }
    s[0]=xy[0];//长度也要更新
    for (i=1;i<=xy[0];i++) s[i]=xy[i];//将xy给s
}
int main()//愉快的开始了主程序
{
    cin>>n;
    a[0]=1;//将数组初值赋好
    a[1]=1;//这里一定要是1,不然算阶乘的时候一直为0
    s[0]=1;
    s[1]=0;
    for (y=1;y<=n;y++) //这里是高精度乘法
    {
        memset(xy,0,sizeof(xy));//xy为辅助数组,先将a+s放入xy,再将s更新为xy
        xy[0]=a[0];
        for (i=1;i<=a[0];i++)
        {
          xy[i]+=a[i]*y;//算阶乘
          xy[i+1]=xy[i]/10;//进位
          xy[i]%=10;
        }
        while (xy[xy[0]+1]>0)//进位 
        {
            xy[xy[0]+2]=xy[xy[0]+1]/10;
            xy[xy[0]+1]%=10;
            xy[0]++;
        }
        for (i=1;i<=xy[0];i++) a[i]=xy[i];//算出y!放入a内
        a[0]=xy[0];
        add();//进行高精度加法
    }
    for (i=s[0];i>=1;i--) cout<<s[i];//输出
    cout<<endl;//换行
    return 0;//愉快的结束了主程序
}

标签:10,普及,样例,xy,100000,NOIP1998,阶乘,本题
From: https://blog.51cto.com/u_16003019/8180649

相关文章

  • 四个代码融合 依次:小青蛙上台阶 ;求阶乘;求最大公因数;地盘划分(均为递归算法)
    小壁灯上楼梯#include<iostream>usingnamespacestd;inta(intc){if(c<=2){returnc;}else{returna(c-1)+(c-2);}}intmain(intargc,char**argv){intc,k;cin>>c;cout<<a(c);return0;}......
  • P4057 [Code+#1] 晨跑 难度:普及
    这道题目读完之后很好理解:求这三个数的最小公倍数分析样例:输入:235输出:30短除法都会吧(不会的去我百度账号看我发的文章,百度ID:Cy周边),235都不能被同时整除,所以就相乘呗:2×3×5=30与样例相等,读一个样例就能看出来,题目求最小公倍数用一个自变函数gcd即可:下面是代码实现#i......
  • (C语言)1到50的阶乘之和列表,参考用,洛谷:P1009 [NOIP1998 普及组] 阶乘之和
    1到50列表,阶乘之和S=1!+2!+3!+⋯+n!(n≤50)1::12::33::94::335::1536::8737::59138::462339::40911310::403791311::4395471312::52295631313::674997711314::9392826831315::140160263631316::2232439252431317::37801182062031318::678038552634831319::12842......
  • P3989 [SHOI2013] 阶乘字符串
    P3989bzoj#4416先考虑部分分,看到\(n\leq20\)容易想到这个部分可以用状压起初可以设\(dp_{S,i}\)表示在前\(i\)个数中选出集合\(S\)中的字母是否可行,转移即枚举下一个字母是什么这个dp有一个很显然的性质:他肯定是前缀一段\(0\),后缀一段\(1\)。我们不妨优化一......
  • P5018 [NOIP2018 普及组] 对称二叉树
    先递归判断当前子树是不是对称二叉树,如果是就取\(\max\)然后退出,否则继续递归左儿子的左子树和右儿子的右子树、左儿子的右子树和右儿子的左子树判断。最坏情况是每次都递归到叶子,也就是每层都是\(O(n)\)。但一共只有\(O(\logn)\)层,所以时间复杂度是\(O(n\logn)\)。......
  • C语言阶乘for循环语句的使用
    #include<stdio.h>intmain(){inti=0,n=0;ret=1;scanf_s("%d",&n);//scanf_s作用是避免在编译器中出现不安全影响代码编译 for(i=1;i<=n;i++)   { ret=ret*i;    } printf("%d\n",ret); return0;}用于输入n的阶乘利用for语句解决求1~10阶乘的......
  • C语言求1~n的阶乘的和的进阶优化
    #include<stdio.h>intmain(){ intret=1; intsum=0; intn=0;for(n=1;n<=10;n++)//10可以变成任意值 { ret=ret*n; sum=sum+ret; } printf("%d",sum); return0;}......
  • P5015 [NOIP2018 普及组] 标题统计
    题目描述传送门凯凯刚写了一篇美妙的作文,请问这篇作文的标题中有多少个字符?注意:标题中可能包含大、小写英文字母、数字字符、空格和换行符。统计标题字符数时,空格和换行符不计算在内。输入格式输入文件只有一行,一个字符串\(s\)。输出格式输出文件只有一行,包含一个整数,即作......
  • 阶乘幂
    下降阶乘幂:\(x^{\underline{m}}\),读作“\(x\)直降\(m\)次”。\(x^{\underline{m}}=x(x-1)(x-2)...(x-m+1)\),(\(m≥0\))\(x^{\underline{0}}=1\)所以\(A_n^m=n^{\underline{m}}\)上升阶乘幂:\(x^{\overline{m}}\),读作“\(x\)直升\(m\)次”。\(x^{\overline{m}}......
  • P3956 [NOIP2017 普及组] 棋盘
    传送门P3956[NOIP2017普及组]棋盘不清楚曾师为什么把这个神奇的题目放在搜索\(search\)专栏,反正我用\(dijkstra\)水过去了,虽然\(dijkstra\)严格来说也是一种能够解决一般性最短路问题的算法。然后考虑这道题的建图。这道题来看首先是去除魔法的部分,一般地,任意一个点只......