高精度1--加法

高精度1--加法

一、心得

自己写的东西才是自己的,看一百遍都不一定看得会

//没有考虑到输出的时候a[0]是0的情况
//边界情况多多考虑

二、题目及分析

计算12345678987755+4324324324

/*
高精度加法:
模拟手算
1、初始化:数组和倒序
2、加:相加和进位
3、输出:倒序
*/

三、代码及结果

自己的:

 1 /*
 2 高精度加法:
 3 模拟手算
 4 1、初始化:数组和倒序
 5 2、加:相加和进位
 6 3、输出:倒序
 7 */
 8 #include <iostream>
 9 #include <string>
10 #define Max 105
11 using namespace std;
12 /*
13 s=12345
14 length=5
15 a[5] 0-4
16 1 s4
17 2 s3
18 3 s2
19 4 s1
20 5 s0
21 */
22 //初始化字符串:变为int数组和倒序
23 void init(string &s,int (&a)[Max]){
24     int length=s.length();
25     a[0]=length;
26     for(int i=1;i<=length;i++){
27         a[i]=s[a[0]-i]-‘0‘;//a[0]这里注意下
28     }
29
30     return ;
31 }
32 //显示数组
33 void printArray(int (&a)[Max]){
34     //print
35     for(int i=1;i<=a[0];i++){
36         //cout<<a[i]<<" ";
37         printf("%3d  ",a[i]);
38     }
39     cout<<endl;
40 }
41 //加操作
42 void add(int (&a)[Max],int (&b)[Max]){
43     if(a[0]<b[0]) a[0]=b[0];
44     //逐位相加
45     for(int i=1;i<=a[0];i++){
46         a[i]+=b[i];
47     }
48     printArray(a);
49     //处理进位
50     for(int i=1;i<=a[0];i++){
51         a[i+1]+=a[i]/10;
52         a[i]=a[i]%10;
53     }
54     printArray(a);
55     //看最高位是否进位,看相加之后是否边长
56     if(a[a[0]+1]>0) a[0]++; //修正a的位数(a+b最多只能进一位)
57 }
58 //输出结果
59 void outputAns(int (&a)[Max]){
60     //没有考虑到输出的时候a[0]是0的情况
61     //边界情况多多考虑
62     if(a[0]==0){cout<<0<<endl;return;}
63     for(int i=a[0];i>=1;i--){
64         cout<<a[i];
65     }
66     cout<<endl;
67 }
68
69 int main(){
70     freopen("in.txt","r",stdin);
71     string s1,s2;
72     cin>>s1>>s2;
73     cout<<s1<<"  "<<s2<<endl;
74     //初始化数字串s1
75     int a[Max]={0};//要初始化为0
76     init(s1,a);
77     printArray(a);
78     //初始化数字串s2
79     int b[Max]={0};//要初始化为0
80     init(s2,b);
81     printArray(b);
82     //a和b数组相加
83     add(a,b);
84     //输出结果
85     outputAns(a);
86     return 0;
87 } 

书上的:

 1 /*
 2 高精度就是在模拟手算
 3 用计算机模拟手算的方法就可以得到各种高精度
 4 */
 5 #include <iostream>
 6 using namespace std;
 7 //初始化字符数组,
 8 //将数串s转换为数组a,并倒序存储.
 9 void init(int a[]){
10     string s;
11     cin>>s;//读入字符串
12     a[0]=s.length();  //用a[0]计算字符串s的位数
13     for(int i=1;i<=a[0];i++){
14         a[i]=s[a[0]-i]-‘0‘;//将数串s转换为数组a,并倒序存储.
15     }
16 }
17 //高精度加法
18 void jia(){
19     int i,k;
20     if(a[0]<b[0]) a[0]=b[0];//确定加法最大位数
21     for(i=1;i<=a[0];i++)a[i]+=b[i]; //逐位相加
22     for(i=1;i<=a[0];i++)
23     {
24         a[i+1]+=a[i]/10;
25         a[i]%=10;
26     } //处理进位
27     if(a[a[0]+1]>0)a[0]++;//修正a的位数(a+b最多只能进一位)
28 }
29 //输出
30 void print(int a[])  //打印输出
31 {
32     int i;
33     if(a[0]==0){cout<<0<<endl;return;}
34     for(i=a[0];i>=1;i--)cout<<a[i];
35     cout<<endl;
36 }
37
38 int main(){
39     return 0;
40 } 
时间: 2024-10-10 10:24:55

高精度1--加法的相关文章

【高精度】加法天才

问题 A: [高精度]加法天才 时间限制: 1 Sec  内存限制: 64 MB提交: 14  解决: 10[提交] [状态] [讨论版] [命题人:] 题目描述 贝贝是一个聪明的小孩,他总喜欢玩数字加法的游戏.一天,他的数学老师为了考一考他的能力,出了一道这样的题:要求他在短时间内计算出两个大数相加的结果.这两个大数可不是普通的数字,它们是11位以上的"庞然大物". 请你编程序,帮贝贝解决这个问题. 输入 两行,分别是两个需要相加的数A和B,这两个数在10^11-10^100之间.

高精度计算(二) /*高精度的加法运算*/

例 高精度加法运算 输入正整数 a 和 b,输出 a+b 的值.0<a,b<=10^250 输入: 第一行:a 第二行:b   输出:a+b 的和. 样例输入: 99    999 样例输出: 1098 分析: (1)加法运算      -- a[7]  a[6]  a[5]  a[4]  a[3]  a[2]  a[1] -+-   0      0    b[5]  b[4]  b[3]  b[2]  b[1] ----------------------------------    

FZU 2032 高精度小数加法

题目描写很没意思..就是说给出n个小数 求它们的总和 因为给出的小数点后最多16位而要求保存至12位 而能直接使用的最精确的double只能到12位 于是13的进位可能被忽略 于是不可以用double 于是它就是一个很裸的小数高精度加法..还只是加法.. 在比赛的时候学长很快就敲出来了代码并且AC 但是被别人极多提交的极短且超时代码唬住(猜测应该是直接相加) 以为直接相加的O(N)的复杂度尚且不可..所以甚至连试做都没有 赛后写出代码F9直接运行 但是小数上的进位转到整数上遗漏 更改后AC #i

整数高精度运算——加法

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

无线OSS-高精度整数加法

#include<iostream> #include<string> using namespace std; int compareStr(string str1, string str2) { int num1 = str1.length(); int num2 = str2.length(); if(num1>num2) return 1; if(num1<num2) return -1; if(num1==num2) { for(int i=0; i<n

高精度之加法

题目描述 Description 给出两个正整数A和B,计算A+B的值.保证A和B的位数不超过500位. 输入描述 Input Description 读入两个用空格隔开的正整数 输出描述 Output Description 输出A+B的值 样例输入 Sample Input 3 12 样例输出 Sample Output 15 数据范围及提示 Data Size & Hint 两个正整数的位数不超过500位 思路简单 #include<stdio.h> #include<st

高精度小数加法

例题链接:hdu1753   http://acm.hdu.edu.cn/showproblem.php?pid=1753 代码: #include<stdio.h> #include<string.h> #include<iostream> using namespace std; const int maxn = 500; char a[maxn]; char b[maxn]; int aa1[maxn]; int aa2[maxn]; int bb1[maxn];

noi1_13_48[实数加法]

高精度小数加法……一开始对齐弄了半天,teacher却告诉我可以固定小数点在数组的100号…… uses math;type arr=array[-1..200] of longint;var a,b,c:arr;procedure putin(var a:arr);var k,i:longint; s:string;begin fillchar(a,sizeof(a),0); readln(s); k:=pos('.',s); a[0]:=102-k; a[-1]:=length(s)-k+1

c++ 高精度算法

包括: 两个高精度正整数加法 两个高精度正整数乘法 两个高精度正整数减法 两个高精度正整数除法 两个高精度正整数求余 两个高精度正整数数求最大公约数 两个高精度正整数数求最小公倍数 1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 //清除前缀0,如果结果是空字符串则设为0 7 inline void clear(string& a){ 8 while(a.length()>0

hdu 1316 How many Fibs?(高精度斐波那契数)

//  大数继续 Problem Description Recall the definition of the Fibonacci numbers: f1 := 1 f2 := 2 fn := fn-1 + fn-2 (n >= 3) Given two numbers a and b, calculate how many Fibonacci numbers are in the range [a, b]. Input The input contains several test cas