国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

華為機試在線訓練-??途W(27)無線OSS-高精度整數加法

2019-11-08 03:14:06
字體:
來源:轉載
供稿:網友

題目描述

在計算機中,由于處理器位寬限制,只能處理有限精度的十進制整數加減法,比如在32位寬處理器計算機中,參與運算的操作數和結果必須在-231~231-1之間。如果需要進行更大范圍的十進制整數加法,需要使用特殊的方式實現,比如使用字符串保存操作數和結果,采取逐位運算的方式。如下:9876543210 + 1234567890 = ?讓字符串 num1="9876543210",字符串 num2="1234567890",結果保存在字符串 result = "11111111100"。-9876543210 + (-1234567890) = ?讓字符串 num1="-9876543210",字符串 num2="-1234567890",結果保存在字符串 result = "-11111111100"。

 

要求編程實現上述高精度的十進制加法。要求實現方法: public String add (String num1, String num2)【輸入】num1:字符串形式操作數1,如果操作數為負,則num1的前綴為符號位'-'num2:字符串形式操作數2,如果操作數為負,則num2的前綴為符號位'-'【返回】保存加法計算結果字符串,如果結果為負,則字符串的前綴為'-'注:(1)當輸入為正數時,'+'不會出現在輸入字符串中;當輸入為負數時,'-'會出現在輸入字符串中,且一定在輸入字符串最左邊位置;(2)輸入字符串所有位均代表有效數字,即不存在由'0'開始的輸入字符串,比如"0012", "-0012"不會出現;(3)要求輸出字符串所有位均為有效數字,結果為正或0時'+'不出現在輸出字符串,結果為負時輸出字符串最左邊位置為'-'。

 

 

輸入描述:

輸入兩個字符串

輸出描述:

輸出給求和后的結果

輸入例子:
98765432101234567890
輸出例子:
11111111100這題就是個典型的大數運算問題。用C/C++來寫還是挺有意思的,用字符串處理可以避免大數據的溢出,如果嘗試用C/C++中最大數據long long來存仍然會溢出,因此還是老老實實實現:

基本思路就是對字符串的每個字符模擬整數的從低位到高位按位相加,要注意進位的處理的和最高位'-'號的處理即可。

完整AC的代碼:

//應該是很簡潔的寫法了,思路就是對字符串的每個字符模擬按低位到高位的加法操作#include <iostream>#include <algorithm>using namespace std;string add(string numStr1,string numStr2){    string res;    int c=0,temp;    if(numStr1.size()!=numStr2.size()){//長度不同先補零        while(numStr1.size()<numStr2.size()){            numStr1.insert(0,1,'0');        }        while(numStr1.size()>numStr2.size()){            numStr2.insert(0,1,'0');        }    }    if(numStr1[0]!='-'&&numStr2[0]!='-'){        for(int i=numStr1.size()-1;i>=0;i--){//按位相加,從低位開始            temp=(int)(numStr1[i]-'0')+(int)(numStr2[i]-'0')+c;            if(temp>9){                temp=temp%10;//結果達到10則只保留個位                c=1;//然后進位給高位            }            else                c=0;//進位清0            res+=to_string(temp);        }        if(c)res+='1';//最高位還有進位,則補1個'1'        reverse(res.begin(),res.end());//逆置字符串后結果就是相加后的值(res是從低位往里添加字符的)    }    else if(numStr1[0]=='-'&&numStr2[0]=='-'){//均為‘-’        for(int i=numStr1.size()-1;i>0;i--){//最高位不管            temp=(int)(numStr1[i]-'0')+(int)(numStr2[i]-'0')+c;            if(temp>9){                temp=temp%10;                c=1;            }            else                c=0;            res+=to_string(temp);        }        if(c)res+='1';//最高位        res+='-';//添加'-'        reverse(res.begin(),res.end());    }    return res;}int main(){    string numStr1,numStr2;    while(cin>>numStr1>>numStr2){        cout<<add(numStr1,numStr2)<<endl;    }    return 0;} 另外,這題如果用java做,Java里有BigInteger的類,這個問題就不成問題了。。

import java.math.BigInteger;import java.util.Scanner;public class Main{    public static void main(String[] args) {        Scanner in=new Scanner(System.in);        while(in.hasNext()){                  String a=in.next();          String b=in.next();          BigInteger c=new BigInteger(a);          BigInteger d=new BigInteger(b);          System.out.PRintln(c.add(d));        }    }} python更離譜:

try:    while 1:        print input() + input()except:    pass幾行代碼完美AC。。。怎么能這樣,C/C++ 黨已哭暈在廁所!!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 灵璧县| 临海市| 贵州省| 如东县| 延吉市| 泸西县| 体育| 陇川县| 富平县| 安龙县| 通辽市| 锡林郭勒盟| 大冶市| 如皋市| 伊金霍洛旗| 和硕县| 内乡县| 鸡泽县| 南和县| 太原市| 翁源县| 内江市| 牡丹江市| 安吉县| 鸡东县| 尖扎县| 萝北县| 曲松县| 大港区| 鄯善县| 隆安县| 长宁县| 长沙市| 论坛| 容城县| 嵊泗县| 海南省| 原阳县| 化州市| 两当县| 泰安市|