兩個大數使用string 表示,請實現乙個函式,將他們相加。
注意:
1. 大數可能包含小數,比如:123.07+8796
2. 輸入可能有誤,請檢查是否合法,不合法返回值為false
3. 大數不包含科學計數法。
檢查string是否合法;不合法返回「false」。
分離string,分成整數部分和小數部分。
對整數部分進行加法,先對齊補零。
對小數部分進行加法,先對齊補零。
負數情況如何處理?轉化為大數減法。先判斷哪個是作為被減數。
空,+,-,.5,+345,-234;
#include "stdafx.h"
#include
#include
using
namespace
std;
// 正負數判斷
bool ispositive(string number) // number合法情況下
// 是否合法
bool isnumber(string number)// 空,+,-不合法
while (number[i] != '.'&&i < len)
if (number[i] == '.')
}if (i == len)
return
true;
return
false;
}// getting inter and decimal by '.'
bool gettinginterdecimal(string number, string &inter, string &decimal)
string addalign(string &add1, string &add2, int right, bool &carry) // right=1,mean 右對齊加;else 左對齊加
while (add1.size() < add2.size())
bool carryadd = 0;
string addsum = add1;
for (int i = add1.size()-1; i >= 0; i--)
else
carryadd = 0;
}carry = carryadd;
return addsum;
}bool cmpnumber(string inter1, string inter2, string decimal1, string decimal2)
string subalign(string &sub1, string &sub2, int right,bool &carry) // right=1,mean 右對齊加;else 左對齊加
string sub=sub1;
bool carrysub = 0;
for (int i = sub2.size() - 1; i >= 0; i--)
else
carrysub = 0;
}carry = carrysub;
return sub;
}string stringadd(string add1, string add2)
string intersum = addalign(add1inter, add2inter, 1, carry1);
if (carry1)
intersum = '1' + intersum;
sum = intersum + "." + decimalsum;
if (!add1sign)
sum = '-' + sum;
}else
// 乙個正數和乙個負數情況,轉化為減法,大數減小數
else
}return sum;
}void test()
另一種運算子過載思路 可參考 2020阿里實習生招聘筆試題
小強有n個養雞場,第i個養雞場初始有a i 只小雞,小強的每個養雞場每天早上都會增加k只小雞,到了下午小強會把雞最多的雞場賣掉一半雞,那麼小強想知道m天後他所有養雞場一共有幾隻雞。第一行輸入三個正整數n,m,k 第二行輸入n個正整數a i 表示養雞場雞數量。1 n 100000,1 m 100000...
頭條2018實習生筆試
這個題的核心是用了乙個map,key是每一種喜好程度值k,然後把同乙個k的使用者id放在乙個vector裡。即map 每乙個查詢直接在要查詢的喜好程度k相應的使用者id陣列中找。include include include using namespace std int main 查詢 這個題我也...
阿里巴巴暑期實習生筆試題
1.kmp演算法 長度為n的主串t中匹配長度為m的子串p n m 匹配成功 存在p的每個字元依次和t中的乙個連續字串行相等 輸出主串中匹配串起始位置,匹配失敗輸出 1 思路 首先用o m 的時間對子串進行預處理,可通過子串本身的特性判斷出需要右移幾位才是可能匹配的 然後用o n 的時間去完成匹配 時...