A + B ProblemII

Time Limit: 2000/1000 MS(Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 317773    Accepted Submission(s):61748

Problem Description

I have a verysimple problem for you. Given two integers A and B, your job is to calculatethe Sum of A + B.

Input

The first line ofthe input contains an integer T(1<=T<=20) which means the number of testcases. Then T lines follow, each line consists of two positive integers, A andB. Notice that the integers are very large, that
means you should not processthem by using 32-bit integer. You may assume the length of each integer willnot exceed 1000.

Output

For each testcase, you should output two lines. The first line is "Case #:", #means the number of the test case. The second line is the an equation "A +B = Sum", Sum means the result of A + B. Note there are some
spaces intthe equation. Output a blank line between two test cases.

Sample Input

2

1 2

112233445566778899998877665544332211

Sample Output

Case 1:

1 + 2 = 3

Case 2:

112233445566778899+ 998877665544332211 = 1111111111111111110

题意简述

首先输入一个数字T(1 <= T <= 20)代表输入的数据组数,其次下边有T行,每行有2个欲求和的数字,并且每个数字不超过1000位。

题意分析

这是一道高精度数字计算的题目,unsigned long long double 是不能满足所需要的数字位数的,所以需要别的方法进行计算。

解题思路

1.  首先用2个字符串接受并储存要输入的2个加数;

2.  去掉前导零

3.  按照ASCII的关系,让字符串的每个字符减去字符0,获得数值并且倒置存储在2个数组中;

4.  模拟加法运算,并储存在另一个数组中;

5.  按要求输出结果;

6.  初始化各个数据

测试数据补充

0001 1000

0 0

000 0000

9999 1

1 9999

99900 00999

00999 99900

当然还有大位数的极端数据,这些能过基本上就不会WA了。

代码总览

#include<stdio.h>
#include<string.h>
#define max(x,y) ( x>y?x:y )
#define n 1010
int main()
{
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
char a1[n]={0};
char b1[n]={0};
int a2[n]={0}, b2[n]={0};
int num ,n1,n2,j,digit,k,i,m1,m2;
scanf("%d", &num);
for(i = 1; i <=num; i++){
//n1 = n2 = j = digit = k = m1 = m2 = 0;
scanf("%s %s",a1,b1);
n1 = strlen(a1);
n2 = strlen(b1);
for(j = 0 ; j < n1; j++){
if(a1[j] != '0'&& a1[j] != NULL){
m1 = j;
break;
}else if(a1[j] == '0' && j == n1-1){
m1 = 0;
n1 = 1;
break;
}
}
for(j = 0 ; j < n2; j++){
if(b1[j] != '0' && b1[j] != NULL){
m2 = j;
break;
}else if(b1[j] == '0' && j == n2-1){
m2 = 0;
n2 = 1;
break;
}
}
for(j = n1-1,k = 0;j >=m1 ;j--,k++){
a2[k] = a1[j] - '0';
} for(j = n2-1,k = 0;j >=m2 ;j--,k++){
b2[k] = b1[j] - '0';
}
digit = max(n1-m1,n2-m2);
int c2[n] = {0};
for(j = 0; j < digit ; j++){
c2[j] = a2[j] + b2[j] + c2[j];
c2[j+1] = c2[j] / 10;
c2[j] = c2[j] % 10;
}
if(c2[digit] == 0) digit--;
printf("Case %d:\n",i);
for(j = m1; j<n1;j++){
printf("%c",a1[j]);
}
printf(" + ");
for(j = m2; j<n2;j++){
printf("%c",b1[j]);
}
printf(" = ");
for(j = digit; j>= 0; j--) printf("%d",c2[j]);
if(i != num) {
printf("\n\n");
}else{
printf("\n");
}
for(j = 0; j<=digit; j++){
a2[j] = b2[j] = 0;
}
}
//fclose(stdin);
//fclose(stdout);
return 0;
}

重难点详解

1.  前导零的去除

for(j = 0 ; j< n1; j++){

if(a1[j]!= '0'&& a1[j] != NULL){

m1 =j;

break;

}elseif(a1[j] == '0' && j == n1-1){

m1 =0;

n1 =1;

break;

}

}

因为下一步要进行倒置处理,所以不妨从字符串的第一个字符开始遍历,遇到‘0’跳过,并使变量指向下一个字符,直到遍历到第一个不为零的字符,或者是遍历完整个字符串(说明全都是‘0’)。

如字符串0302,遍历到第一个字符‘0’m1 为0,第二个字符不为0,所以m1为1,那么倒置字符串从第1位也就是3开始,这样就过滤了前导零。

当然还有极端情况,就是0000…都为0的情况,这样当遍历完整个字符串后发现都是0,那么就规定m1为0,n1为1,进行下面的操作。

2.  倒置

for(j = n1-1,k = 0;j >=m1 ;j--,k++){

a2[k] =a1[j] - '0';

}

很简单,字符减去字符0储存在一个新的数组中,不过注意下标的关系。我这里是从字符串的最后一位开始取储存在数组的第一位中。

3.  模拟加法运算

digit =max(n1-m1,n2-m2);

int c2[n] = {0};

for(j = 0; j < digit ; j++){

c2[j] = a2[j] + b2[j] + c2[j];

c2[j+1] = c2[j] / 10;

c2[j] = c2[j] % 10;

}

Digit变量是两个数组中位数较大的一个,因为要进行足够次数的加法算。新令一个数组来储存同一位的数字之和。并让下一位等于本位除以10(模拟进位),本位取10的余数。

HDU 1002 (高精度加法运算)的更多相关文章

  1. 使用C++的string实现高精度加法运算

    对于超大数字的运算,用long long int仍然不能解决,这时候就需要考虑通过模拟运算和数组存储来实现高精度运算. 本文讨论借助C++的string来实现高精度的运算. 首先输入的量直接存储为st ...

  2. 抓起根本(二)(hdu 4554 叛逆的小明 hdu 1002 A + B Problem II,数字的转化(反转),大数的加法......)

    数字的反转: 就是将数字倒着存下来而已.(*^__^*) 嘻嘻…… 大致思路:将数字一位一位取出来,存在一个数组里面,然后再将其变成数字,输出. 详见代码. while (a) //将每位数字取出来, ...

  3. hdu 1002 A + B Problem II【大数加法】

    题目链接>>>>>> 题目大意:手动模拟大数加法,从而进行两个大数的加法运算 #include <stdio.h> #include <strin ...

  4. hdu 1002 A+B

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1002 复习一下大数 模板: #include <stdio.h> #include <s ...

  5. java算法 蓝桥杯 高精度加法

    问题描述 在C/C++语言中,整型所能表示的范围一般为-231到231(大约21亿),即使long long型,一般也只能表示到-263到263.要想计算更加规模的数,就要用软件来扩展了,比如用数组或 ...

  6. 用c++实现高精度加法

    c++实习高精度加法 最近遇到一个c++实现高精度加法的问题,高精度问题往往十复杂但发现其中的规律后发现并没有那么复杂,这里我实现了一个整数的高精度加法,主要需要注意以下几点: 1:将所需输入的数据以 ...

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

    POJ 3181 Dollar Dayz(全然背包+简单高精度加法) id=3181">http://poj.org/problem?id=3181 题意: 给你K种硬币,每种硬币各自 ...

  8. 【模板】C++高精度加法

    所谓高精度加法就是对两个和可能会超过long long数据范围的数进行加法运算.这种情况下,显然不能使用常规的方法进行运算. 那么,不妨考虑一下人在纸上是如何进行加法运算的.当人进行加法运算时,通常会 ...

  9. 【t079】火星上的加法运算

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 最近欢欢看到一本有关火星的书籍,其中她被一个加法运算所困惑,由于她的运算水平有限,想向你求助,作为一名 ...

随机推荐

  1. C++11 TypeList 妙用

    源码展示: #include <iostream> using namespace std; template <typename ... Args> struct typel ...

  2. 完整的正则表达式知识汇总(Python知识不断更新)

    ## 大纲: ## 一.正则概述 1.正则是什么 正则就是一套规则,或者语法 2.正则的作用 让我们判断是否符合我们的的规则,或者根据规则找到符合规则的数据 3.使用场景 可以用正则判断我们输入的邮箱 ...

  3. C do whlie 数数位

    #include <stdio.h> int main(int argc, char **argv) {    //定义两个变量 x 跟 n,n的初始化为0:  int x;  int n ...

  4. 爬虫1.5-ajax数据爬取

    目录 爬虫-ajax数据爬取 1. ajax数据 2. selenium+chromedriver知识准备 3. selenium+chromedriver实战拉勾网爬虫代码 爬虫-ajax数据爬取 ...

  5. 孤荷凌寒自学python第八十三天初次接触ocr配置tesseract环境

    孤荷凌寒自学python第八十三天初次接触ocr配置tesseract环境 (完整学习过程屏幕记录视频地址在文末) 学习Python我肯定不会错过图片文字的识别,当然更重要的是简单的验证码识别了,今天 ...

  6. Android开发-API指南-<permission>

    <permission> 英文原文:http://developer.android.com/guide/topics/manifest/permission-element.html 采 ...

  7. Linux的基础预备知识

       Linux下一切皆文件 1.root@mk-virtual-machine:/home/mk#   root:该位置表示当前终端登录的用户名 mk-virtual-machine:/home/m ...

  8. [精通Python自然语言处理] Ch1 - 将句子切分为单词

    实验对比了一下三种切分方式: 1,2 : nltk.word_tokenize :  分离缩略词,(“Don't” =>'Do', "n't") 表句子切分的“,” &quo ...

  9. LeetCode 120——三角形最小路径和

    1. 题目 2. 解答 详细解答方案可参考北京大学 MOOC 程序设计与算法(二)算法基础之动态规划部分. 从三角形倒数第二行开始,某一位置只能从左下方或者右下方移动而来,因此,我们只需要求出这两者的 ...

  10. 由一个hash字符串生成多个子hash字符串

    通过存储一个head hash,然后把子hash放到网络中 当然,也可以像默克尔树那样的,生成多级的子hash ,可以通过规则配置不同的hash 生成方式.倒置的默克尔树 我有一个文件,然后我把她分隔 ...