算法笔记-----大整数相+------数组---效率

  1 //
  2 // Created by alim on 2017/12/23.
  3 //
  4
  5
  6 #include <stdlib.h>
  7 #include <cstring>
  8 #include <iostream>
  9 using namespace std;
 10
 11 #define M 100
 12
 13 char sa[1000];
 14 char sb[1000];
 15
 16 typedef struct _Node{
 17     int s[M];//数字
 18     int l;//数字长度
 19 }Node,*pNode;
 20
 21
 22 void dzs_add(pNode pa,pNode pb,pNode result){
 23     int i, cc;
 24     pNode temp;
 25
 26     if (pa->l < pb->l) {
 27         temp = pb;
 28         pb = pa;
 29         pa = temp;
 30     }
 31
 32     for (int j = 0; j < pa->l; ++j) {
 33         result->s[j] = pa->s[j];
 34     }
 35     result->l = pa->l;
 36
 37     cc = 0;
 38     for (i = 0; i < pb->l; ++i) {
 39         result->s[i] = (pa->s[i] + pb->s[i] + cc) % 10;
 40         cc = (pa->s[i] + pb->s[i]) / 10;
 41     }
 42     if (cc != 0) {
 43         result->s[i] = result->s[i]+cc;
 44     }
 45     if (i >= result->l) {
 46         result->l = i+1;
 47     }
 48
 49     return;
 50 }
 51
 52 void dzs_jian(pNode pa,pNode pb,pNode result){
 53     int i, cc;
 54     pNode temp;
 55
 56     if (pa->l < pb->l) {
 57         temp = pb;
 58         pb = pa;
 59         pa = temp;
 60     }
 61     for (int j = 0; j < pa->l; ++j) {
 62         result->s[j] = pa->s[j];
 63     }
 64     result->l = pa->l;
 65     cc = 0;
 66     for (i = 0; i < pb->l; ++i) {
 67         if (pa->s[i] >= pb->s[i]) {
 68             result->s[i] = pa->s[i] - pb->s[i];
 69         } else {
 70             result->s[i + 1] -= 1;
 71             result->s[i] = pa->s[i] + 10 - pb->s[i];
 72         }
 73     }
 74     if (i >= result->l) {
 75         result->l = i+1;
 76     }
 77 }
 78 int main() {
 79     Node ans,a,b;
 80     cout << "请输入大整数 a:"<<endl;
 81     cin >> sa;
 82     cout << "请输入大整数 b:" << endl;
 83     cin >> sb;
 84     a.l = strlen(sa);//以字符串进行处理,计算长度
 85     b.l = strlen(sb);
 86
 87     //倒向存储
 88     int z=0,i;
 89     for (int i = a.l-1; i >= 0; i--) {
 90         a.s[z++] = sa[i]-‘0‘;
 91     }
 92
 93     z=0;
 94     for (int i = b.l-1; i >= 0; i--) {
 95         b.s[z++] = sb[i] - ‘0‘;
 96     }
 97 //    dzs_add(&a, &b, &ans);
 98     dzs_jian(&a, &b, &ans);
 99     cout << "最终结果为:\n";
100     for (i = ans.l-1; i >= 0; i--) {
101         cout<<ans.s[i];
102     }
103
104     cout << endl;
105     return 0;
106 }
时间: 2024-10-13 16:03:07

算法笔记-----大整数相+------数组---效率的相关文章

大整数算法[01] 大整数的表示和相关定义

★ 相关的数据类型定义 在干正事之前,先定义好各种数据类型还是很有必要的,避免在以后的编码中引起混乱. uintX   X位无符号整形,如uint32表示32位无符号整形 intX    X位有符号整形,如int32表示32位有符号整形 基本数据类型定义: #ifdef _MSC_VER            typedef __int8              int8;            typedef __int16             int16;            typ

算法学习——大整数运算(高精度)C++

1.大整数加法 用数组来存储大整数的每一位,然后模拟人工运算,用for循环按位运算和处理,原理十分简单,直接上模板. #include<iostream> #include<vector> using namespace std; //大整数加法 vector<int> add(vector<int>& A,vector<int>& B){ vector<int> C; int t = 0; for(int i = 0

算法___大整数运算

1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 #include <string> 5 #include <stdlib.h> 6 #include <algorithm> 7 using namespace std; 8 string MULTIPLY_INT(string str1 , string str2); 9 string MINUS_I

【算法】大整数加法

思路: 思路比较简单,将大数据的每位进行加法,记录进位即可.需要注意的是,两个数据中较长的一个需要另外单独处理多出的部分,在程序最后还要加上最高位的进位. 代码: function sum(a,b){ var strA= a.toString(), strB= b.toString(); var arrA=strA.split("").reverse(), arrB=strB.split("").reverse(); var aLen=arrA.length, bL

大整数的加减乘除

多项式的加减乘除能够利用多项式的加减乘除进行运算,所以下面程序採用了多项式的加减乘除.多项式运算已经在<算法导论>第30章有简要的介绍,详细的请參考数学书. 大整数加法:(利用书上公式轻松得出) //多项式加法-大数加法 #include <iostream> #include <time.h> using namespace std; #define m1 4 #define m2 5 //a[0]=x^0 a[1]=x^1....a[n]=x^n的关于x的多项式系数

整数平方根:整数开方及大整数开方解决方法

求整数N的开方,精度在0.001 二分法 若N大于1,则从[1, N]开始,low = 1, high = N, mid = low + (high - low) >> 1开始进行数值逼近 若N小于1,则从[N, 1]开始,low = 0, high = N, mid = low + (high - low) >> 1开始进行数值逼近 #include <stdio.h> #include <stdlib.h> #include <math.h>

SOJ 1002/1003/1004 大整数相加/相乘/相除

三个题目分别考察大整数相加相乘相除运算.如果按照传统算法是取一个长数组,之后进行模拟或者FFT来进行运算.但是相对繁琐. 后来昨天的青岛区域赛网赛1001,用到了JAVA的BigDecimal,于是反过来想到了这几个题目.用JAVA写了以后果然很简单. 1002:大数相加: AC代码: import java.util.*; import java.math.*; public class Main { public static void main(String[] args) { // TO

题目:大整数乘法、除法,楼梯走法,数组中不同数字,超过一半数字(好)

大整数乘法,可以用单个数字想乘,跟踪进位信息来处理. 大整数除法,可以先把除数增大到跟被除数相同的量级,然后累计相减.比如 555 / 3,就先把3增大到300,555能够减1次,那么结果+100,被除数变成255,依次进行. 楼梯走法:一次走一级,或者走两级.没什么难度. 数组中不同数字:如果是2n+1数组找出不同的那个数字,用异或就可以. 如果是找出超出一般数目的数字,用遍历,看到不一样的,就一起删除,这样的方式. 上网搜了一下,找出了更好的方法: 用变量记录备选数字,一个计数器记录该数字剩

基于Java的大整数运算的实现(加法,减法,乘法)学习笔记

大整数,顾名思义就是特别大的整数. 一台64位的机器最大能表示的数字是2的64次方减一: 18446744073709551615 java语言中所能表示的整数(int)最小为-2147483648 public class test { public static void main(String[] args) { System.out.println(Integer.MIN_VALUE); } } 最大为 2147483647 public class test { public stat