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

P1009 [NOIP1998 普及组] 阶乘之和

时间:2023-09-16 11:14:04浏览次数:33  
标签:10 P1009 int void times NOIP1998 阶乘 100

题目描述

用高精度计算出 S = 1! + 2! + 3! + \cdots + n!S=1!+2!+3!+⋯+n!(n \le 50n≤50)。

其中 ! 表示阶乘,定义为 n!=n\times (n-1)\times (n-2)\times \cdots \times 1n!=n×(n−1)×(n−2)×⋯×1。例如,5! = 5 \times 4 \times 3 \times 2 \times 1=1205!=5×4×3×2×1=120。

输入格式

一个正整数 nn。

输出格式

一个正整数 SS,表示计算结果。

输入输出样例

输入 #1
3
输出 #1
9

说明/提示

【数据范围】

对于 100 \%100% 的数据,1 \le n \le 501≤n≤50。

解题思路

阶乘数值较大,c++难以支持,采用高精度算法来实现

高精度乘法:

void multiple(int x){
int g=0;//进位
for(int i=100;i>=0;i--){
a[i]=a[i] * x + g;
g = a[i]/10;
a[i] = a[i] % 10;

}
}

高精度加法

void add(){
int g=0;//进位
for(int i=100;i>=0;i--){
s[i]=a[i] + s[i] + g;
g = s[i]/10;
s[i] = s[i] % 10;

}
}

完整实现:

#include<iostream>
#include<cstdio>
using namespace std;
int n,a[101]={0},s[101]={0};
void change(int x)
{
    int g=0;
    for(int i=100;i>=0;i--)
    {
        a[i]=a[i]*x+g;
        g=a[i]/10;
        a[i]=a[i]%10;
    }
}
void qh()
{
    int g=0;
    for(int i=100;i>=0;i--)
    {
        s[i]=s[i]+a[i]+g;
        g=s[i]/10;
        s[i]=s[i]%10;
    }
}
void sc()
{
    int w;
    for(int i=0;i<=100;i++)
    {
        if(s[i]!=0)
        {
            w=i;
            break;
        }
    }
    for(int i=w;i<=100;i++)
       printf("%d",s[i]);
}
int main()
{
    scanf("%d",&n);
    s[100]=a[100]=1;
    for(int i=2;i<=n;i++)
    {
        change(i);
        qh();
    }
    sc();
    return 0;
}

 

标签:10,P1009,int,void,times,NOIP1998,阶乘,100
From: https://www.cnblogs.com/ywy1/p/17706444.html

相关文章

  • 编写求阶乘函数
    ​ ,计算并返回1!+2!+3!+……+n!的值。函数fact()实现计算并返回123*……*n的值;函数fun()实现计算并返回1!+2!+3!+……+n!的值;函数main()从后台获取整数n,调用函数fun(),输出结果并保留0位小数。#include<stdio.h>floatfact(floatm){floati,s=1;for(i=1;i<=m......
  • 洛谷P1013 [NOIP1998 提高组] 进制位
    P1013[NOIP1998提高组]进制位P1013题目传送门这是一道提高+/省选-的蓝题,有亿点点难度,我们先分析一下。分析字母的数量等于进制的大小,判错的时候,可以看一下那个表格右下角的一个等腰三角形,就会发现有一个由两位字母组成的三角形。我们验算一下,对于\(L\),在该三角形的双位字......
  • C语言 计算一个数的阶乘两种方法
    //ConsoleApplication15.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。//#include<iostream>#include<stdio.h>usingnamespacestd;longfact(intn);//使用循环方法longrfact(intn);//使用递归方法intmain(void){  intnum;  printf("Thisprog......
  • 西农OJ P1073 阶乘TvT
    1073:阶乘题目描述给一个整数,请输出该数字阶乘的后缀0的个数,例如:数字7,它的阶乘为5040,后面有一个0,则输出1;还有数字10,它的阶乘为3628800,后面有两个0,则输出2。输入第一行一个数据N,小于100,表示一共要输入n个数字,以后n行输入一个数字。输出对应于每一个输入,输出一个满足题目要......
  • Acwing 197 阶乘分解
    我觉得都不用过多解释,看代码就懂了#include<bits/stdc++.h>#definelllonglongusingnamespacestd;constintN=1e6+10;intread(){ intx=0; chars=getchar(); while(s<'0'||s>'9') { s=getchar(); } while(s>='0'&&......
  • P1012 [NOIP1998 提高组] 拼数
     题解:这道题最大的坑:32和321,32321>32132 1#include<bits/stdc++.h>2usingnamespacestd;3stringa[25];4boolcmp(conststring&a,conststring&b)5{6return(a+b>b+a);//这里太妙了7}8intmain()9{10int......
  • C# 表达式体方法 C#算阶乘
    //表达式体方法privateintAdd(inta,intb)=>a+b;[Fact]publicvoidTest(){varresult1=Factorial(1);//1varresult2=Factorial(2);//2varresult3=Factoria......
  • (简单)计算斐波那契数列与阶乘
    斐波那契数列pythondeffibonacci(n):ifn<=0:return"Invalidinput"elifn==1:return0elifn==2:return1else:prev_1=0prev_2=1for_inrange(n-2):curre......
  • T1173 阶乘和
    T1173阶乘和题目传送门首先,题目里说了高精度,那还想什么?这里介绍一个有亿点点难懂的方法上课!第一步首先,先建立一个结构体来模拟大整数类。结构体不仅可以包含成员变量,还能定义成员函数。代码如下:#definemaxn100structBigint{intlen,a[maxn];//为了兼顾效率和复......
  • 实现阶乘的运算
    #include<stdio.h>intmain(){unsignedlonglonginta=1;unsignedlonglongintb=0;unsignedlonglongintc=0;scanf("%llu",&c);getchar();for(b=1;b<=c;b+=1){a=a*b;}pr......