贤鱼的刷题日常--P1009 [NOIP1998 普及组] 阶乘之和--详细题解

简介: 🍀学会阶乘之和题目
🏆今日学习目标:
🍀学会阶乘之和题目
✅创作者:贤鱼

请添加图片描述

@TOC

题目

用==高精度计算==出 !S=1!+2!+3!+⋯+n!(0n≤50)。
其中 ! 表示阶乘,定义为 n!=n×(n−1)×(n−2)×⋯×1。例如,5!=5×4×3×2×1=120。
输入格式
一个正整数 n。
输出格式
一个正整数 S,表示计算结果。
输入输出样例
输入 #1复制
3
输出 #1复制
9
说明/提示
【数据范围】
对于 100% 的数据,1≤n≤50。

代码

50分代码

#include<cmath>
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,ans;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        int s=1;
        for(int j=1;j<=i;j++){
            s*=j;
        }
        ans+=s;
    }
    cout<<ans;
}
这个应该是最基础的做法了,但是对于洛谷上只能拿到一半的分

AC代码

#include<cmath>
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,ans,a[1001],b[1001];
void c(int x){//高精度乘法
    int g=0;
    for(int i=100;i>=0;i--){
        a[i]=a[i]*x+g;//直接乘
        g=a[i]/10;//进位
        a[i]%=10;//取出余数,相当于进位完剩下的
    }
}
void j(){//高精度加法
    int q=0;
    for(int i=100;i>=0;i--){
        b[i]+=a[i]+q;//这里直接加
        q=b[i]/10;//进位处理
        b[i]%=10;//同上
    }
}
int main(){
    cin>>n;
    a[100]=b[100]=1;
    for(int i=2;i<=n;i++){
        c(i);
        j();
    }
    int xy=0;//这里需要单独判断一下计算完的数字长度
    for(int i=0;i<=100;i++){
        if(b[i]){

        xy=i; break; 
    }
    }//以下直接输出就好
    for(int i=xy;i<=100;i++){
        cout<<b[i];
    }
}

高精度计算

高精度加法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

高精度乘法

在这里插入图片描述

以此类推

在这里插入图片描述

最后相加就好了

==🏆如果对您有帮助的话可以订阅一下专栏,持续跟新==

请添加图片描述

相关文章
|
14天前
【洛谷 P1980】[NOIP2013 普及组] 计数问题 题解(取余)
NOIP2013普及组计数问题,求区间[1, n]内数字x出现的次数。输入为n和x,输出x的出现次数。样例输入11 1,输出4。代码通过逐位检查每个数是否等于x来计数,适用于$n\leq10^6$,$0\leq x\leq 9$的情况。
16 0
|
14天前
|
C++
【洛谷 P1307】[NOIP2011 普及组] 数字反转 题解(字符串)
**NOIP2011普及组题目:给定整数N,反转其位得到新数。新数首位非0(除非N=0)。输入0时直接输出0,其他情况输出反转后的数,考虑负数及前导0。提供的C++代码实现通过读入字符串,反转数字顺序并处理符号和前导0。**
13 0
|
14天前
【洛谷 P2669】[NOIP2015 普及组] 金币 题解(循环)
`NOIP2015`普及组题目,骑士按周期领金币:第一天1枚,随后$n$天每天$n$枚,然后$n+1$天每天$n+1$枚。给定天数$k$,求总金币数。输入$k$,输出金币总数。样例输入6,输出14;输入1000,输出29820。代码使用循环和变量控制周期,累计金币数。
14 0
|
14天前
|
机器学习/深度学习 存储
【洛谷 P1028】[NOIP2001 普及组] 数的计算 题解(递归)
**NOIP2001普及组数的计算**:给定自然数\( n \),构造数列,新数不超过序列最后一项一半。求合法数列个数。输入\( n \)(\(1 \leq n \leq 10^3\))。样例:输入6,输出6。递归解决,代码中定义函数`f`实现递归计算,总和存储在`cnt`中,最后输出。
11 0
|
14天前
|
机器学习/深度学习 人工智能
【洛谷 P1028】[NOIP2001 普及组] 数的计算 题解(递推)
在NOIP2001普及组的数的计算题目中,给定自然数`n`,需构造遵循特定规则的合法数列。合法序列始于`n`,新元素不超过前一项的一半。任务是找出所有这样的数列数量。例如,当`n=6`时,合法序列包括`6`, `6,1`, `6,2`, `6,3`, `6,2,1`, `6,3,1`。程序通过动态规划求解,当`i`为奇数时,`a[i] = a[i - 1]`;为偶数时,`a[i] = a[i - 1] + a[i / 2]`。代码中预处理数组`a`并输出`a[n]`作为答案。输入`n`后,程序直接计算并打印合法数列个数。
18 0
|
14天前
【洛谷 P1088】[NOIP2004 普及组] 火星人 题解(全排列+向量)
**火星人问题摘要:** NOIP2004普及组竞赛中的题目,涉及火星人用手指的排列表示数字。人类需计算火星人数字与给定数值之和的新排列。给定火星人手指数N(≤10000),加上的数M(≤100),以及初始排列,要求输出新排列。30%的数据中N≤15,60%的数据中N≤50。使用`next_permutation`函数找到第M个排列。样例:N=5, M=3, 初始排列1 2 3 4 5,输出1 2 4 5 3。
7 0
|
14天前
|
C++
【洛谷 P1075】[NOIP2012 普及组] 质因数分解 题解(判断质数)
NOIP2012普及组题目,给定合数$n$由两个不同质数乘积组成,求较大质数。输入一个正整数$n$,输出较大质因子。例如输入21,输出7。代码使用C++,通过循环和质数判断找到能整除$n$的质数,再求另一个质数,并输出较大者。
7 0
|
11月前
|
算法
[算法刷题题解笔记] 洛谷 P1003 [NOIP2011 提高组] 铺地毯 [枚举]
[算法刷题题解笔记] 洛谷 P1003 [NOIP2011 提高组] 铺地毯 [枚举]
|
11月前
|
算法
[算法刷题题解笔记] 洛谷 P1008 [NOIP1998 普及组] 三连击 [枚举|模拟]
[算法刷题题解笔记] 洛谷 P1008 [NOIP1998 普及组] 三连击 [枚举|模拟]
|
机器学习/深度学习 算法
【第十五届蓝桥杯备赛(bushi,写文凑个数)】蓝桥OJ---长草
文章目录 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 三、知识风暴 BFS Flood Fill算法
157 0

热门文章

最新文章