华为机试题:超长正整数相加

描述:  
题目描述:请设计一个算法完成两个超长正整数的加法。  
要求实现函数: 
void AddLongInteger(char * pcAddend, char * pcAugend, char * pcAddResult); 
输入参数: 
char * pcAddend:加数 
char * pcAugend:被加数 
char * pcAddResult:加法结果 
返回值:无 
运行时间限制: 1 Sec 
内存限制: 128 MByte 
输入:  
两个超长正整数的字符串 
输出:  
相加后结果的字符串 
样例输入: 
123456789123456789 123456789123456789 
样例输出: 
246913578246913578

测试不通过,发出来看看问题在哪里。

//
//  超长正整数相加.cpp
//  temptest
//
//  Created by 彭威 on 15/8/1.
//  Copyright © 2015年 biophy.nju.edu.cn. All rights reserved.
//

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;

class BigNumber {
    string num;
    bool reverse_flg;

public:
    BigNumber(char *str):num(str){}
    BigNumber(){};
    friend istream& operator>>(istream& in,BigNumber& p){
        in>>p.num;
        return in;
    }
    friend ostream& operator<<(ostream& out,const BigNumber& p){
        if (p.reverse_flg) {
            //for (auto iter = p.num.rbegin(); iter != p.num.rend(); iter++) {       //only for c++11
            for (string::const_iterator iter = p.num.end()-1;iter >= p.num.begin();--iter ){
                out<<*iter;
            }
        }else{
            out<<p.num;
        }
        return out;
    }
    friend const BigNumber operator+(const BigNumber& p1,const BigNumber& p2){
        BigNumber p;
        size_t len = max(p1.length(), p2.length());
        char plus=0;
        p.reverse_flg = true;
        for (size_t i =0;  i < len; i++) {
            char x = p1[i] + p2[i] + plus - 2 * ‘0‘;
            plus = x / 10;
            x = x % 10 + ‘0‘;
            p.num.push_back(x);
        }
        if (plus) {
            p.num.push_back(plus+‘0‘);
            plus = 0;
        }
        return p;
    }
    const size_t length() const{
        return num.length();
    }
    const char operator[](size_t n)const {
        if (n >= num.length()) {
            return ‘0‘;
        }
        if (reverse_flg) {
            return num[n];
        }else{
            return num[num.length()-n-1];
        }
    }
};

int main(int argc,const char* argv[]){
    BigNumber a,b;
    cin>>a>>b;
    cout<<a+b<<endl;
    return 0;
}
时间: 2024-10-07 22:45:18

华为机试题:超长正整数相加的相关文章

华为OJ平台——超长正整数相加

题目描述: 请设计一个算法完成两个超长正整数的加法. 输入 输入两个字符串数字 输出 输出相加后的结果,string型 样例输入 99999999999999999999999999999999999999999999999999 1 样例输出 100000000000000000000000000000000000000000000000000 思路: 在Java中,这样的大数运算可以直接用BigInteger类中的方法来进行运算和处理,那样本题没有任何意义了 因此在本方法中,不直接采用该类中

华为測试 超长整数相加

请设计一个算法完毕两个超长正整数的加法. 输入两个字符串数字 输出相加后的结果.string型 例子输入:99999999999999999999999999999999999999999999999999 1 例子输出:100000000000000000000000000000000000000000000000000 #include<iostream> #include<string> using namespace std; string add(string num1,

华为机试题【10】-求数字基root

题目描述: 求整数的Root:给定正整数,求每位数字之和;如果和不是一位数,则重复; 输入:输入任意一个或多个整数 输出:输出各位数字之和,直到和为个位数为止(输入异常,则返回-1),多行,每行对应一个输入数据的结果. 样例输入: 25 865 样例输出: 7 1 思路分析: 首先求个位数相加,经典方法,求余相除 要求各个位数的和是小于10,可以采用递归或者循环 代码: import java.util.Scanner; public class Main { static int[] num

2017华为机试题--水仙花数

等了一个月终于等到华为给安排的实习生在线机试,把自己做的三道题记录了一下,也方便日后复习.这篇是第一题,没有什么特别的难度,经典的水仙花数题. 题目描述:水仙花数是指一个n位数(n≥3),它的每个位上的数字的n次幂之和等于它本身.(例如:13+53+33=153),要求:输出1000范围内所有水仙花数及水仙花数之和. 输入描述:无 输出描述:1000以内所有水仙花数及总和. 输出例子: 第1个水仙花数:xxx 第2个水仙花数:xxx 第3个水仙花数:xxx ... 水仙花数总和为:xxx 1 p

华为机试题【12】-关灯泡

题目描述: 描述: 一条长廊里依次装有n(1 ≤ n ≤ 65535)盏电灯,从头到尾编号1.2.3.-n-1.n.每盏电灯由一个拉线开关控制.开始,电灯全部关着. 有n个学生从长廊穿过.第一个学生把号码凡是1的倍数的电灯的开关拉一下:接着第二个学生把号码凡是2的倍数的电灯的开关拉一下:接着第三个学生把号码凡是3的倍数的电灯的开关拉一下:如此继续下去,最后第n个学生把号码凡是n的倍数的电灯的开关拉一下.n个学生按此规定走完后,长廊里电灯有几盏亮着. 注:电灯数和学生数一致. 运行时间限制: 无限

华为机试题3

[编程题] 明明的随机数 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数 字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号.然后再把这些数从小到大排序,按照排好的顺序去找同学做调查.请你协助明明完成 “去重”与“排序”的工作. Input Param n               输入随机数的个数 inputArray      n个随机整数组成的数组 Return Value

华为机试题【1】

题目描述: 老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问.当然,老师有时候需要更新某位同学的成绩. 输入描述: 输入包括多组测试数据. 每组输入第一行是两个正整数N和M(0 < N <= 30000,0 < M < 5000),分别代表学生的数目和操作的数目. 学生ID编号从1编到N. 第二行包含N个整数,代表这N个学生的初始成绩,其中第i个数代表ID为i的学生的成绩 接下来又M行,每一行有一个字符C(只取'Q'或'U'),和两个正整数A,B,当C为'Q'

华为机试题 火车进站

描述:给定一个正整数N代表火车数量,0<N<10,接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1-9编号.要求以字典序排序输出火车出站的序列 输入: 有多组测试用例,每一组第一行输入一个正整数N(0<N<10),第二行包括N个正整数,范围为1到9. 输出: 输出以字典序排序的火车出站序列号,每个编号以空格隔开,每个输出序列换行,具体见sample. 样例输入: 3 1 2 3 样例输出: 1 2 3 1 3 2 2 1 3 2 3 1 3 2 1 思路:先对输入序列进行字

华为机试题【11】-报数删除人

题目描述: 有n个人围成一圈,顺序排号.从第一个人开始报数(从1到3报数),凡报到3的人退出,问最后留下的那位是原来第几号. 思路分析: 首先是选好数据结构,轻量级的boolean数组,下边代表序号,全部初始化位true 退出变为false,设置全局变量int a,遍历数组,a++(当对应为false时候,continue跳过) 遍历数组统计true的数量,为1时候退出 注意: 如果要用List来存储,注意遍历remove删除时候,要一致,不能list和iterator混用 代码: import