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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/fxdaniel/article/details/47176641

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

我的答案(Java):

import java.util.Scanner;

public class Main{

    private String a;//
    private String b;
    /**
     * 输入
     */
    public void input(){
        Scanner sc=new Scanner(System.in);
        try {
            a=sc.next();// 加数
            b=sc.next();// 被加数
        } catch (Exception e) {
            a=null;
            b=null;
        }finally{
            sc.close();
        }
    }
    public String AddLongInteger(String a,String b){
        String result="0";
        int carry=0;
        int len1=a.length();
        int len2=b.length();
        int len=Math.max(len1, len2);
        for(int i=0;i<len;i++){
            try{
                // 加数取一位
                int num1=0;
                int idx1=len1-i-1;
                if(idx1>-1){
                    num1=Integer.parseInt(a.substring(idx1, idx1+1));
                    if(num1==0)
                        return null;
                }

                // 被加数取一位
                int num2=0;
                int idx2=len2-i-1;
                if(idx2>-1){
                    num2=Integer.parseInt(b.substring(idx2, idx2+1));
                    if(num2==0)
                        return null;
                }

                // 判断结果中是否包含进位
                int idx3=0;
                if(carry>0){
                    idx3=1;
                }
//              System.out.println("num1="+num1+" num2="+num2+" result="+result);
                int tempResult=num1+num2+carry;

                carry = tempResult >= 10 ? 1 : 0;// 新的进位

                if(result.equals("0"))
                    result=tempResult+"";
                else{
                    result=tempResult+result.substring(idx3, result.length());
                }
            }catch(Exception e){
//              e.printStackTrace();
                return null;
            }
        }
        return result;
    }
    public static void main(String[] args){
        Main m=new Main();
        m.input();
        if(m.a==null||m.b==null){
            return;
        }
        String result=m.AddLongInteger(m.a, m.b);
        if(result!=null){
            System.out.println(result);
        }
    }
}

test1测试没有通过,我还没发现问题在哪儿,请高手指点。

展开阅读全文

超长正整数减法,错在哪里???

08-13

哪一步没有考虑到,或者有什么更好的算法???rn望高人指点~~~~rnrnrn/*rn【问题描述】rn编写程序实现两个超长正整数(每个最长80位数字)的减法运算。rn rn【输入形式】rn从键盘读入两个整数,要考虑输入高位可能为0的情况(如00083)。rn1. 第一行是超长正整数A;rn2. 第二行是超长正整数B;rn rn【输出形式】 rn输出只有一行,是长整数A减去长整数B的运算结果,从高到低依次输出各位数字。rn要求:若结果为0,则只输出一个0;否则输出的结果的最高位不能为0,并且各位数字紧密输出。rn 【输入样例】rn rn234098rn134098703578230056rn rn【输出样例】rn -134098703577995958rn【样例说明】rn进行两个正整数减法运算, 234098 -134098703578230056 = -134098703577995958。rn*/rn#include rn#include rnvoid cancel (char s[]);rnvoid reverse (char s[]);rnrnint main()rnrn char a[100]='\0',b[100]='\0',temp[100]='\0';rn int len_a,len_b;rn int i;rn gets(a);rn gets(b);rnrn //去掉数组前面的0rn cancel (a);rn cancel (b);rnrn len_a=strlen(a);rn len_b=strlen(b);rnrn //使前一个数大于后一个数,并输出负号rn if (len_a=b[i])rn if (b[i]==0)rn a[i]=a[i];rn elsern a[i]=a[i]-b[i]+'0';rn rn elsern a[i]=a[i]+10-b[i]+'0';rn a[i+1]=a[i+1]-'1';//▲▲▲这一步好像不太对???▲▲▲rn rn reverse (a);rn cancel (a);rnrn printf ("%s\n",a);rn return 0;rnrnrn//删除数组前面的0rnvoid cancel (char s[])rn int len_s,i,j;rn len_s=strlen(s);rn for (i=0;i 论坛

没有更多推荐了,返回首页