您的位置:首页 > 其它

高精度入门(减法、加法、乘法)之 CODE[VS] 3115、3116、3117

2015-09-30 02:07 337 查看
3115 高精度练习之减法:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <string>
#include <algorithm>
#include <cstring>
#include <set>
#include <utility>
#include <locale>
#include <ctime>
using namespace std;
//using int64 = long long;
const int INF = 0x3f3f3f3f;
const int MaxN = 110;

string A, B;
string ans;

void Repair()
{
// 使两个字符串具有相同长度
if (A.size() < B.size())
{
for (int i = A.size(); i < B.size(); ++i)
{
A = '0' + A;
}
}else
{
for (int i = B.size(); i < A.size(); ++i)
{
B = '0' + B;
}
}
}

void Solve()
{

bool isNegative = true;
// 倘若A<B,输出负号,并交换A和B的值
for (int i = 0; i < A.size(); ++i)
{
if (A[i] - '0' == B[i] - '0') continue;
if (A[i]-'0' > B[i]-'0')
{
isNegative = false;
}
break;
}
if (isNegative) {
cout << "-";
swap(A, B);
}
// 大数减法
for (int i = A.size() - 1; i >= 0; --i)
{
if (A[i] < B[i])
{
// 借位,注意所借之位为0的情况,借位之后,这些位变为9
int tmp = i - 1;
while ((A[tmp]-'0')-1 < 0) --tmp;
A[tmp] = '0' + ((A[tmp] - '0') - 1);
++tmp;
while (tmp < i)
{
A[tmp] = '9';
++tmp;
}
ans = static_cast<char>('0' + ((A[i] - '0' + 10) - (B[i] - '0'))) + ans;
}else
{
// 无需借位,直接减
ans = static_cast<char>('0' + (A[i] - B[i])) + ans;
}
}
bool Judge = false;
for (int i = 0; i < ans.size(); ++i)
{
// 忽略前导零
if (ans[i] != '0' || Judge)
{
cout << ans[i];
Judge = true;
}
}
cout << endl;
}

int main()
{

while (cin >> A >> B)
{
ans.clear();
Repair();
Solve();
}

#ifdef HOME
cerr << "Time elapsed: " << clock() / CLOCKS_PER_SEC << " ms" << endl;
#endif
return 0;
}


3116 高精度练习之加法:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <string>
#include <algorithm>
#include <cstring>
#include <set>
#include <utility>
#include <locale>
#include <ctime>
using namespace std;
//using int64 = long long;
const int INF = 0x3f3f3f3f;
const int MaxN = 110;

string A, B;
string ans;

void Repair()
{
if (A.size() < B.size())
{
for (int i = A.size(); i < B.size(); ++i)
{
A = '0' + A;
}
}else
{
for (int i = B.size(); i < A.size(); ++i)
{
B = '0' + B;
}
}
}

void Solve()
{
int tmp = 0;
for (int i = A.size() - 1; i >= 0; --i)
{
if ((A[i]-'0') + (B[i] - '0') + tmp > 9)
{
ans = static_cast<char>('0' + ((A[i] - '0') + (B[i] - '0') + tmp) % 10) + ans;
tmp = 1;
}else
{
ans = static_cast<char>('0' + ((A[i] - '0') + (B[i] - '0') + tmp)) + ans;
tmp = 0;
}
}
if (tmp) ans = '1' + ans;
cout << ans << endl;;
}

int main()
{

while (cin >> A >> B)
{
ans.clear();
Repair();
Solve();
}

#ifdef HOME
cerr << "Time elapsed: " << clock() / CLOCKS_PER_SEC << " ms" << endl;
#endif
return 0;
}


3117 高精度练习之乘法:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <string>
#include <algorithm>
#include <cstring>
#include <set>
#include <utility>
#include <locale>
#include <ctime>
using namespace std;
//using int64 = long long;
const int INF = 0x3f3f3f3f;
const int MaxN = 110;

string _A, _B;

void Repair(string& A, string& B)
{
if (A.size() < B.size())
{
for (int i = A.size(); i < B.size(); ++i)
{
A = '0' + A;
}
}else
{
for (int i = B.size(); i < A.size(); ++i)
{
B = '0' + B;
}
}
}

string Add(string A, string B)
{
Repair(A, B);
string ans;
int tmp = 0;
for (int i = A.size() - 1; i >= 0; --i)
{
if ((A[i] - '0') + (B[i] - '0') + tmp > 9)
{
ans = static_cast<char>('0' + ((A[i] - '0') + (B[i] - '0') + tmp) % 10) + ans;
tmp = 1;
}
else
{
ans = static_cast<char>('0' + ((A[i] - '0') + (B[i] - '0') + tmp)) + ans;
tmp = 0;
}
}
if (tmp) ans = '1' + ans;
return ans;
}

string Mul(string A, char B)
{
string ans;
int tmp = 0;
int result;
for (int i = A.size() - 1; i >= 0; --i)
{
result = (A[i] - '0')*(B - '0') + tmp;
tmp = result / 10;
ans = static_cast<char>('0' + result % 10) + ans;
}
if (tmp) ans = static_cast<char>('0' + tmp) + ans;
return ans;
}

void Solve(string A, string B)
{
string ans = "0";
string tmp;
int num = 0; // 统计加的0的个数
for (int i = B.size() - 1; i >= 0; --i)
{
tmp = Mul(A, B[i]);
for (int j = 0; j < num; ++j) tmp += '0';
ans = Add(ans, tmp);
++num;
}
cout << ans << endl;;
}

int main()
{

while (cin >> _A >> _B)
{
Solve(_A, _B);
}

#ifdef HOME
cerr << "Time elapsed: " << clock() / CLOCKS_PER_SEC << " ms" << endl;
#endif
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: