1. 程式人生 > >【hdoj_1002】A+B Problem ||(大數)

【hdoj_1002】A+B Problem ||(大數)

題目提示,相加的兩個數的位數可能很大(最多可達1000位),而int最多32位,long long型別和__int64型別都是最多64位,均不能儲存位數過多的數,所以現有的資料型別無法直接儲存.

思路:用字串儲存輸入的數字,模擬加法的過程,即相加和進位的過程.

首先,來看一下,加法以及進位的原理,以便後面[核心程式碼]的理解.


No.1   6 + 7 = 13——>1和3,第一位寫3,進位為1

No.2   8 + 3 = 11——>11 + No.1中的進位1 = 12——>1和2,第二位寫2,進位為1

No.3   9 + 0 = 9——>9 + No.2中的進位1 = 10——>1和0,第三位寫0,進位為1

No.4   7 + 4 = 11——>11 + No.3中的進位1 = 12——>1和2,第四位寫2,進位為1

No.5   0 + 0 = 0——>0 + No.4中的進位1 = 1——>0和1,第五為寫1,沒有進位,結束

由於兩數的第一位沒有進位可以加,所以直接是對應的兩數相加,取餘數就是3.從第二位開始,對應數加完之後,還要與前面的的進位的數(1或者0)相加,再取餘數,才是這一位的數.

下面思考,如何寫程式碼?

1.用字串(string類物件)表示輸入的數.

2.給定輸入的兩個數x和y(用string型別x和y儲存),應該作如下處理


圖示做了兩個方面處理,(1)對齊,方便對應位置的數字進行加法運算.(2)在最前面還加了一個0,給可能存在的進位預留一個位置,例如99+1,結果的位數為3位.

3.在進行加法的時候,逆序(從低位開始)進行.

C++程式碼如下

#include<iostream>
#include<string>
using namespace std;

#define max(a,b) (a>b?a:b)//類似於定義一個函式求二者中的較大者

int main()
{
	//freopen("in.txt","r",stdin);//除錯用
	int T;
	cin >> T;//T組資料
	for(int t=1;t<=T;t++)
	{
		string x,y;
		cin >> x >> y;//輸入兩個數

		//結果輸出時的格式控制
		cout << "Case " << t << ":" << endl;
		cout << x << " + " << y << " = ";
		
		int xL = x.length();//x的長度
		int yL = y.length();//y的長度


		if(xL<yL)//如果x的位數小,則交換,因為最後統一將結果儲存在x中
		{
			x.swap(y);//交換內容

			int len = xL;//因為後面要用到yL,所以長度也要交換
			xL = yL;
			yL = len;
		}

		//到這裡x一定是長度較長的那個

		int L = max(xL,yL) + 1;//結果的長度為x和y的最大長度+1(此處L的值其實就是xL+1)

		x = '0' + x;//x的前面新增一個0

		int i,j;//迴圈變數

		for(i=yL+1;i<=L;i++)//使x和y的長度一樣
			y = '0' + y;//新增0

		//下面開始加法運算了
		int c = 0;//記錄進位:c=1或者c=0
		for(i=L-1;i>=0;i--)//從右邊加到左邊
		{
			int z = x[i]-'0';//獲取x[i]對應的字元對應的數字,例如x[i] = '6',則x[i]-'0'就是int型的6.
			int w = y[i]-'0';
			int h = z + w + c;//下面三行程式碼是[核心程式碼],描述加法的過程
			c = h / 10;
			x[i] = h%10 + '0';
		}
		
		//輸出預處理:找到從什麼開始沒有0(去除前導0)
		for(i=0;i<L;i++)
			if(x[i]!='0')
				break;
		for(j=i;j<L;j++)//輸出
			cout << x[j];
		cout << endl;

		if(t!=T)//空行
			cout << endl;
	}

	return 0;
}
上述程式碼,提交可以通過.

小結:

1.除錯小技巧:在主函式開始寫 freopen("in.txt","r",stdin);     其中in.txt為cpp檔案同目錄下的輸入資料.

2.巨集定義的使用:#define max(a,b) (a>b?a:b)   不需要寫資料型別

相關推薦

hdoj_1002A+B Problem ||(大數)

題目提示,相加的兩個數的位數可能很大(最多可達1000位),而int最多32位,long long型別和__int64型別都是最多64位,均不能儲存位數過多的數,所以現有的資料型別無法直接儲存.

[Luogu 1919]模板A*B Problem升級版(FFT快速傅裏葉)

vector sample lex cstring 模板 rip putc -s and Description 給出兩個n位10進制整數x和y,你需要計算x*y。 Input 第一行一個正整數n。 第二行描述一個位數為n的正整數x。 第三行描述一個位數為n的正整數y

洛谷P1919 模板A*B Problem升級版(FFT快速傅裏葉)

題目 計算 printf n) freopen sam 升級 double 輸入輸出格式 題目描述 給出兩個n位10進制整數x和y,你需要計算x*y。 輸入輸出格式 輸入格式: 第一行一個正整數n。 第二行描述一個位數為n的正整數x。 第三行描述一個位數為n的

luogu P1919 模板A*B Problem升級版(FFT快速傅裏葉)

type -i OS source a* ++ urn CP AS 模板 嗯 做多項式乘法,進位 沒了 #include<cmath> #include<cstdio> #include<cstring> #include<a

bzoj1000A+B Problem

個數 output 什麽 \n pri bit rip inpu include Description 輸入兩個數字,輸出它們之和 Input 一行兩個數字A,B(0<=A,B<100) Output 輸出這兩個數字之和 Sample Input 1 2 Sa

洛谷P2005A/B Problem II

.html pan emc .com void const strlen uri ring 題目傳送門:https://www.luogu.org/problemnew/show/P2005 高精除低精:https://www.cnblogs.com/AKMer/p/972

洛谷P1919 模板A*B Problem升級版(FFT)

targe 空間 break 這就是 bre color show print lex 傳送門 話說FFT該不會真的只能用來做這種板子吧…… 我們把兩個數字的每一位都看作多項式的系數 然後這就是一個多項式乘法 上FFT就好了 然後

完全背包p1832A+B Problem(再升級)

spa 枚舉 iostream fin break oid getchar() true += Description 給定一個正整數n,求將其分解成若幹個素數之和的方案總數。 Input 一行:一個正整數n Output 一行:一個整數表示方案總數 素數之和 ? 背包

題解A+B problem

題目描述 輸入兩個整數a,b,輸出它們的和(|a|,|b|<=10^9)。 注意 pascal使用integer會爆掉哦! 有負數哦! c/c++的main函式必須是int型別,而且最後要return 0。這不僅對洛谷其他題目有效,而且也是noip/noi

洛谷 P1919 模板A*B Problem升級版(FFT快速傅立葉)

題目來源 吐槽下P3803都是紫題... 真心好寫,本想一遍過的...但是 我真是太菜了... 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int MAXN=200000; 4 const dou

洛谷 P1919 模板A*B Problem升級版(FFT快速傅裏葉)

urn == mes span operator scanf spa a* printf 題目來源 吐槽下P3803都是紫題... 真心好寫,本想一遍過的...但是 我真是太菜了... 1 #include<bits/stdc++.h> 2

luogu P1865 A % B Problem題解

prim clas cross tdi const mem amp nbsp pac 題目鏈接:https://www.luogu.org/problemnew/show/P1865 其實就是埃拉托色尼篩素數模板... 好像每個數暴力枚舉到sqrt()也可以...就算當我無

洛谷 1601A+B Problem(高精)

問題描述 高精度加法(無負數) 樣例輸入 1 1 樣例輸出 2 const maxn=100; var a,b:array[1..maxn] of longint; proce

hdu1576A/B——擴展歐幾裏得算法

推導 none gif spa 具體細節 pac ons 技術 pen 擴展歐幾裏得的模板題,要記住: x=y1; y=x1-a/b*y1。 這道題的推導過程如下: 1.因為A/B==0,所以令A/B=x,即A=Bx。又因為n=A%m,所以m*y+n=A。 由上面可推導出B

HDOJA Math Problem(對pow()的理解)

題意 hdu pan 打了 AC 輸入 show color 執行效率 A Math Problem http://acm.hdu.edu.cn/showproblem.php?pid=6182 題意:輸入一個n,問有多少個k的k次冪<=n(k=1,2,3...) 思

程式設計俱樂部每日一練(2018年12月3日)A * B Problem大數乘法

程式設計俱樂部每日一練(2018年12月3日)A * B Problem大數乘法 A * B Problem Description Now Give you two integers A and B , please caculate the value of A multiply

程式設計俱樂部每日一練(2018年12月2日) A - B problem大數減法

程式設計俱樂部每日一練(2018年12月2日) A - B problem大數減法 Description Now, Give you two intgers A and B , Please calculate the value of A minus B. Attation:

# 程式設計俱樂部每日一練(2018年11月30日)A + B problem 大數加法

程式設計俱樂部每日一練(2018年11月30日)A + B problem 大數加法 Description Calculate A + B. Input Each line will contain two integers A and B. Process to end

LintcodeA+B問題

題目描述: 給出兩個整數a和b, 求他們的和, 但不能使用 + 等數學運算子。 注意事項 你不需要從輸入流讀入資料,只需要根據aplusb的兩個引數a和b,計算他們的和並返回就行。 說明: a

進位制問題HDU2056A + B Again

A + B Again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 15772    Accepted S