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. Bootstrap基础篇—常见的CSS类

    一.标题 标签 大小 h1 36px h2 30px h3 24px h4 18px h5 14px h6 12px 二.常见的内联样式 标签 用途 del 删除的文本 s 无用的文本 ins 插入的 ...

  2. php单例模式和工厂模式

    单例模式:防止重复实例化,避免大量的new操作,减少消耗系统和内存的资源,使得有且仅有一个实例对象 header("Content-type: text/html; charset=utf- ...

  3. 【wx:for】小程序列表渲染的使用说明

    wx:for 控制属性绑定一个数组,即可使用数组中各项的数据重复渲染该组件. 默认数组的当前项的下标变量名默认为 index,数组当前项的变量名默认为 item,即: {{index}} . {{it ...

  4. 解析Java中final关键字的各种用法

    首先,我们可以从字面上理解一下final这个英文单词的中文含义:“最后的,最终的; 决定性的; 不可更改的:”.显然,final关键词如果用中文来解释,“不可更改的”更为合适.当你在编写程序,可能会遇 ...

  5. 【Paper】Deep & Cross Network for Ad Click Predictions

    目录 背景 相关工作 主要贡献 核心思想 Embedding和Stacking层 交叉网络(Cross Network) 深度网络(Deep Network) 组合层(Combination Laye ...

  6. JavaScript筑基篇(二)->JavaScript数据类型

    说明 介绍JavaScript数据类型 目录 前言 参考来源 前置技术要求 JavaScript的6种数据类型 哪6种数据类型 undefined 类型 null 类型 boolean 类型 numb ...

  7. php+原生ajax实现图片文件上传功能实例

    html+js 代码 <!DOCTYPE html> <html> <head> <title>Html5 Ajax 上传文件</title> ...

  8. 图的遍历——BFS(队列实现)

    #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> ...

  9. python学习笔记03:python的核心数据类型

    从根本上讲,Python是一种面向对象的语言.它的类模块支持多态,操作符重载和多重继承等高级概念,并且以Python特有的简洁的语法和类型,OOP十分易于使用.Python的语法简单,容易上手. Py ...

  10. iOS- 优化与封装 APP音效的播放

    1.关于音效 音效又称短音频,是一个声音文件,在应用程序中起到点缀效果,用于提升应用程序的整体用户体验.   我们手机里常见的APP几乎都少不了音效的点缀.   显示实现音效并不复杂,但对我们App很 ...