高精度

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

• f(3)=2;
{
• f(4)=3;
f3=f1+f2;
• f(5)=5; • f(6)=8;
F(i)=f(i-2)+f(i-1)
f1=f2; f2=f3; }
printf("%ld\n",f3);
• 一、n数求和(problem.c)
• 【问题描述】

有n个数,计算这n个数的和。
• 【输入文件】
• 【问题描述】
• 学习程序我们都要从基础学起,在解决简单的数学问题中学会使用程序,学 会程序的基本的语法和基本的算法。今天我们练习一个简单数学运算——求两 个正整数的和。
• 【输入文件】

文件名:sum.in

文件中有两个正整数,已知这个数字不超过1000000000000000000。
• 【输出文件】
• 加法运算 • 减法运算 • 乘法运算 • 除法运算
高精度除以单精度 ★高精度除以高精度
高精度运算涉及到的主要操作: • 数据的输入和存储
• 数据的运算
加、减、乘、除运算 加法和乘法的进位 减法的借位和符号确定 除法商和余数的处理
• 数据的输出
加法
A+B problem
• 输入两个整数a和b • 计算a+b的值 • 样例输入: 10 20 • 样例输出: 30
1234567891011+17161514 13121110987654321=????
1237 __+____4__7_6____ ____1__6__10__13___
17 1 3
我们该怎么来表示一个几百位数的数呢?
一般变量表示
×
字符串表示

数组表示

1237
476


____a_[]_=_{1_2_3_7_}____________b_[_]=_{_4_76_}______
•2
课后作业
• 计算s=1+2+3+….+n。(n>=1020) • 提示:for循环从1到1020 是行不通的, • 可以用等差数列公式做。 • 会涉及高精度加,乘,除(除以单精度)
减法
减法和加法类似,只是将对应的加换成减就行 了。但是加法有交换律而减法没有,所以会出 现两种情况:结果为正和结果为负
For(i=0;i<n;i++) {
c[i+1]+=c[i]/10; c[i]%=10; }
C[]={3171000000000…}
For(i=n;i>=0;i--) if(c[i]) break;
For(;i>=0;i--) Printf(“%ld”,c[i]); Printf(“\n”);
• 一、求和运算(sum.cpp/.c/pas)

文件名:sum.out

文件中只有一个整数,表示两个数的和。
• 【样例输入】
• 10 30
• 【样例输出】
• 40
乘法
a[]
1234
b[]
X 5678
-----------------------------------
8 16 24 32
7 14 21 28
6 12 18 24
5 10 15 20
a[]={7321}
b[]={674}
数组与竖式的对应
a[max]…a[i]…a[1] a[0] + b[max]…b[i]…b[1] b[0] ___________________________________ c[max+1] c[max]…c[i]…c[1] c[0]
1234 +5678 ------------
除法(高精度除以单精度)
√ _0_9_1_3_6_
5
45681
45
6
18
__3__1_
1
商数 余数
主要代码
t=0; for(i=0;i<len;i++) { t=t*10+a[i]; c[i]=t/b; t%=b; }
The end thanks
主要代码
for(i=0;i<=1000;i++) for(j=0;j<=1000;j++) c[i+j] += a[i] * b[j] ;
for(i=0;i<=1000;i++) { c[i+1]+=c[i]/10; c[i]%=10; }
例题
• Fibonacci数列 :有雌雄一对兔子,假定过两个月后便每 个月可繁殖雌雄各一的一对小兔子。问过n个月后共有多 少对兔子?
要求:n<=1000。
• F[6][200] s[200] • S[1]=f[1][1]+f[2][1]+…+f[5][1]
• For(i=1;i<=6;i++) • for()
• F(i):第i个月后共有的兔子对数。
• F(1)=Байду номын сангаас;
f1=f2=1
• F(2)=1;
for(i=3;i<=n;i++)
1237 __-__0__4__7___6__ ____1__-_2_-_4__1__
07 6 1
0476 _- ___1__2___3__7__ ____-_1 __2__4__-_1_
0 -7 -6 -1
在输出时我们只需将负数变为正即可。 7 6 1 761 -7 -6 -1 -761

文件名:problem.in

输入文件共有n+1行,第一行一个正整数n(2<=n<=5),

第2行到第n+1行为为这n个数,(1<=位数<=100)
• 【输出文件】

文件名:problem.out

文件中只有一个整数,表示n个数的和。
• 【样例输入】
•2
•1
•1 • 【样例输出】
随堂练习(1小时)
6912
a[0]=7 a[1]=3 a[2]=2 a[3]=1
+ b[0]=6 + b[1]=7 + b[2]=4 + b[3]=0
= c[0]=13 = c[1]=10 = c[2]=6 = c[3]=1
两数相加的结果就保存在了c数组中!
主要代码
for(i=0;i<n;i++) {
c[i]=a[i]+b[i]; }
高精度计算
何为高精度?
有时计算机在计算时会受到计算机精度的 限制,从而不能得到想要的结果,因此我们 可以利用计算机编程来解决这个问题。简单 的来说高精度计算就是比较大的数的四则运 算,一般位数是在百位千位等较大的范围内, 纯属的计算机定义变量是无法容纳的,索性 的是我们可以用数组来完成它。
常见的高精度运算:
------------------------------------
5 16 34 60 61 52 32
c[]
------------------------------------
7006652
有上式可得:
a[0]*b[0]c[0] a[0]*b[1]c[1] a[0]*b[2]c[2] … a[1]*b[0]c[1] a[1]*b[1]c[2] a[1]*b[2]c[3] a[i]*b[j]c[i+j]
#include<stdio.h> int main() {
long a , b ; scanf( "%ld%ld" , &a , &b); printf( "%ld\n", a+b ); return 0; }
a+b problem 大家都很熟悉,但它不能完成两个百 位千位以上的数的相加,所以我们就要另辟蹊径。
相关文档
最新文档