Skip to content

Instantly share code, notes, and snippets.

@komasaru
Created December 14, 2017 04:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save komasaru/366b1d6833f28e30dcdc30133f797453 to your computer and use it in GitHub Desktop.
Save komasaru/366b1d6833f28e30dcdc30133f797453 to your computer and use it in GitHub Desktop.
C++ source code to compare big digits.
/*********************************************
* 多倍長整数の大小比較
* ( 符号は考慮しない。1桁1配列 )
*********************************************/
#include <cstdlib> // for rand()
#include <iostream> // for cout
#include <stdio.h> // for printf()
#include <time.h> // for time()
#define D_L 1000 // 多倍長整数桁数 ( 左辺 )
#define D_R 1001 // 多倍長整数桁数 ( 右辺 )
using namespace std;
/*
* 計算クラス
*/
class Calc
{
int L[D_L]; // 多倍長整数(左辺)配列
int R[D_R]; // 多倍長整数(右辺)配列
public:
Calc(); // コンストラクタ
void procMain(); // 主処理
private:
int compare(int *, int, int *, int); // 大小比較
void display(int *, int *, int); // 結果出力
};
/*
* コンストラクタ
*/
Calc::Calc()
{
// 使用する被加減乗除数・加減乗除数を設定(テストなので乱数を使用)
srand((unsigned int)time(NULL)); // 乱数の種を初期化
for (int i = 0; i < D_L; i++) L[i] = rand() % 10;
for (int i = 0; i < D_R; i++) R[i] = rand() % 10;
}
/*
* 主処理
*/
void Calc::procMain()
{
// 各種宣言
int l[D_L]; // 多倍長整数 ( 左辺 )
int r[D_R]; // 多倍長整数 ( 右辺 )
int s; // 不等号
// 初期設定
// ( コンストラクタで設定した値をセット )
for (int i = 0; i < D_L; i++) l[i] = L[i];
for (int i = 0; i < D_R; i++) r[i] = R[i];
// 大小比較
s = compare(l, D_L, r, D_R);
// 結果出力
display(l, r, s);
}
/*
* 大小比較
*
* - 引数 : a(多倍長整数・左辺), b(多倍長整数・右辺)
* - 返り値 : 1: l > r
* 0: l = r
* -1: l < r
*/
int Calc::compare(int *l, int size_l, int *r, int size_r)
{
int i; // LOOPインデックス
// 左辺の右辺より大きい部分
if (size_l > size_r) {
for (i = size_l - 1; i >= size_r; i--) {
if (l[i] != 0) return 1;
}
}
// 右辺の左辺より大きい部分
if (size_l < size_r) {
for (i = size_r - 1; i >= size_l; i--) {
if (r[i] != 0) return -1;
}
}
// 桁数が同じ場合か、桁数が異なる場合の桁がダブる部分
for (i = min(size_l, size_r) - 1; i >= 0; i--) {
if (l[i] > r[i]) return 1;
if (l[i] < r[i]) return -1;
}
// 等しい場合
return 0;
}
/*
* 結果出力
*/
void Calc::display(int *l, int *r, int s)
{
int i; // LOOPインデックス
// 左辺
printf("[LEFT] =\n");
for (i = D_L - 1; i >= 0; i--) {
printf("%d", l[i]);
if ((D_L - i) % 10 == 0) printf(" ");
if ((D_L - i) % 50 == 0) printf("\n");
}
printf("\n");
// 右辺
printf("[RIGHT] =\n");
for (i = D_R - 1; i >= 0; i--) {
printf("%d", r[i]);
if ((D_R - i) % 10 == 0) printf(" ");
if ((D_R - i) % 50 == 0) printf("\n");
}
printf("\n");
// 大小比較結果
printf("[LEFT] %s [RIGHT]\n", s == 0 ? "=" : (s > 0 ? ">" : "<"));
}
/*
* メイン処理
*/
int main()
{
try
{
// 計算クラスインスタンス化
Calc objCalc;
// 主処理
objCalc.procMain();
}
catch (...) {
cout << "例外発生!" << endl;
return -1;
}
// 正常終了
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment