ブルーブリッジカップ基礎練習高精度加算

2103 ワード

問題の説明
2つの整数を入力
a和
b,この2つの整数の和を出力する.
a和
bは100位を超えない.
アルゴリズムの説明
によって
a和
bはいずれも大きいため、言語の標準データ型を直接使用して記憶することはできない.この問題については,一般に配列を用いて処理される.
配列の定義
A,
A[0]記憶用
aのビット、
A[1]記憶用
aの10位は、このように推す.同じ配列で
Bは記憶する
b.
計算#ケイサン#
c = 
a + 
bの場合、まず
A[0]と
B[0]を加算し、キャリーが発生した場合、キャリー(和の10桁)を格納する
r,和の桁数を格納する
C[0]、すなわち
C[0]は(
A[0]+
B[0])%10.そして計算
A[1]と
B[1]を加算した場合、下位の値を上げる
rも加算すると、すなわち
C[1]は
A[1]、
B[1]と
r 3つの数の和.またキャリーが発生した場合でも、新しいキャリーを
rにおいて、和のビットは
C[1]では.このように推すと,すぐに求めることができる
Cのすべてのビット.
最後に
C出力でOKです.
入力フォーマット
入力には2行が含まれ、最初の動作は非負の整数です.
a,第2の挙動の非負の整数
b.2つの整数はいずれも100ビットを超えず、2つの数の最高位は0ではありません.
出力フォーマット
1行出力、表示
a + 
bの値.
サンプル入力
20100122201001221234567890
2010012220100122
サンプル出力
20100122203011233454668012
考え方:
1.入力した数をchar配列として保存する
2.2つの配列の長さ、すなわちビット数を得る
3.2つの配列をそれぞれ巡回(ここでは一緒に)し、この計算は配列のビットから計算する必要があるので、配列長-i-1によってaとbを逆さまに巡回する
4.各ビットごとに加算とキャリーを行う
5.出力するときは逆さまにansを巡り、最初の0より大きいつまり実際の答えから出力します
#include
using namespace std;
int main()
{
	char a[100], b[100];
	int ans[200];

#pragma warning( disable : 4996)
	freopen("d://in.txt", "r", stdin);

	while (true)
	{
		memset(a, 0, sizeof(a));
		memset(b, 0, sizeof(b));
		memset(ans, 0, sizeof(ans));
		cin.getline(a, 100);
		cin.getline(b, 100);

		int alen = strlen(a);
		int blen = strlen(b);

		for (int i = 0; i < alen || i < blen; i++)
		{
			if (i < alen)
			{
				ans[i] += a[alen - i - 1] - '0';
			}
			if (i < blen)
			{
				ans[i] += b[blen - i - 1] - '0';
			}
			if (ans[i] >= 10)
			{
				ans[i + 1] = ans[i] / 10;
				ans[i] = ans[i] % 10;
			}
		}

		for (int i = 199; i >= 0; i--)
		{
			if (ans[i] > 0)
			{
				for (int j = i; j >= 0; j--)
				{
					cout << ans[j];
				}
				cout << endl;
				break;
			}
		}
	}
    return 0;
}


リファレンスhttp://blog.csdn.net/coding_debug/article/details/50390090