1. 程式人生 > >大數乘法(一)

大數乘法(一)

            常用的大數相乘演算法有模擬加減法和分治法,第一種符合我們的運算習慣,第二種用數學方法提高了效率,(具體描述與實現可參考http://www.cnblogs.com/heyonggang/p/3599857.html)而兩種各有優勢的方法的程式實現都比較複雜,並且不易於初學者理解,於是我琢磨出了一個將它們合二為一的方法,將權值與陣列下標對應,而且其原理通俗易懂,所程式設計序也較簡單。

       首先,通過一個例子來展示我們所運用的運算規律:

12*45=540;

12=1*10^1+2*10^0;------------------------把12每一位分解開

45=4*10^1+5*10^0;

------------------------把45每一位分解開

12*45=(1*10^1+2*10^0)*(4*10^1+5*10^0)--------多項式相乘

             =1*4*10^(1+1)+1*5*10^(1+0)--------------可知n位數乘m位數需進行n*m次乘法

                                    +2*4*10^(0+1)+2*5*10^(0+0)-----和(n-1)*(m-1)次加法

             =4*10^2          +13*10^1        +10*10^0-------每一項其指數都是原來相乘的項的指數和

=540----------------而且積的位數為n+m(最高位有進位)或n+m-1(最高位無進位);

觀察上面算式得出演算法:

輸入兩個大數,並且將它們逆序儲存在陣列a與b中:

  大數a[n]={a[0],a[1],...,a[n]},大數b[m]={b[0],b[1],b[2],...,b[m]};

  宣告儲存結果的陣列c[n+m];並且將元素初始化全為0;

其中,每一位的指數即是其下標,而分解相乘後的每一項值與指數分別為a[i]*b[j]和i+j;

a[i]*b[j]儲存在c中以i+j為下標的的位置,仍然以上例來做演示,到這一步時c中元素為

10 13 4 0
,

只需將其按照十進位制進位規則進位即可,

0 4 5 0
此時,將c去掉第一個大於0的數字前的0並倒序輸出即為最終結果。

下面貼上c/c++程式碼:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<sstream>
#include <cstdlib>
using namespace std;

void assignment(int* s,int n){
	for(int i=0;i<n;i++){
		s[i]=0;
	}
} 
void Multiplication(char *arr1,char* arr2,int* Result){
	int n,m;n=strlen(arr1);m=strlen(arr2);
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			Result[i+j]=Result[i+j]+(arr1[i]-'0')*(arr2[j]-'0');
		}
	}
}
void reorganize(int *Result,int n){
	int t;
	for(int i=0;i<n;i++){
		if(Result[i]>9){
			t=Result[i]%10;
			Result[i+1]=Result[i+1]+Result[i]/10;
			Result[i]=t; 
		}
	}
}
int main(){
	string s1,s2;
	int n,m;char h;
	cin>>s1>>s2;
	n=s1.length();m=s2.length();
	char *arr1=new char[n];char *arr2=new char[m];
	int  *Result=new int[n+m]; 
	assignment(Result,n+m);
	int i=0,j=0;
	stringstream ss1(s1);while(ss1>>h)arr1[i++]=h;arr1[i]='\0';
	stringstream ss2(s2);while(ss2>>h)arr2[j++]=h;arr2[j]='\0';
	arr1=strrev(arr1);arr2=strrev(arr2);
	Multiplication(arr1,arr2,Result);
	reorganize(Result,n+m);
	int k,z=0;k=n+m;
	while(k--){
		if(Result[0]!=0||Result[k+1]==0&&Result[k]!=0){
			z=1;
		}
		if(z==1)printf("%d",Result[k]);
	}	
} 


相關推薦

大數乘法

            常用的大數相乘演算法有模擬加減法和分治法,第一種符合我們的運算習慣,第二種用數學方法提高了效率,(具體描述與實現可參考http://www.cnblogs.com/heyong

大數乘法二進位制

對於一些非常大的數如果使用直接乘法的話,時間會非常長,對此我們可以把其中的較大的那個數轉變成二進位制再來計算會簡單許多。 用程式碼實現如下 long long int quick(long long a,long long b) { long long int sum=0;

大數乘法板子

#include<bits/stdc++.h> using namespace std; char a[10005],b[10005]; int x[10005],y[10005],z[20

mysql大數據備份及恢復

日誌記錄 數據恢復 insert 數據庫mysql values Mysql大數據備份和恢復一MySQL備份一般采取全庫備份、日誌備份;MySQL出現故障後可以使用全備份和日誌備份將數據恢復到最後一個二進制日誌備份前的任意位置或時間;mysql的二進制日誌記錄著該數據庫的所有增刪改的操

HDU 1402 A * B Problem Plus ——大數乘法,FFT

兩個 ret 處理 complex truct std spa strlen mes   因為剛學fft,想拿這題練練手,結果WA了個爽= =。   總結幾點犯的錯誤:   1.要註意處理前導零的問題。   2.一定要註意數組大小的問題。(前一個fft的題因為沒用到b數組,

如何籌建公司的大數據分析系統

大數據 日誌分析 elk 淺談下,如標題這個問題:隨著大數據被不停的挖掘,每天有態度的人利用用戶數據信息,產生巨大的商業價值,以及風險告警,在籌建大數據分析系統時,大家都很熱衷新的東西,在做公司架構體系時,動不動就直接上新的技術,導致項目夭折,最後走人換公司的局面,後來不斷的有人去填坑。隨著Spl

Hadoop之初識大數據與Hadoop

hive 程序員 http 關系型數據庫 .com 邏輯 使用 alt clu 前言   從今天起,我將一步一步的分享大數據相關的知識,其實很多程序員感覺大數據很難學,其實並不是你想象的這樣,只要自己想學,還有什麽難得呢?   學習Hadoop有一個8020原則,80%

Hadoop之初識大數據與Hadoop【轉載】

hba 無效 理解 組織 鼠標 掌握 能夠 through 2.3 原文地址:http://www.cnblogs.com/zhangyinhua/p/7647334.html 閱讀目錄(Content) 一、引言(大數據時代) 1.1、從數據中得到信息 1.2、大數據

Apache Spark大數據分析入門

做的 項目 persist fig shell命令 tutorial math 提高 welcom 摘要:Apache Spark的出現讓普通人也具備了大數據及實時數據分析能力。鑒於此,本文通過動手實戰操作演示帶領大家快速地入門學習Spark。本文是Apache Spark

大數據學習linux基礎

info spa 包含 目的 創建 http -- 刪除 family 知識體系: 一、Linux基礎 二、Hadoop的背景知識與起源 三、搭建Hadoop環境 四、Apache Hadoop的體系結構 五、HDFS 六、MapReduce 七、MapReduce編

大數據筆記——Hadoop的起源與背景知識

variety var city inf 成本 特征 找到 hbase span 一.大數據的5個特征(IBM提出):   Volume(大量)   Velocity(高速)   Variety(多樣)   Value(價值)   Varacity(真實性) 二.OLT

大數據入門第十七天——storm上遊數據源 之kafka詳解入門

不同 這也 接受 blog 存儲 發送 records ant post 一、概述   1.kafka是什麽     根據標題可以有個概念:kafka是storm的上遊數據源之一,也是一對經典的組合,就像郭德綱和於謙     根據官網:http://kafka.apa

大數據入門第十九天——推薦系統與mahout入門與概述

tps font 解決 技術分享 tar nbsp mage cnblogs clas 一、推薦系統概述   為了解決信息過載和用戶無明確需求的問題,找到用戶感興趣的物品,才有了個性化推薦系統。其實,解決信息過載的問題,代表性的解決方案是分類目錄和搜索引擎,如hao123

【模板】大數乘法51nod 1027

() sca strlen ret span har gif long long inline 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #

機器學習筆記:最小二乘法和梯度下降

一、最小二乘法 1.一元線性擬合的最小二乘法 先選取最為簡單的一元線性函式擬合助於我們理解最小二乘法的原理。 要讓一條直接最好的擬合紅色的資料點,那麼我們希望每個點到直線的殘差都最小。 設擬合直線為

機器學習之數學系列矩陣與矩陣乘法

1.對於矩陣的認識應當把它看成是多個向量的排列表或把矩陣看成行向量,該行向量中的每個元素都是一個列向量,即矩陣是複合行向量。如下圖所示。 2.對於下面這個矩陣的乘法有兩種看法: (1)矩陣將向量[b1,b2,b3].T進行了運動變換,這種變換可以是同空間內變換,也可以是不同空間間的變換;

機器學習中的數學系列矩陣與矩陣乘法

1.對於矩陣的認識應當把它看成是多個向量的排列表或把矩陣看成行向量,該行向量中的每個元素都是一個列向量,即矩陣是複合行向量。如下圖所示。 2.對於下面這個矩陣的乘法有兩種看法: (1)矩陣將向量[b1,b2,b3].T進行了運動變換,這種變換可以是同空間內變

C++使用string的大數運算3乘法

本次專案目標:使用C++完成對於大數的相關運算專案要點1.大數指的是遠超long long int的資料2.將大數用矩陣進行儲存,並通過矩陣實現運算3.本人採用字串進行儲存,應注意char的特點比如:char a=161;     cout<<(int)a;此時會

大數據發展的挑戰都有哪些

諸多 如果 很多 圖片 tex 沒有 人員 ima 搭建 大家都知道,現在大數據是十分火熱的,這也使得很多人都想進入大數據行業。但是現在的大數據在發展上還是有一些挑戰的,前幾年,大數據尚處膨脹階段,後來開始轉入了理性發展階段,到現在已經到了使用的階段,由此可見大數據的發展

大數據學習

學習 之前 大數據 分享 定義 回調 com mage img 1:異常處理 2: 回調函數:將函數作為參數傳遞給另一個函數  作用:函數在被定義之前就可以被使用 3: 大數據學習(一)