高精度进阶

目录

  1. 计算\(2^N\)
  2. 大整数因子
  3. 计算\(n!\)
  4. 阶乘和

1

OPJ1.6.12 计算\(2^N\)

描述

任意给定一个正整数\(N(N\le 100)\),计算2的n次方的值。

输入

输入一个正整数\(N\)。

输出

输出\(2^N\)的值。

样例输入

5

样例输出

32

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <iomanip>
using namespace std;
int ans[1005]={0};
void db2(int c[]){
    for(int i=1;i<=c[0];i++){
        c[i]*=2;
    }
    for(int i=1;i<=c[0];i++){
        if(c[i]>=10){
            c[i+1]+=(c[i]/10);
            c[i]%=10;
        }
    }
    if(c[c[0]+1]) c[0]++;
}
void prta(int c[]){
    for(int i=c[0];i>=1;i--){
        printf("%d",c[i]);
    }
}
int main( ){
    ans[1]=1;
    ans[0]=1;
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        db2(ans);
    }
    prta(ans);
    return 0;
}

2

OPJ1.6.13:大整数的因子

描述

已知正整数\(k\)满足\(2\le k\le 9\),现给出长度最大为30位的十进制非负整数\(c\),求所有能整除\(c\)的\(k\)。

输入

一个非负整数\(c\),\(P_c\)表示\(c\)的位数,\(P_c\le 30\)。

输出

若存在满足 \(c%k=0\) 的\(k\),从小到大输出所有这样的\(k\),相邻两个数之间用单个空格隔开;若没有这样的k,则输出"none"。

样例输入

30

样例输出

2 3 5 6

#include<bits/stdc++.h>
using namespace std;
char str[32];
int len,k;
bool isTrue(int k){
    int num1 = 0, num2=0;
    for(int i=0;i<len;i++){
        num1=str[i]-'0'+num2*10;
        num2=num1%k;
    }
    return num2 == 0;
}
int main(){
    scanf("%s",str);
    len = strlen(str);
    bool ok = false,first = true;
    for(k=2;k<=9;k++){
        if(isTrue(k)){
            ok=true;
            if(first){
                printf("%d",k);
                first = false;
            }else{
                printf(" %d",k);
            }
        }
    }
    if(!ok) puts("none");
    else putchar('\n');
    return 0;
}

3

1.6.14:\(n!\)

描述

求\(10000\)以内\(n\)的阶乘。

输入

只有一行输入,整数\(n(0\le n\le 10000)\)。

输出

一行,即\(n!\)的值。

样例输入

100

样例输出

93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000

#include<bits/stdc++.h>
using namespace std;
int n,a,fac[50000],ans[50000]={1,1};
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=ans[0];j++){
            ans[j]=ans[j]*i+fac[j];
            fac[j]=0;
            if(ans[j]>=10){
                fac[j+1]+=ans[j]/10;
                ans[j]%=10;
                if(j==ans[0]) ++ans[0];
            }
        }
    }
    for(int i=ans[0];i>0;i--) printf("%d",ans[i]);
    putchar('\n');
    return 0;
}

4

OPJ1.6.15 阶乘和

描述

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

其中“!”表示阶乘,例如:\(5!=5\times 4\times 3\times 2\times 1\)。

输入正整数\(N\),输出计算结果\(S\)。

输入

一个正整数\(N\)。

输出

计算结果\(S\)。

样例输入

5

样例输出

153

来源

NOIP1998复赛 普及组 第二题

#include<bits/stdc++.h>
using namespace std;
int a[10001]={1};
int ans[100001]={0};
char n[1001];
int en[1001];
int lans=1;
int la=1;
int x;
int main()
{
    int n;
    cin>>n;
    int x=0;
    for(int i=1;i<=n;i++)
    {
        memset(a,0,sizeof(a));
        a[0]=1;
        for(int k=1;k<=i;k++)
        {
            for(int j=0;j<la;j++)
            {
                a[j]=a[j]*k+x;
                x=a[j]/10;
                if(x>0&&j==la-1)
                    la++;
                a[j]=a[j]%10;
            }
        }
        int l=0;
        x=0;
        while(l<=la||l<=lans) {
            ans[l]=ans[l]+a[l]+x;
            x=ans[l]/10;
            if(x>0)lans++;
            ans[l]=ans[l]%10;
            l++;
        }
    }
    int flag=0;
    for(int i=lans;i>=0;i--){
        if(ans[i]==0&&flag==0) continue;
        else flag=1;
        cout<<ans[i];
    }
    return 0;
}

原文地址:https://www.cnblogs.com/liuziwen0224/p/12000541.html

时间: 2024-10-10 05:01:52

高精度进阶的相关文章

Web安全工程师(进阶)课程表

01-SQL注入漏洞原理与利用 预备知识: 了解HTTP协议,了解常见的数据库.脚本语言.中间件.具备基本的编程语言基础. 授课大纲: 第一章:SQL注入基础 1.1 Web应用架构分析1.2 SQLi注入环境搭建1.3 SQL注入原理分析1.4 MySQL注入方法逻辑运算及常用函数1.5 SQL注入流程1.6 SQL手工注入方法 第二章:SQL注入语法类型 2.1 union联合查询注入2.2 update注入2.3 insert注入2.4 oder by注入 第三章:SQL盲注 3.1 SQ

通过例子进阶学习C++(五)计算2的1次方至2的64次方之和

本文是通过例子学习C++的第五篇,通过这个例子可以快速入门c++相关的语法. 1.上篇回顾 在上一篇中,我们通过字符数组计算264次方: 通过例子进阶学习C++(四)计算2的64次方 带着这个问题:为什么用字符数组,不用整数数组,开始本文. 2.先计算1+2+3+...100的和并总结规律 本题目直接实现,有点复杂,我们先计算1+2+3+...100的和,总结规律后再来计算. 这个是一个经典的循环问题,可以用for.while.do-while求和. #include<iostream> us

Azure进阶攻略丨Azure网络通不通,PsPing&amp;PaPing告诉你答案

很多时候,为了解决一些问题,要查各种文档,很麻烦你造吗!做「伸手党」又容易被鄙视,这时候就需要用到[Azure 进阶攻略]啦!特此,我们推出关于 Azure 常用操作指南的系列文章,每篇涉及一个 Azure 使用过程中的问题,简明扼要直击重点,纯干货内容帮你快速搞定 Azure 使用难题和障碍,只需一两分钟阅读,你就可以继续愉快地翱翔云端~ 在技术人员和网络工程师的世界中,有一些众所周知的排错方式,例如: -你先 Ping 一下某某计算机,看它开着没, -我可以 Ping 通路由器,但 Ping

Java进阶书籍推荐

学习Java,书籍是必不可少的学习工具之一,尤其是对于自学者而言.废话不多说,下边就给广大程序猿们推荐一些Java进阶的好书. 第一部分:Java语言篇 1.<Java编程规范> 适合对象:初级.中级 介绍:这本书的作者是被誉为Java之父的James Gosling,入门者推荐阅读,对基础的讲解很不错. 2.<Java编程思想> 适合对象:初级.中级 介绍:豆瓣给出了9.1的评分,全球程序员广泛赞誉.有人说这本书不适合初学者,不过小编认为作者并没有对读者已有的知识经验有过多要求,

进阶之初探nodeJS

一.前言 在"初探nodeJS"随笔中,我们对于node有了一个大致地了解,并在最后也通过一个示例,了解了如何快速地开启一个简单的服务器. 今儿,再次看了该篇随笔,发现该随笔理论知识稍多,适合初级入门node,固萌生一个想法--想在该篇随笔中,通过一步步编写一个稍大一点的node示例,让我们在整体上更加全面地了解node. so,该篇随笔是建立在"初探nodeJS"之上的,固取名为"进阶之初探nodeJS". 好了,侃了这多,那么我们即将实现一个

机器学习进阶笔记之一 | TensorFlow安装与入门

原文链接:https://zhuanlan.zhihu.com/p/22410917 TensorFlow 是 Google 基于 DistBelief 进行研发的第二代人工智能学习系统,被广泛用于语音识别或图像识别等多项机器深度学习领域.其命名来源于本身的运行原理.Tensor(张量)意味着 N 维数组,Flow(流)意味着基于数据流图的计算,TensorFlow 代表着张量从图象的一端流动到另一端计算过程,是将复杂的数据结构传输至人工智能神经网中进行分析和处理的过程. -- 由 UCloud

Python之路【第十七篇】:Django【进阶篇 】

Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行数据库操作 import MySQLdb def GetList(sql): db = MySQLdb.connect(user='root', db='wupeiqidb', passwd='1234', host='localhost')

bash脚本编程之case语句及脚本选项进阶

case语句及脚本选项进阶详解     面向过程程序设计语言中的控制流(即程序当中的语句)默认是顺序执行的. 程序设计语言的控制结构一共有三类: 1,顺序结构 2,选择结构 (1)if语句 ->单分支的if语句 格式:if condition1;then expression ... fi ->双分支的if语句 格式:if condition1;then expression ... else expression ... fi ->多分支的if语句 格式:if condition1;t

Java进阶(三十四)Integer与int的种种比较你知道多少?

Java进阶(三十四)Integer与int的种种比较你知道多少? 前言 如果面试官问Integer与int的区别:估计大多数人只会说到两点:Ingeter是int的包装类,注意是一个类:int的初值为0,Ingeter的初值为null.但是如果面试官再问一下Integer i = 1;int ii = 1; i==ii为true还是为false?估计就有一部分人答不出来了,如果再问一下其他的,估计更多的人会头脑一片混乱.所以我对它们进行了总结,希望对大家有帮助. 首先看代码: package