[入门]高精度运算

(本人知识 while(1)cout<<"非常"; 有限,如果你看到我有任何错漏或者不足,真的真的真的恳请大家指出,蟹蟹,我希望大家可以一起进步~)

int类型的变量只能存放-2^31~2^31-1范围的数据

long long类型的变量只能存放-2^63~2^63-1范围的数据

对于大数阶乘这种肯定是存不下,因此我们需要用数组存放数据;

下面是一个高精度运算的例子:

题目描述

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

思路:

为了减少循环次数以及数组的长度,这里使用long long数组存放数据

代码:

 1 /**[编程入门]阶乘求和*/
 2 #include<iostream>
 3 #include<stdio.h>
 4 #include<math.h>
 5 using namespace std;
 6 //存总和,初始化为0,每个long long存15位
 7 long long data[10]={0};
 8 long long t[10]={1,0};//存i!,初始化为1,否则0的话永远为0
 9 int len=10; //俩数组的长度
10 int n;
11 long long myMax=pow(10,15);
12
13 void myAdd(){//将i!加到data[]
14     int i,j;
15     int temp=0;//进位
16     for(i=0;i<len;i++){
17         data[i]=data[i]+t[i]+temp;
18         temp=data[i]>=myMax?data[i]/myMax:0;
19         data[i]=data[i]%myMax;
20     }
21 }
22 void myMul(int m){//乘法
23     int i,j;
24     int temp=0;//进位
25     for(i=0;i<len;i++){
26         t[i]=t[i]*m+temp;
27         temp=t[i]>=myMax?t[i]/myMax:0;
28         t[i]=t[i]%myMax;
29     }
30 }
31 void print(){//打印结果
32     int i,j,flag=0;
33     for(i=len-1;i>=0;i--){
34         if(flag==1){
35             printf("%015lld",data[i]);//之后的数格式化输出,输出15位
36         }
37         if(data[i]!=0&&flag==0){
38             flag=1;
39             printf("%lld",data[i]);//第一个数不需要格式化输出
40         }
41     }
42 }
43 int main(){
44     int i,j;
45     cin>>n;
46     for(i=1;i<=n;i++){
47         myMul(i); //乘法
48         myAdd(); //加法
49     }
50     print();//打印结果
51     return 0;
52 }

运行结果:

原文地址:https://www.cnblogs.com/ChaseMeng/p/12668470.html

时间: 2024-10-27 12:04:14

[入门]高精度运算的相关文章

hdu4927 Series 1(组合+公式 Java大数高精度运算)

题目链接: Series 1 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 423    Accepted Submission(s): 146 Problem Description Let A be an integral series {A1, A2, . . . , An}. The zero-order series o

高精度运算

在开发中高精度运算使用并非非常频繁,float和double的精度实际上能够满足绝大多数需要,且高精度运算效率比常规的运算要慢一点,但使用高精度运算往往是为了使用其中便捷的API.官方提供的高精度运算的类主要两个 BigInteger:当数值范围超过long时使用 BigDecimal:几乎涵盖BigInteger功能,还可以保留小数点任意位数,理论上精度无穷大,以下主要说明此类 注:两者API很相似 加减乘除 BigDecimal aaa = new BigDecimal(20); BigDe

高精度运算1

1.高精度运算_加法 AYYZOJ p1443 COGS p37 1 type 2 arr=array[1..200]of integer; 3 var 4 a,b:arr;i,la,lb:integer; n:string; 5 procedure add(a,b:arr;la,lb:integer); 6 var i,x,lc:integer; c:arr; 7 begin 8 i:=1; x:=0; 9 while (i<=la) or(i<=lb) do 10 begin x:=a[i

高精度运算专题3-乘法运算(The multiplication operation)

这个专题呢,我就来讲讲高精度的乘法,下面是三个计算乘法的函数,第一个函数是char类型的,要对字符串进行数字转换,而第二个是两个int类型的数组,不用转换成数字,第三个则更为优化,用a数组-b数组放回数组a里面 函数1思路:要先把char类型的转换成int类型的数,直接每个数-‘0’就可以实现把char类型的转换成int类型的了. ①记录数组a.数组b的长度,放到第一位 ②每个位相乘,用一个数来记录进位(初值为0),每个位相乘,加上进位,存入c数组的相对应的位置,每次进位要重新赋值 ③最后记得要

大数高精度运算(模板)

前言:高精度运算.是指參与运算的数(加数.减数,因子--)范围大大超出了标准数据类型(整型,实型)能表示的范围的运算. 模板:包含大数加减乘除.大数与int数的乘法,模板能够不断扩充. 代码: /* 所有亲測可用,可是不能用于负数的运算,仅仅能对正数进行大数运算 */ const int ten[4]= {1,10,100,1000}; const int maxl = 300; struct BigNumber { int d[maxl]; char s[maxl]; BigNumber(co

整数高精度运算——加法

高精度运算是信息学的一种重要算法.这种算法使用多个存储单位进行计算,因此它的计算范围超过一般使用一个存储单位的算法.也是一些信息学竞赛的常考题目. 高精度运算主要有以下几个步骤: 1.读取字符串,转换成数字倒序存储到整数数组中: 2.运算,注意进位和借位: 3.倒序输出整数数组,加法注意最高位进位,减法注意高位中的无用的0不要输出: 高精度加法代码: #include<stdio.h>#include<string.h>char s[1000];       //数组比较大时,应作

算法学习笔记(三)问题的转化与高精度运算

问题:设购票点没有任何的零钱,票价50美元,现有m人手持50美元,n人手持100美元,求这样m+n个人构成的队伍有多少种排队方法可以使得整个售票过程不中断. 分析:对于这个问题,经过简单的模拟可以发现,每个手持100的前面必须有一个手持50的,同样如果有k个手持100的连续出现,则前面至少连续k次50. 这样一来,可以设手持50元的为+1,手持100元的为-1,设ai为为第i个人所对应的值,则问题转化为数组的部分和a1+a2+...+ak≥0,其中k≤m+n,为了求这样的数列的个数,需要使用组合

一个开源的高精度运算库-GMP

https://gmplib.org/ 全称是GNU Multiple Precision Arithmetic Library,即GNU高精度算术运算库,官方网站是:http://gmplib.org/ 它的功能非常强大,接口很简单,文档详尽,有C风格的接口也有C++的精心封装后的接口,其中不但有普通的整数.实数.浮点数的高精度运算,还有随机数生成,尤其是提供了非常完备的数论中的运算接口,比如Miller-Rabin素数测试算法,大素数生成,欧几里德算法,求域中元素的逆,Jacobi符号,le

7-10 高精度运算(20 分

7-10 高精度运算(20 分)提问 分别给出N和A的值(都是整数,1<=N<=150, 0<=A<=15).请给出级数∑?i=1?N??i?A?i??的答案. 输入格式: 有多组测试数据,每组测试数据占一行,该行包含2个整数N和A,以空格分隔. 输出格式: 对于输入每一行,在一行中输出相应于N和A的总和的整数值. 输入样例: 3 3 4 4 输出样例: 102 1252 import java.math.BigInteger; import java.util.Scanner;