1503:Integer Inquiry

总时间限制: 
1000ms

内存限制: 
65536kB
描述
One of the first users of BIT's new supercomputer was Chip Diller. He extended his exploration of powers of 3 to go from 0 to 333 and he explored taking various sums of those numbers. 
``This supercomputer is great,'' remarked Chip. ``I only wish Timothy were here to see these results.'' (Chip moved to a new apartment, once one became available on the third floor of the Lemon Sky apartments on Third Street.) 
输入
The input will consist of at most 100 lines of text, each of which contains a single VeryLongInteger. Each VeryLongInteger will be 100 or fewer characters in length, and will only contain digits (no VeryLongInteger will be negative).

The final input line will contain a single zero on a line by itself. 

输出
Your program should output the sum of the VeryLongIntegers given in the input.
样例输入
123456789012345678901234567890
123456789012345678901234567890
123456789012345678901234567890
0
样例输出
370370367037037036703703703670
  • 先说说为啥要用算法实现大数加法:

    我们来看看数据:

    bool型为布尔型,占1个字节,取值0或1。

    BOOL型为int型,一般认为占4个字节,取值TRUE/FALSE/ERROR。

    sbyte型为有符号8位整数,占1个字节,取值范围在128~127之间。

    bytet型为无符号16位整数,占2个字节,取值范围在0~255之间。

    short型为有符号16位整数,占2个字节,取值范围在-32,768~32,767之间。

    ushort型为无符号16位整数,占2个字节,取值范围在0~65,535之间。

    int型为有符号32位整数,占4个字节,取值范围在-2,147,483,648~2,147,483,647之间。

    uint型为无符号32位整数,占4个字节,取值范围在0~4,294,967,295之间。

    long型为64位有符号整数,占8个字节,取值范围在9,223,372,036,854,775,808~9,223,372,036,854,775,807之间。

    ulong型为64位无符号整数,占8个字节,取值范围在0~18,446,744,073,709,551,615之间。

    float型为32位单精度实数,占4个字节,取值范围3.4E+10的负38次方~3.4E+10的38次方之间。

    double型为64位实数,占8个字节,取值范围1.7E+10的负308次方~1.7E+10的正308次方。

 int num1[MAX],num2[MAX];
void Add(char a[],char b[]){
int i,j,len1,len2,max;
memset(num1,,sizeof(num1));
memset(num2,,sizeof(num2));
len1 = strlen(a);
len2 = strlen(b);
//获得最长数组的长度
//两数相加最多不会超过最大数的位数+1,减少循环次数
max = len1 > len2 ? len1 : len2;
//将两字符串数组转换为数字数组
for(i = len1 - ,j = ;i >= ;i--){
num1[j++] = a[i] - '';
}
for(i = len2 - ,j = ;i >= ;i--){
num2[j++] = b[i] - '';
}
//模拟进位运算
for(i = ;i <= max;i++){
num1[i] += num2[i];
if(num1[i] > ){
num1[i] -= ;
num1[i + ] ++;
}
}
//输出
int ac = ;
for(i = max;i >= ;i--){//输出排除0
if(num1[i] != )
ac = ;
if(ac){
printf("%d",num1[i]);
}
}
}
  • 感觉学会了,于是乎,就找了题,继续练练手,就是POJ-1503.
  • 然后就陷入了深坑中,首先就是那个输入,竟然一直想要用二维数组,真是。。。只能怪练得还太少。
  • 解题过程中,脑中想的方法过于复杂,那肯定就是错误的,一定要跳出这个思维,想别的思路解决。
 //POJ-1503-1
#include <cstdio>
#include <cstring>
const int MAXN = ;
int main()
{
char s[MAXN];
int i, j;
int m;
scanf("%d",&m);
while(m--){
int sum[MAXN] = {};
while(gets(s))
{
int len = strlen(s);
if(s[] == '' && len == )
break;
//sum[]保存所有组的各位的和
for(i = , j = len-; j >= ; i--, j--)
{
sum[i] += s[j]-'';
}
}
//将sum[]每个元素,进行进位
for(i = ; i > ; i--)
{
sum[i-] += sum[i] / ;
sum[i] %= ;
}
//排除和为0的情况
for(i = ; sum[i] == && i < ; i++)
{
if(i == )//意味着全为零
{
printf("0\n");
}
}
for( ; i < ; i++)
{
printf("%d",sum[i]);
}
printf("\n\n");
}
return ;
}

A+B Problem II

时间限制:3000 ms  |  内存限制:65535 KB
难度:3
 
描述

I have a very simple problem for you. Given two integers A and B, your job is to calculate the Sum of A + B.

A,B must be positive.

 
输入
The first line of the input contains an integer T(1<=T<=20) which means the number of test cases. Then T lines follow, each line consists of two positive integers, A and B. Notice that the integers are very large, that means you should not process them by using 32-bit integer. You may assume the length of each integer will not exceed 1000.
输出
For each test case, 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 int the equation.
样例输入
2
1 2
112233445566778899 998877665544332211
样例输出
Case 1:
1 + 2 = 3
Case 2:
112233445566778899 + 998877665544332211 = 1111111111111111110
 //NYOJ-103
#include<cstdio>
#include<cstring>
const int MAX = ;
char str1[MAX],str2[MAX];
int num1[MAX],num2[MAX];
void Add(char a[],char b[]){
int i,j,len1,len2,max;
memset(num1,,sizeof(num1));
memset(num2,,sizeof(num2));
len1 = strlen(a);
len2 = strlen(b);
//获得最长数组的长度
//两数相加最多不会超过最大数的位数+1,减少循环次数
max = len1 > len2 ? len1 : len2;
//将两字符串数组转换为数字数组
for(i = len1 - ,j = ;i >= ;i--){
num1[j++] = a[i] - '';
}
for(i = len2 - ,j = ;i >= ;i--){
num2[j++] = b[i] - '';
}
//模拟进位运算
for(i = ;i <= max;i++){
num1[i] += num2[i];
if(num1[i] > ){
num1[i] -= ;
num1[i + ] ++;
}
}
//输出
int ac = ;
for(i = max;i >= ;i--){//输出排除0
if(num1[i] != )
ac = ;
if(ac){
printf("%d",num1[i]);
}
}
}
int main(){
int n,i = ;
scanf("%d",&n);
while(n--){
scanf("%s %s",str1,str2);
printf("Case %d:\n%s + %s = ",i,str1,str2);
if(str1[] == '' && str2[] == ''){
printf("0\n");
}else{
Add(str1,str2);
printf("\n");
}
i++;
}
return ;
}
  • 减法、乘法、除法明天继续

【大数加法】POJ-1503、NYOJ-103的更多相关文章

  1. 51nod 1005 大数加法

    #include<iostream> #include<string> using namespace std; #define MAXN 10001 },b[MAXN]={} ...

  2. c#大数加法

    在C#中,我们经常需要表示整数.但是,c#的基本数据类型中,最大的long也只能表示-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807之间的数 ...

  3. 玲珑杯1007-A 八进制大数加法(实现逻辑陷阱与题目套路)

    题目连接:http://www.ifrog.cc/acm/problem/1056 DESCRIPTION Two octal number integers a, b are given, and ...

  4. Leetcode 67 Add Binary 大数加法+字符串处理

    题意:两个二进制数相加,大数加法的变形 大数加法流程: 1.倒置两个大数,这一步能使所有大数对齐 2.逐位相加,同时进位 3.倒置两个大数的和作为输出 class Solution { public: ...

  5. nyoj 103 A + B problem II

    点击打开链接 A+B Problem II 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 I have a very simple problem for you. G ...

  6. HDU1002大数加法

    大数加法 c++版: #include <map> #include <set> #include <stack> #include <queue> # ...

  7. java实现大数加法、乘法(BigDecimal)

    之前写过用vector.string实现大数加法,现在用java的BigDecimal类,代码简单很多.但是在online-judge上,java的代码运行时间和内存大得多. java大数加法:求a+ ...

  8. vector、string实现大数加法乘法

    理解 vector 是一个容器,是一个数据集,里边装了很多个元素.与数组最大的不同是 vector 可以动态增长. 用 vector 实现大数运算的关键是,以 string 的方式读入一个大数,然后将 ...

  9. A + B Problem II 大数加法

    题目描述: Input The first line of the input contains an integer T(1<=T<=20) which means the number ...

随机推荐

  1. Unity3D开发之“获取IOS设备所在的国家代码"

    原地址:http://dong2008hong.blog.163.com/blog/static/469688272014021025578/ 在前一段时间游戏开发中需要实现获取IOS设备所在的国家代 ...

  2. Android串口通信(基于Tiny6410平台)

    友善之臂的Android系统有他们自己编写的一个串口通信程序,网上没有找到他的源代码,而且界面操作不在一个界面,不是很方便,这里我自己写了一个粗糙点的串口通信程序. 同样这里还是调用友善之臂的frie ...

  3. HTTP/2 对 Web 性能的影响(上)

    一.前言 HTTP/2 于 2015 年 5 月正式推出.自诞生以来,它就一直在影响着网络性能最佳实践.在本篇文章中,我们将讨论 HTTP/2 的二进制帧.延迟削减.潜在利弊以及相应的应对措施. 超文 ...

  4. Jenkins使用

    1. Jenkins工作流程: ①配置代码源,从代码源(如svn.git等)拉取代码,放入工作区 ②构建触发器(引发构建的条件,比如一定周期.代码提交更改等),从而能自动的进行构建 ③构建,选择构建的 ...

  5. **PHP随机数算法

    <?php $tmp = range(1,30);print_r(array_rand($tmp,10));?> 输出: Array( [0] => 6 [1] => 8 [2 ...

  6. hdu 4418 Time travel 概率DP

    高斯消元求期望!! 将n时间点构成2*(n-1)的环,每一点的期望值为dp[i]=dp[i+1]*p1+dp[i+2]*p2+……+dp[i+m]*pm+1. 这样就可以多个方程,利用高斯消元求解. ...

  7. lintcode 中等题:partition array 数组划分

    题目 数组划分 给出一个整数数组nums和一个整数k.划分数组(即移动数组nums中的元素),使得: 所有小于k的元素移到左边 所有大于等于k的元素移到右边 返回数组划分的位置,即数组中第一个位置i, ...

  8. Lambda 表达式型的排序法

    int[] arry = {3,9,5,7,64,51,35,94 }; foreach (int i in arry.OrderBy(i => i)) Console.WriteLine(i) ...

  9. 在PowerDesigner中设计概念模型

    原文:在PowerDesigner中设计概念模型 在概念模型中主要有以下几个操作和设置的对象:实体(Entity).实体属性 (Attribute).实体标识(Identifiers).关系(Rela ...

  10. Django admin site(三)InlineModelAdmin

    InlineModelAdmin class InlineModelAdminclass TabularInlineclass StackedInline 举例,有两个Model: from djan ...