C语言 · 高精度加法

问题描述

  输入两个整数ab,输出这两个整数的和。ab都不超过100位。

算法描述

  由于ab都比较大,所以不能直接使用语言中的标准数据类型来存储。对于这种问题,一般使用数组来处理。
  定义一个数组AA[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。

输出格式

  输出一行,表示b的值。

样例输入

20100122201001221234567890
2010012220100122

样例输出

20100122203011233454668012

 1 /*
 2 分析:
 3
 4 1.可能两个数的长度不同,那么就需要在一个数加完之后把另一个数的剩下的数全加上。
 5
 6 2.判断最高位,如果最高位有进位,那么还需要把进位位加上。
 7 */
 8 #include<stdio.h>
 9 #include<string.h>
10 int main()
11 {
12     char a[200],b[200];//定义字符串数组
13     int c[500];
14     scanf("%s%s",a,b);//输入字符串数组
15     int i,j,k=0,r=0;
16     int lena,lenb;
17     lena = strlen(a);
18     lenb = strlen(b);
19     for(i=lena-1,j=lenb-1;i>=0&&j>=0;i--,j--){
20         int p=(a[i]-‘0‘)+(b[j]-‘0‘)+r;
21         r=p/10;//进位
22         c[k++]=p%10;//余数加到数组中
23     }
24     while(i>=0){   //如果b中的数加完了
25         int p=(a[i]-‘0‘)+r;
26         r=p/10;
27         c[k++]=p%10;
28         i--;
29     }
30     while(j>=0){    //如果a中的数加完了
31         int p=(b[j]-‘0‘)+r;
32         r=p/10;
33         c[k++]=p%10;
34         j--;
35     }
36     if(r){//判断最高位有没有进位
37         c[k++]=r;
38     }
39     for(int i=k-1;i>=0;i--){//输出结果
40         printf("%d",c[i]);
41     }
42     return 0;
43 } 
时间: 2024-10-30 20:48:26

C语言 · 高精度加法的相关文章

C语言(7)--高精度加法、减法、乘法、今天是星期几、四位平方数、候选人选票问题

1.高精度加法.减法.乘法 #include <stdio.h> #include <string.h> #include <malloc.h> void plus(char *a,char *b,char *c);//自定义高精度加法函数 void sub(char *a,char *b,char *c);//自定义高精度减法函数 void multiply(char *a,char *b,char *c);//自定义高精度乘法函数 int main() { char

[BASIC-29] 高精度加法

基础练习 高精度加法 时间限制:1.0s   内存限制:512.0MB 问题描述 输入两个整数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]

问题 B: 【高精度】简单高精度加法

问题 B: [高精度]简单高精度加法 时间限制: 1 Sec  内存限制: 64 MB提交: 94  解决: 27[提交][状态][讨论版] 题目描述 修罗王解决了计算机的内存限制问题,终于可以使用电脑进行大型的魔法运算了,他交给邪狼的第一个任务是计算两个非负整数A.B的和,其中A和B的位数在5000位以内. 输入 共两行数据,第一行为一个非负整数A,第二行为一个非负整数B,A.B的位数均在5000以内. 输出 输出一个非负数,即两数之和. 样例输入 1111111111 2222222222

中石油-【高精度】简单高精度加法

问题 B: [高精度]简单高精度加法 时间限制: 1 Sec  内存限制: 64 MB提交: 63  解决: 20[提交][状态][讨论版] 题目描述 修罗王解决了计算机的内存限制问题,终于可以使用电脑进行大型的魔法运算了,他交给邪狼的第一个任务是计算两个非负整数A.B的和,其中A和B的位数在5000位以内. 输入 共两行数据,第一行为一个非负整数A,第二行为一个非负整数B,A.B的位数均在5000以内. 输出 输出一个非负数,即两数之和. 样例输入 1111111111 2222222222

leetcode 66. Plus One(高精度加法)

Given a non-negative number represented as an array of digits, plus one to the number. The digits are stored such that the most significant digit is at the head of the list. 题解:简单的高精度加法,要注意[9]这种输入,要多一位. class Solution { public: vector<int> plusOne(v

【1002】高精度加法,此处应有掌声~(*/ω\*)

木有求助别人然后AC..... 打完了上面这一行我都羞愧(*/ω\*)谁叫我是蒟蒻呢 先上我滴最终代码 1 #include<stdio.h>//高精度加法 2 #include<string.h> 3 4 char ar[1001],br[1001]; 5 int a,b; 6 7 void exchange() 8 { 9 char cr[1001];int c; 10 strcpy(cr,ar); 11 strcpy(ar,br); 12 strcpy(br,cr); 13

A1087. 高精度加法

体验一下,高精度的算法 /* * ===================================================================================== * * Filename: a1087.c * * Description: Rainboy_RT * * Version: 1.0 * Created: 2014-07-04 14:54:08 * Revision: none * Compiler: gcc * * Author: Rain

用c++实现高精度加法

c++实习高精度加法 最近遇到一个c++实现高精度加法的问题,高精度问题往往十复杂但发现其中的规律后发现并没有那么复杂,这里我实现了一个整数的高精度加法,主要需要注意以下几点: 1:将所需输入的数据以字符数组的形式输入,建立字符数组,建立相应的整数数组,然后一一映射,以此来实现数据的输入,需要注意的是,当实现字符向数字映射时,应该减去相应的ASCII偏移值,即48. 2:为了模拟我们在纸上手算的进位模拟运算,我们将字符数组反向填入整数数组,上图的后几行代码实现了这个操作. 3:实现进位加法,这是

POJ 3181 Dollar Dayz(完全背包+简单高精度加法)

POJ 3181 Dollar Dayz(完全背包+简单高精度加法) http://poj.org/problem?id=3181 题意: 给你K种硬币,每种硬币分别是1美元,2美元-K美元且可以无限使用,问你用上面K种硬币构成n美元的话有多少种方法? 分析: 本题是一道明显的完全背包问题, 不过本题还可以换一种方法来看: 整数n由前K个自然数构造, 一共有多少种方法? (虽然本题要用到高精度加法, 但是很简单, 不要被吓到哦) 首先是DP部分: 令dp[i][j]==x 表示由前i种硬币构成j