高精度整数计算

        这部分主要是学习一下计算  无法用内置整数类型来保存它的值(即位数多到long long都表示不了)  的整数的加法和乘法

        这里使用的方法是首先读入到一个char的数组里,然后初始化转换到int数组里,这样一位就对应数组的一项。

 下面这道题是加法计算,思路就是将对应两个数组位置的数与前一位的进位相加

题目描述

实现一个加法器,使其能够输出a+b的值。

输入描述:

输入包括两个数a和b,其中a和b的位数不超过1000位。

输出描述:

可能有多组测试数据,对于每组数据,
输出a+b的值。

示例1

输入

2 6
10000000000000000000 10000000000000000000000000000000

输出

8
10000000000010000000000000000000
 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4
 5 char a[1001];
 6 char b[1001];
 7 int ansa[1001];  //转换后的a
 8 int ansb[1001];  //转换后的b
 9 int ans[1002];   //输出目标
10
11 int main()
12 {
13     int i;
14     int lena,lenb;
15     int temp,fd;
16     while( scanf("%s%s",a,b)!=EOF)
17     {
18         lena = strlen(a);
19         lenb = strlen(b);
20         memset(ansa,0,1001);
21         memset(ansb,0,1001);
22         memset(ans,0,1002);
23         fd = 0;  //进位
24         for( i=0; i<lena; i++)
25             ansa[i] = a[lena-1-i]-‘0‘;  //注意这里是从后往前
26         for( i=0; i<lenb; i++)
27             ansb[i] = b[lenb-1-i]-‘0‘;
28
29         if( lena<lenb ) lena = lenb;   //选择两个中较大数
30
31         for( i=0; i<lena; i++)
32         {
33             temp = ansa[i]+ansb[i]+fd;
34             fd = temp/10;
35             ans[i] = temp%10;
36         }
37         if( fd ) printf("%d",fd);  //如果最后一次进位不为0则先输出
38         for( i=lena-1; i>=0; i--) printf("%d",ans[i]);
39         printf("\n");
40     }
41     return 0;
42 }

下面这道题是高精度的乘法,这个问题主要就是一个大数乘一个小数(两个大数相乘数字就很大了)

用小乘数乘大乘数的每一位数并加上来自低位的进位,从而得到该位的结果以及向高位的进位。

题目描述

输入一个正整数N,输出N的阶乘。

输入描述:

正整数N(0<=N<=1000)

输出描述:

 输入可能包括多组数据,对于每一组输入数据,输出N的阶乘

示例1

输入

4
5
15

输出

24
120
1307674368000
 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4
 5 int ans[10000];   //输出目标
 6
 7 int main()
 8 {
 9     int n;
10     int i,j;
11     int temp,fd;
12     int index;
13     while( scanf("%d",&n)!=EOF)
14     {
15         memset(ans,0,10000);
16         index=0;  //数组下标,统计个数
17         ans[index++] = 1;  //阶乘第一位为1
18
19         for( i=2; i<=n; i++)
20         {
21             fd=0;  //进位置0
22             for( j=0; j<index; j++)
23             {
24                 temp = ans[j]*i+fd;
25                 ans[j] = temp%10;
26                 fd = temp/10;
27             }
28             while( fd )
29             {
30                 //这里要小心最高位进位可能有多位
31                 ans[index++] = fd%10;
32                 fd /= 10;
33             }
34         }
35         for( i=index-1; i>=0; i--)
36         {
37             printf("%d",ans[i]);
38         }
39     }
40
41     return 0;
42 }

原文地址:https://www.cnblogs.com/yuxiaoba/p/8443984.html

时间: 2024-10-06 23:21:46

高精度整数计算的相关文章

[转]高精度乘法计算

转载自: Daywei 高精度乘法计算 高精度乘法计算基础 1.高精度浮点运算方法 高精度浮点(Floating Point,FP)运算可以转换成整数型运算.由于高精度浮点数可以看成是由整数部分(Integer Part,IP)与小数部分(Decimal Part,DP)的组合,因此其乘法可以看成以下3种运算的组合,即整数x整数(IxI).整数x小数(IxD)和小数x小数(DxD).用表达式表示, 则FP1*FP2=IP1*IP2+(IP1*DP2+IP2*DP1)+DP1*DP2 (1)对于I

Java中的高精度整数和高精度小数

在实际编码中,会遇到很多高精度的事例,比如,在计算金钱的时候就需要保留高精度小数,这样计算才不会有太大误差: 在下面的代码中,我们验证了,当两个float型的数字相加,得到的结果和我们的预期结果是有误差的,为了减小和防止这种误差的出现,我们需要使用BigInteger类和BigDecimal类来计算. package com.ietree.base.number; import java.math.BigDecimal; import java.math.BigInteger; public c

高精度整数 - a+b(王道)

题目描述: 实现一个加法器,使其能够输出a+b的值. 输入: 输入包括两个数a和b,其中a和b的位数不超过1000位. 输出: 可能有多组测试数据,对于每组数据,输出a+b的值 样例输入: 2 6 1000000000000000000000 10000000000000000000000000000000000000000000 样例输出: 8 100000000000000000000000000000000000000000000 #include <iostream> #include

”高精度整数删去若干位以使剩下的值最小“问题

问题描述: 键盘输入一个高精度的正整数N(不超过240位) ,去掉其中任意M个数字后剩下的数字按原左右次序将组成一个新的正整数. 编程对给定的N和M,寻找一种方案使得剩下的数字组成的新数最小.输出组成的新的正整数. 输入数据均不需判错. 如果去掉了某几个位后得到的新整数开头为0,保留0. 输入: 本题有多组测试数据,每组测试数据占一行. 一个高精度正整数N(N不超过240位)一个正整数M.(M为不大于N的长度的正整数) N,M由一个空格分开. 456547 1 456547 2 456547 3

POJ - 2109 - Power of Cryptography = 高精度整数

http://poj.org/problem?id=2109 给一个大概100位的高精度整数p,找他的n次方根,貌似题目有问题,不一定会有开根开得尽的情况,这个时候要找的就是最大的根. 那这样有什么意思呢? 这种题按道理要用Java去写的,可以先从p和n的关系找到根的位数,然后在这个范围里面二分会更快. 具体来说,比如22位的p,7次方根,就是22/7的上整,取4位数. 还有就是因为题目的原因,double的精度对100位的高精度整数开根是足够的,也就是不会的话可以试试莽一发long doubl

Sum(快速幂+大整数计算)

题意:给出一个函数s,该函数值为对于n的s(k)为数列的个数,该数列满足x1,x2--xk为正整数且x1+x2+--+xk=n:求解s(1)+s(2)+--+s(n); 分析:本题最坑的地方在于(1,2)与(2,1)算两种,搞明白这个就可以分析l 对于2来说就是 1 3  : 1,1 4  :1,2,1 5  :1,4,2,1 以此类推可知  其和为2^(n-1);但是n的个数特别大,所以不能直接输入,要采用大数计算方法,一定要用快速幂的方式. 快速幂:a^n=(a^2)^(n/2),这样就可以

C++ 实现高精度的计算

高精度 高精度数通常使用数组来储存,一般高位在后,低位在前(为了方便处理在最高位进位时的插入操作) 高精度加法 按照手算加法的过程一样即可,需要注意处理进位 代码: //A,B是两个数组,分别存放两个待加的高精度数 vector<int> add(vector<int> &A, vector<int> &B){ int t = 0; vector<int> C; for(unsigned i = 0; i < A.size() || i

number-precision Js高精度数学计算Npm包

这两天在用node编写一个有关于金融计算的自动脚本,传输的内容包含了2位小数的加减计算,由于JS自身的计算原因,所以找到了这个数据计算包number-precision非常的好用,使用方法见链接 http://npm.taobao.org/package/number-precision 原文地址:https://www.cnblogs.com/aboys/p/11548202.html

hdu1002 大整数计算

这一题实在有坑,而且是大坑,本来以为只是简单的整数题,最多用long就可以了吧,但是实际上这一题要用到大整数加法,在c++中大整数加法是通过字符串模拟来实现的,Java可以直接使用BigInteger类,后面贴代码,下面是c++常用数据类型的范围: short : -32768 ~ 32767 int : -2147483648 ~ 2147483647 long : -2147483468 ~ 2147483647 float : 1.17549e-038 ~ 3.40282e+038 dou