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. 刚安装的Linux Centos7使用yum安装firefox时提示:cannot find a valid baseurl for repo

    出现这个问题是因为yum在安装包的过程中,虽然已经联网,但是没法解析远程包管理库对应的域名,所以我们只需要在网络配置中添加上DNS对应的ip地址即可. 解决参考链接:https://blog.csdn ...

  2. 初学DirectX(1)

    初学Direct X (1) Direct3D设备用于访问视频卡的帧缓冲区,以及后台缓冲区.由于IDE是vs2013,默认安装了direct 9,只需要在使用头文件(1)并像使用库文件(2)即可 #i ...

  3. 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域

    此篇文章是对上一篇文章(http://www.ifiero.com/index.php/archives/611)的进一步补充,主要说明如何适配Apple的最新三款手机iPhoneXs.iPhoneX ...

  4. 用Python实现一个端口扫描,只需简单几步就好

    一.常见端口扫描的原理 0.秘密扫描 秘密扫描是一种不被审计工具所检测的扫描技术. 它通常用于在通过普通的防火墙或路由器的筛选(filtering)时隐藏自己. 秘密扫描能躲避IDS.防火墙.包过滤器 ...

  5. lr 常用操作

    lr脚本编写语法: web_add_cookie();:服务器注入cookies lr_save_string("网址或其他","参数2");:一个保存函数,它 ...

  6. POJ 1679 The Unique MST(最小生成树)

    Description Given a connected undirected graph, tell if its minimum spanning tree is unique. Definit ...

  7. Python中的from等价于import的语法

    Python中导入module文件有两种方式:import和from.这里并不会列举import和from的具体使用方法,而是比较两者之间的差别. 对于from语句来说,它其实是等价于下面的impor ...

  8. 欢迎来怼--第二十一次Scrum会议

    一.小组信息 队名:欢迎来怼 小组成员 队长:田继平 成员:李圆圆,葛美义,王伟东,姜珊,邵朔,冉华 小组照片 二.开会信息 时间:2017/11/2 17:05~17:15,总计10min. 地点: ...

  9. Java学习个人备忘录之关键字final

    final关键字final可以修饰类,方法,变量.final修饰的类不可以被继承final修饰的方法不可以被覆盖final修饰的变量是一个常量.只能被赋值一次.内部类只能访问被final修饰的局部变量 ...

  10. 软件工程课堂作业(五)——终极版随机产生四则运算题目(C++)

    一.升级要求:让程序能接受用户输入答案,并判定对错.最后给出总共对/错的数量. 二.设计思想: 1.首先输入答案并判断对错.我想到的是定义两个数组,一个存放用户算的结果,另一个存放正确答案.每输出一道 ...