高精度加法

合集下载

C++知识点高精度

C++知识点高精度

C++知识点⾼精度⼀.⾼精度加法1.1 ⾼精度加法⾼精度运算的基本运算就是加和减。

和算数的加减规则⼀样,模拟竖式计算,考虑错位运算与进位处理。

#include <cstdio>#include <cstring>int main(){char a[202]={0}, b[202]={0};scanf("%s%s", a, b);int alen = strlen(a), blen = strlen(b), t = 0, i;int a1[202]={0}, b1[202]={0};for (i = 0; i < alen; i++) a1[i] = a[alen-1-i]-'0';for (i = 0; i < blen; i++) b1[i] = b[blen-1-i]-'0';alen = (alen > blen) ? alen : blen;for (i = 0; i <= alen; i++)t = a1[i]+b1[i], a1[i] = t%10, a1[i+1] += t/10;while (!a1[i] && i) i--;for(; i >= 0; i--) printf("%d", a1[i]);return0;}1.2 ⾼精度加法(压位)(清北学堂成果)int型可以存9位数字,⽽上述代码在数组的每个元素中只存了0-9中的⼀位数,可以说浪费了很多空间,⽽且计算机计算4+5和3333+4444⽤的时间是相同的,所以我们有时候⽤压位来节省空间和时间。

其原理如下:从键盘读⼊⼤整数并存放在字符数组中从后向前每⼋位数字存放在⼀个int型数组的⼀个元素中对两个数组的对应元素进⾏加减运算,有进位要进位,最后输出#include <iostream>#include <cstring>#include <cstdio>using namespace std;const int INF = 1E8;struct Data{int u[50], l;Data(){memset(u, 0, sizeof(u)), l = 0;}void change(string a){int len = a.size(), k = len / 8, i = 0;l = k + (len%8 > 0);for (len; len > 8; len -= 8)sscanf(a.substr(len-8, 8).c_str(), "%d", &u[i++]);if (len > 0) sscanf(a.substr(0, len).c_str(), "%d", &u[i]);}void print(){int k = l-1;printf("%d", u[k--]);while (k >= 0) printf("%8.8d", u[k--]);printf("\n");}}a, b;int main(){string aa, bb, ac;cin >> aa >> bb;int ka = 0, kb = 0, i;a.change(aa),b.change(bb);for (i = 0; i < 50; i++)a.u[i] +=b.u[i], a.u[i+1] += a.u[i] / INF, a.u[i] %= INF;for (i = 49; a.u[i]==0 && i>0; i--);a.l = i + 1;a.print();return0;}⼆.⾼精度减法2.1 ⾼精度减法原理和加法⼀样,需要不过考虑的不是进位,⽽是借位。

蓝桥杯高精度加法

蓝桥杯高精度加法

蓝桥杯高精度加法
蓝桥杯是全国性的计算机科学比赛,其中高精度加法是其中一道经典题目。

高精度加法是指对于两个超过了计算机能够表示的整数,需要使用字符串或数组等数据类型进行计算,以获取准确的结果。

这种计算方法通常被用于大数据处理和密码学等领域。

在蓝桥杯中,高精度加法的题目通常要求实现一个函数,该函数接受两个字符串参数代表两个整数,然后返回对应的加法结果。

实现高精度加法的关键在于对于进位的处理。

在每一位上,如果当前两个数字相加后超过了10,就需要将进位加到下一位上。

同时,在最高位上,如果相加后超过了最大位数,需要在最高位上加上进位。

除了基本的加法,高精度加法还可以扩展到多个数字的加法。

在这种情况下,可以使用数组或链表等数据结构进行计算。

在蓝桥杯的高精度加法题目中,通常需要注意输入数据的格式和边界情况。

同时,为了确保程序的效率,需要使用高效的算法和数据结构进行计算。

- 1 -。

C语言实现高精度加法

C语言实现高精度加法

C语⾔实现⾼精度加法本篇为⾼精度加法的计算,接下来我还会去写⾼精度乘法的计算。

⼀、⾼精度运算的概念⾼精度运算其实就是参与运算的数完全超出基本数据类型所能表⽰的范围的运算(例如int型范围就是 - 2147483648 ~+ 2147483647)所以如果想求较⼤数的话就要创建新的数据类型⼆、数据类型的选取我选择的是int型数组,这样⽐较便于计算和理解三、代码其中a和b我是通过随机数来赋值//author summer_awn//date 2017/6/20#include<iostream>#include<time.h>#define lenth_a 200#define lenth_b 200using namespace std;//计算a+bvoid main() {srand((unsigned)time(NULL));int * a = new int[lenth_a];//数组a ******for (int i = 0; i < lenth_a; ++i) {a[i] = rand() % 10;}cout << "a=";for (int i = lenth_a - 1; i >= 0; --i) {//输出acout << a[i];}cout << endl;cout << endl;int * b = new int[lenth_b];//数组b ******for (int i = 0; i < lenth_a; ++i) {b[i] = rand() % 10;}cout << "b=";for (int i = lenth_b - 1; i >= 0; --i) {//输出bcout << b[i];}cout << endl;cout << endl;int lenth_result;//结果的长度enif (lenth_a > lenth_b) lenth_result = lenth_a + 1;else lenth_result = lenth_b + 1;//通过⼀个判断来确定结果的长度int * a2 = new int[lenth_result];//a2***********int * b2 = new int[lenth_result];//b2***********memcpy(a2, a, sizeof(int)*lenth_a);//memset(a2 + lenth_a, 0, sizeof(int)*(lenth_result - lenth_a));memcpy(b2, b, sizeof(int)*lenth_b);memset(b2 + lenth_b, 0, sizeof(int)*(lenth_result - lenth_b));delete(a);delete(b);int * result = new int[lenth_result];//result*********result[0] = a2[0] + b2[0];for (int i = 1; i < lenth_result - 1; ++i) {result[i] = a2[i] + b2[i] + result[i - 1] / 10;result[i - 1] = result[i - 1] % 10;}result[lenth_result - 1] = result[lenth_result - 2] / 10;result[lenth_result - 2] = result[lenth_result - 2] % 10;delete(a2);delete(b2);cout << "结果=";for (int i = lenth_result - 1; i >= 0; --i) {cout << result[i];}cout << endl;system("pause");delete(result);}四、结果结果有截图,未验证(因为懒)以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

高精度加法

高精度加法

答案:12345678911233
133 div 10=13,即新的进位,留给百位
3、百位9+13=22
22 mod 10=2,即新的百位数字为2
22 div 10=2,即新的进位,留给千位
4、千位9+2=11
11 mod 10=1,即新的千位数字为1
11 div 10=1,即新的进位,留给万位
5、万位0+1=1
输出结果: 因为a[1]是个位,a[2]是十位,……,因此 在输出时,应采取降序输出: for i:=n downto 1 do write(a[i]);
任务1: 请你编写程序,计算高精度与单精度数值之和并输出。
二、高精度加高精度 即:大数字加上大数字
如:12345678909999+9999888877776666
1 mod 10=1,即新的万位数字为1
1 div 10=0,没有进位,结束计算。
特殊情况:最高位进位 99999999999999+1=100000000000000
14位
15位
原有数值加上新数值以后,位数会增加,要考虑到
进位,一般是在加完以后判断最高位div10,看结果 是不是大于0,如果是说明有进位,应当处理进位: 1、原有长度加1 2、原最高位重新赋值 3、新最高位赋值
做法: 1、用2个字符串接收这2个数字; 2、定义三个数组:a,b,c,分别用来转换这两个大数字以及存储结果; 3、求出2个字符串的长度m和n,结果使用长字符串的长度(假如是k); 4、从个位开始逐位相加,并加上从前一位来的进位,个位时进位是0, 假设用t表示进位,开始时令t=0,就有c[1]:=a[1]+b[1]+t=9+6+0=15, 然后t:=c[1] div 10=1,也是下一位的进位,c[1]:=c[1] mod 10=5,即 个位真正的值,c[2]:=a[2]+b[2]+t=9+6+1=16,t:=c[2] div 10=1, c[2]:=c[2] mod 10=6,以后以此类推; 5、处理最高位的进位。

高精度计算加法

高精度计算加法

高精度计算加法1 加法加法是数学中最常见的计算方法,它是对两个数的求和运算。

它是计算机中也最常见的运算,也是最基本的运算。

在高精度的计算中,加法更加复杂,它要求计算精度更高,不能简单地看作就是对两个数求和。

下面我们就来介绍加法的高精度计算方法:2 高精度加法的实现原理高精度加法的实现原理是将两个数按位分解,然后依次相加,每位加法采用模运算处理进位,以避免溢出。

例如,两个数的加法运算如下:A=12345678B=98765432加法运算结果:101222210将A和B分解,A=12 345 678,B=98 765 4321.第一步:将B的最右位7和A的最右位8求和,得15,进位1;2.第二步:将B的倒数第二位6和A的倒数第二位5及进位1求和,得12,进位1;3.第三步:以此类推,将B的每一位和A的每一位及进位求和,最终得出的结果就是加法运算的结果:101222210。

从上述例子可以看出,在高精度加法中,每次进行加法运算的时候,都要考虑进位的情况,并采用模运算处理进位,以确保计算精确度不损失。

3 加法的应用在计算机科学中,高精度加法的应用极为广泛。

(1)大整数乘法计算:任意精度乘法运算可以转化成多次高精度加法运算,在大整数乘法中,可以采用高精度加法来进行转换,从而使得乘法运算更加准确。

(2)多项式乘法计算:多项式的乘法计算也可以采用高精度加法来计算,从而节省不少时间。

(3)向量运算:向量的运算也可以采用高精度加法来实现,可以在保证精度的前提下,大大节省时间。

4 总结高精度加法是数学中最常见的运算,也是计算机中最常见的运算。

它要求计算的精度更高,不能简单地看作就是对两个数求和。

为了保证运算的精度,需要采用模运算处理进位。

高精度加法的应用极为广泛,既可以用于大整数乘法计算,又可以用于多项式乘法计算,也可以用于向量运算。

Pascal高精度运算(加法篇)

Pascal高精度运算(加法篇)
• 高精度运算的思想就是运用字符串和一维数组的方式 模拟运算 • 口诀就是:用字符串读入数据,转化数据类型,用数组 存储数据,并加以运算:
高精度运算涉及到的问题:
1、数据的输入。 2、数据的存储。
3、数据的运算:进位。
4、结果的输出:小数点的位置、处理多余的0等。
高精度加法
题目要求: 输入: 第一行:正整数a。 第二行:正整数b。已知:a和b(<10240)。
思考、高精度减法运算
问题表述: 输入a,b(<10240)两个数,输出a-b的值。
样例1输入: 456 409 样例1输出: 47
样例2输入: 999 1000 样例2输出: -1
F(i):第i个月后共有的兔子对数。 F(1)=1; F(2)=1; f(3)=2; f(4)=3; f(5)=5; f(6)=8;
F(i)=f(i-2)+f(i-1)
{N<=93} var f:array[1..100] of longint; var n,i:integer; begin readln(n); f[1]:=1; f[2]:=1; for i:=3 to n do f[i]:=f[i-2]+f[i-1]; writeln(f[n]); end.
处理进位: for i:=1 to len do begin c[i+1]:=c[i+1]+c[i] div 10; c[i]:=c[i] mod 10; end;
4、结果的输出:数组c。
if c[len+1]>0 then len:=len+1; for i:=len downto 1 do write(c[i]);
继续思考
a,b:array[1..maxn] of integer; 在前面的运算中我们定义数组中的数字为 integer类型的值,但是我们知道integer的 值数字可以表示-32000到+32000之间的数 字,是否有些浪费?

高精度运算

高精度运算

高精度运算第二讲高精度运算(加法)一、高精度加法运算学习中级本书上的P180页到183页举例:回文数若一个数(首位不为零)从左向右读与从右向左读都是一样,我们就将其称之为回文数。

例如:给定一个10进制数56,将56加65(即把56从右向左读),得到121是一个回文数。

又如:对于10进制数87:STEP1:87+78 = 165 STEP2:165+561 = 726STEP3:726+627 = 1353 STEP4:1353+3531 = 4884 在这里的一步是指进行了一次N进制的加法,上例最少用了4步得到回文数4884。

写一个程序,给定一个N(2<=N<=10或N=16)进制数M,求最少经过几步可以得到回文数。

如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible!”样例:INPUT OUTPUTN = 9 M= 87 STEP=6[算法设计] 本问题的核心是高精度加法,具体处理起来可以分为三个部分。

第一,是对读入数据的处理。

本题中,数据的进制是可变的,所以用整型数(即十进制数)不是很方便,考虑一般情况,我们可以采用字符串读入,再对数据作后期加工,把它的每一位都分离开来,存入一个数组digit里,数组invert存放数组digit的倒序,变量len记录了数据的位数。

在转化过程中要注意到16进制的特殊性,要对于字母A B C D E F要单独处理。

第二,进行判断与运算。

存储数据时用什么形式表示其实无所谓,关键是做加法运算的时候要符合n进制的规律。

所以,运算时一律以10进制形式存储,存储该位数码对应的十进制数值,A用10,F用15表示。

判断是否构成回文数时也一样用10进制,逐对比较对称的两个数位上的数字,看它们是否相等。

做加法的次数以30次为限。

第三,输出结果。

如果当前的数是回文数,则输出步数;否则按“Impossible”输出。

[程序清单]program ex6_5(input,output)const max=1000;type arraytype=array [1..max] of longint;var i,n,len,step:longint;str:string;digit,invert:arraytype;function palindrome(var digit:arraytype;len:longint):boolean;var i,j:longint;begini:=1; j:=len;while (i<="" p="">begin i:=i+1; j:=j-1 end;if iend;beginwrite('Input n:'); readln(n);write('Input number:'); readln(str);for i:=1 to max do digit[i]:=0;len:=length(str);for i:=1 to len doif str[i]>='A'then digit[len+1-i]:=ord(str[i])-ord('A')+10else digit[len+1-i]:=ord(str[i])-ord('0');step:=0;while (step<30) and not(palindrome(digit,len)) dobeginfor i:=1 to len do invert[i]:=digit[len+1-i];for i:=1 to len do digit[i]:=digit[i]+invert[i];for i:=1 to len doif digit[i]>=n thenbegin digit[i+1]:=digit[i+1]+1;digit[i]:=digit[i]-n end;if digit[len+1]>0 then len:=len+1;step:=step+1end;if step=30then writeln('Impossible!')else writeln('STEP=',step)end.二、高精度减法运算(中级书183~186页)自学三、高精度乘法运算学习中级本书上的P186页到189页举例:用高精度计算出S=1!+2!+3!+…+n!(n≤50),其中“!”表示阶乘,例如:5!=5*4*3*2*1,输入正整数N,输出计算结果S。

高精度加法(c++)

高精度加法(c++)

高精度加法(c++)题目:输入两个整数a和b,输出这两个整数的和。

a和b都不超过100位。

算法描述由于a和b都比较大,所以不能直接使用语言中的标准数据类型来存储。

对于这种问题,一般使用数组来处理。

定义一个数组A,A[0]用于存储a的个位,A[1]用于存储a的十位,依此类推。

同样可以用一个数组B来存储b。

计算c = a + b的时候,首先将A[0]与B[0]相加,如果有进位产生,则把进位(即和的十位数)存入r,把和的个位数存入C[0],即C[0]等于(A[0]+B[0])%10。

然后计算A[1]与B[1]相加,这时还应将低位进上来的值r也加起来,即C[1]应该是A[1]、B[1]和r三个数的和.如果又有进位产生,则仍可将新的进位存入到r中,和的个位存到C[1]中。

依此类推,即可求出C的所有位。

最后将C输出即可。

输入:输入包括两行,第一行为一个非负整数a,第二行为一个非负整数b。

两个整数都不超过100位,两数的最高位都不是0。

输出:输出一行,表示a + b的值。

样例输入20100122201001221234567890 2010012220100122样例输出20100122203011233454668012代码:#include <bits/stdc++.h>using namespace std;int a[100],b[100],c[100];int index=0,carry=0;int main() {string s1,s2;cin>>s1>>s2;for(int i=0; i<s1.length(); i++) { a[i]=s1[s1.length()-i-1]-'0';}for(int i=0; i<s2.length(); i++) { b[i]=s2[s2.length()-i-1]-'0';}while(index<s1.length()||index<s2.length()) { c[index]=a[index]+b[index]+carry;carry=c[index]/10;c[index]%=10;index++;}c[index]=carry;if(c[index]!=0) cout<<c[index];for(int i=index-1; i>=0; i--) {cout<<c[i];}return 0;}。

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

程序设计挑战式课程设计极限挑战挑战,不是为着征服自然,而是为着突破自我,超越自我生命有极限,思想无极限,高度有极限,境界无极限
作业名称:
高精度加法 学 院:
班 级:
学 号:
姓 名:
团队组成: 无
大学
2015年11月23日
请填写以下十项内容,将表格按页对齐(插入空行),勿删除任何部分。

1、问题与背景(描述程序所要解决的问题或应用背景)
2、开发工具(列出所使用的开发工具和第3方开发库)
3、主要功能(详细说明程序的功能)
4、设计内容(详细描述解决问题的原理和方法、算法、数据结构等)
5、程序文件与工程名称(标出程序中所有文件名、工程名称及其说明)
6、函数模块(程序中各个函数的原型声明及其说明)
7、使用说明(运行程序的小型说明书)
8、程序开发总结(简要叙述编写本作业的收获与思考)
9、运行截图(附上程序运行的截图画面,至少有1幅,截图越翔实得分越高)
Windows中抓取当前活动窗口:Alt + Print Screen,抓取全屏:Print Screen。

或者使用HyperSnap等软件(百度搜索)。

10、源程序(附上程序源代码,若是多个文件,标出文件名)
源文件:高精度加法\main.cpp
源代码如下:
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
void add(const char *num1,const char *num2,char *result);
int main()
{
char s[100]={0},argv1[100]={0},argv2[100]={0};
int a=1;
cout<<"本程序用于两个数的高精度加法计算,允许正负号"<<endl;
cout<<endl<<endl;
while (a)
{
cout<<"请分别输入两个100位以内的数字,以回车结束"<<endl;
gets(argv1);
gets(argv2);
cout<<endl;
cout<<"下面将输出两数的和"<<endl;
add(argv1,argv2,s);
cout<<s<<endl<<endl;
cout<<"继续请输入1,结束请输入0"<<endl;
cin>>a;
cout<<endl;
if (a)
{
s[100]={0},argv1[100]={0},argv2[100]={0};
cout<<"请按回车以继续"<<endl;
getchar(),getchar();
cout<<endl;
}
}
return 0;
}
int ctoi(char c)
{
return (c-'0');
}
void _add(const char *num1,const char *num2,char *result) {
int i,j,k,n1,n2,n;
int sig,sta,car,len1,len2;
char c[100]={0};
sig=(*num1=='-')?-1:1,sta=(sig==-1)?1:0;
len1=strlen(num1),len2=strlen(num2);
if (len1>=len2)
{
j=len2-1;
k=0,car=0;
for (i=len1-1;i>=sta;i--)
{
n1=ctoi(num1[i]);
n2=(j>=sta)?(ctoi(num2[j])):0;
j--;
n=(car==1)?(n1+n2+1):(n1+n2);
if (n>9) n=n%10,car=1;
else car=0;
c[k]=n+'0';
k++;
}
if (car==1) c[k]=1+'0',k++;
}
else
{
j=len1-1;
k=0,car=0;
for (i=len2-1;i>=sta;i--)
{
n2=ctoi(num2[i]);
n1=(j>=sta)?(ctoi(num1[j])):0;
j--;
n=(car==1)?(n1+n2+1):(n1+n2);
if (n>9) n=n%10,car=1;
else car=0;
c[k]=n+'0';
k++;
}
if (car==1) c[k]=1+'0',k++;
}
i=0;
if (sig==-1) result[i]='-',i++;
for (j=k-1;j>=0;j--) result[i]=c[j],i++;
}
void _sub(const char *num1,const char *num2,char *result)
{
int i,j,k,n1,n2,n;
int sig,sta1,sta2,car,len1,len2;
char c[100]={0};
sig=(*num1=='-')?-1:1,sta1=(*num1=='-')?1:0,sta2=(*num2=='-')?1:0;
len1=strlen(num1),len2=strlen(num2);
j=len2-1,k=0,car=0;
for (i=len1-1;i>=sta1;i--)
{
n1=ctoi(num1[i]);
n2=(j>=sta2)?(ctoi(num2[j])):0;
j--;
if (car==1) n1=n1-1,car=0;
if (n1<n2) n=n1+10-n2,car=1;
else n=n1-n2;
c[k]=n+'0';
k++;
}
i=0;
if (sig==-1) result[i]='-',i++;
for (j=k-1;j>=0;j--) result[i]=c[j],i++;
}
void add(const char *num1,const char *num2,char *result) {
int i,j,bigger=0;
int sig1,sig2,sta1,sta2,len1,len2;
sig1=(*num1=='-')?-1:1,sig2=(*num2=='-')?-1:1;
sta1=(sig1==-1)?1:0,sta2=(sig2==-1)?1:0;
len1=strlen(num1),len2=strlen(num2);
if (sig1==sig2) bigger=-1;
else if ((len1-sta1)>(len2-sta2)) bigger=1;
else if ((len1-sta1)<(len2-sta2)) bigger=2;
else
{
for (i=sta1;i<len1;i++)
{
j=sta2;
if (num1[i]>num2[j])
{
bigger=1;
break;
}
else if (num1[i]<num2[j])
{
bigger=2;
break;
}
j++;
}
}
switch (bigger)
{
case 0: result[0]='0'; break;
case -1: _add(num1,num2,result); break;
case 1: _sub(num1,num2,result); break;
case 2: _sub(num2,num1,result); break;
default: break;
}
}。

相关文档
最新文档