大數乘法 poj 2389 ||大數乘法 hdu1402 FFT模板
poj 2389:
Bull MathTime Limit: 1000MS | Memory Limit: 65536K |
Total Submissions: 13694 | Accepted: 7065 |
Description
Bulls are so much better at math than the cows. They can multiply huge integers together and get perfectly precise answers ... or so they say. Farmer John wonders if their answers are correct. Help him check the bulls' answers. Read in two positive integers (no more than 40 digits each) and compute their product. Output it as a normal number (with no extra leading zeros).FJ asks that you do this yourself; don't use a special library function for the multiplication.
Input
Output
* Line 1: The exact product of the two input linesSample Input
11111111111111 1111111111
Sample Output
12345679011110987654321思路 :對應位子上存放對應的積的和 程式碼比較短 不信你看看
code:
#include <iostream> #include <stdio.h> #include<string.h> #include<malloc.h> using namespace std; int s[100]; void multiply(const char *a,const char *b) { int i,j,ca,cb; //int *s; ca=strlen(a); cb=strlen(b); //s=(int *)malloc(sizeof(int)*(ca+cb)); for (i=0; i<ca+cb; i++) s[i]=0; for (i=0; i<ca; i++) for (j=0; j<cb; j++) s[i+j+1]+=(a[i]-'0')*(b[j]-'0'); for (i=ca+cb-1; i>=0; i--) //進位 if (s[i]>=10) { s[i-1]+=s[i]/10; s[i]%=10; } i=0; for(i=0; i<ca+cb; i++) if(s[i]!=0) break;// 跳過頭部0元素 if(i==ca+cb) { printf("0\n"); return ; } for(; i<ca+cb; i++) cout<<s[i]; cout<<endl; } int main() { char a[51],b[51]; while(scanf("%s%s",a,b)!=EOF) { multiply(a,b); } return 0; }
A * B Problem Plus
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 14823 Accepted Submission(s): 2830
Problem Description Calculate A * B.
Input Each line will contain two integers A and B. Process to end of file.
Note: the length of each integer will not exceed 50000.
Output For each case, output A * B in one line.
Sample Input 1 2 1000 2
Sample Output 2 2000
FFT模板:轉載:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
#define L(x) (1 << (x))
const double PI = acos(-1.0);
const int Maxn = 133015;
double ax[Maxn], ay[Maxn], bx[Maxn], by[Maxn];
char sa[Maxn/2],sb[Maxn/2];
int sum[Maxn];
int x1[Maxn],x2[Maxn];
int revv(int x, int bits)
{
int ret = 0;
for (int i = 0; i < bits; i++)
{
ret <<= 1;
ret |= x & 1;
x >>= 1;
}
return ret;
}
void fft(double * a, double * b, int n, bool rev)
{
int bits = 0;
while (1 << bits < n) ++bits;
for (int i = 0; i < n; i++)
{
int j = revv(i, bits);
if (i < j)
swap(a[i], a[j]), swap(b[i], b[j]);
}
for (int len = 2; len <= n; len <<= 1)
{
int half = len >> 1;
double wmx = cos(2 * PI / len), wmy = sin(2 * PI / len);
if (rev) wmy = -wmy;
for (int i = 0; i < n; i += len)
{
double wx = 1, wy = 0;
for (int j = 0; j < half; j++)
{
double cx = a[i + j], cy = b[i + j];
double dx = a[i + j + half], dy = b[i + j + half];
double ex = dx * wx - dy * wy, ey = dx * wy + dy * wx;
a[i + j] = cx + ex, b[i + j] = cy + ey;
a[i + j + half] = cx - ex, b[i + j + half] = cy - ey;
double wnx = wx * wmx - wy * wmy, wny = wx * wmy + wy * wmx;
wx = wnx, wy = wny;
}
}
}
if (rev)
{
for (int i = 0; i < n; i++)
a[i] /= n, b[i] /= n;
}
}
int solve(int a[],int na,int b[],int nb,int ans[])
{
int len = max(na, nb), ln;
for(ln=0; L(ln)<len; ++ln);
len=L(++ln);
for (int i = 0; i < len ; ++i)
{
if (i >= na) ax[i] = 0, ay[i] =0;
else ax[i] = a[i], ay[i] = 0;
}
fft(ax, ay, len, 0);
for (int i = 0; i < len; ++i)
{
if (i >= nb) bx[i] = 0, by[i] = 0;
else bx[i] = b[i], by[i] = 0;
}
fft(bx, by, len, 0);
for (int i = 0; i < len; ++i)
{
double cx = ax[i] * bx[i] - ay[i] * by[i];
double cy = ax[i] * by[i] + ay[i] * bx[i];
ax[i] = cx, ay[i] = cy;
}
fft(ax, ay, len, 1);
for (int i = 0; i < len; ++i)
ans[i] = (int)(ax[i] + 0.5);
return len;
}
int main()
{
int l1,l2,l;
int i;
while(gets(sa))
{
gets(sb);
memset(sum, 0, sizeof(sum));
l1 = strlen(sa);
l2 = strlen(sb);
for(i = 0; i < l1; i++)
x1[i] = sa[l1 - i - 1]-'0';
for(i = 0; i < l2; i++)
x2[i] = sb[l2-i-1]-'0';
l = solve(x1, l1, x2, l2, sum);
for(i = 0; i<l || sum[i] >= 10; i++) // 進位
{
sum[i + 1] += sum[i] / 10;
sum[i] %= 10;
}
l = i;
while(sum[l] <= 0 && l>0) l--; // 檢索最高位
for(i = l; i >= 0; i--) putchar(sum[i] + '0'); // 倒序輸出
putchar('\n');
}
return 0;
}
相關推薦
大數乘法 poj 2389 ||大數乘法 hdu1402 FFT模板
poj 2389: Bull Math Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13694 Accepted: 7065 Description Bulls are so much
hdu1402 FFT 大數乘法
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> #include<math.h> #include
hdu1402(大數a*b&fft模板)
net display img 初始化 stdio.h 位置 scanf ios https 題目鏈接: http://acm.hdu.edu.cn/showproblem.php?pid=1402 題意: 給出兩個長度1e5以內的大數a, b, 輸出 a * b.
HDU1402 FFT高精度乘法模板題
#include<bits/stdc++.h> using namespace std; //HDU 1402 求高精度乘法 const double PI = acos(-1.0); //複數結構體 struct Complex { double x,y;//實部和虛
51NOD-1028 大數乘法V2【大數】
基準時間限制:2 秒 空間限制:131072 KB 分值: 80 難度:5級演算法題 給出2個大整數A,B,計算A*B的結果。 Input 第1行:大數A 第2行:大數B (A,B的長度 <= 100000,A,B >= 0) Output 輸出A
C++使用string的大數運算(3)乘法
本次專案目標:使用C++完成對於大數的相關運算專案要點1.大數指的是遠超long long int的資料2.將大數用矩陣進行儲存,並通過矩陣實現運算3.本人採用字串進行儲存,應注意char的特點比如:char a=161; cout<<(int)a;此時會
【原】biginteger。大數乘法。大數運算。“無限大數字”乘法。大數乘法兩種方法對比
最近在看筆試題,得知大數運算是個經常考的題目。所以有興趣試了試。 一開始按照筆算方法自己寫了個,但是時間複雜度是o(n3)。 參考了網上的演算法之後,修改了自己的演算法,時間複雜度變成o(n2)。 下面的測試結果中,兩個2000位的數字(阿拉伯數字的位數)相乘,耗時90多
大數運算—大數加法、減法、乘法、除法詳解
>原創公眾號:[bigsai](https://mp.weixin.qq.com/s/IW_GNK254ijIuuupjJsKCA) >原創不易,如果有收穫請不要吝嗇你的**一鍵三連**! ### 前言 大家好,我是bigsai!最近,大數加減頻頻登上筆試的舞臺,小夥伴們在群裡也分享自己遇到
POJ 2325 大數除法 貪心
要求:一個n位數M各位相乘得到一個數N,已知N求最小的M。N的位數小於1000. 方法:大數除法 貪心 題面看了好久:679 -> 378 -> 168 -> 48 -> 32 -> 6. 才知道是什麼意思。 1.若N只有一位,那麼前面加個
poj 3233 矩陣乘法(分塊矩陣)
題解:Sn為所求矩陣, 則 這樣, 此題就變成了求矩陣冪和矩陣乘法, 分塊矩陣乘法和普通矩陣一樣的。 code: /* adrui's submission Language : C++ Result : Accepted Love : ll Favorite
poj 2191 大數素數判定 && 大數素數分解
再次用到Miller_rabin 和Pollard - rho, 題意: 給出一個梅森數,2^x - 1,; 然後要對x為素數的時候,梅森數不為素數時的數進行素數分解; 思路:打表; #include<iostream> #inclu
高精度乘法 普通(n^2)+fft(nlogn)
高精度乘法核心為 ci=∑j=1iaj⋅bi−j+1 普通演算法時間複雜度為O(n2). 又由於是卷積形式,可用fft優化為O(nlogn) 普通版 #include<iostrea
查看Juniper SRX系列防火墻的系統相關限制(Policy策略最大數、NAT最大數等)
Juniper Juniper SRX 防火墻 Policy策略最大數 系統相關限制 查看Juniper SRX系列防火墻的系統相關限制(Policy策略最大數、NAT最大數等) 通過show log nsd_chk_only | no-more 可查看Juniper SRX系列防火墻的系
大數據入門之大數據處理流程
大數據開發 大數據挖掘 大數據分析 隨著互聯網的發展,大數據也在逐漸彰顯出自己的優勢特點,那麽關於大數據的處理流程,你是否了解?讓我們一起來看看大數據的處理流程。 第一,數據采集 定義:利用多種輕型數據庫來接收發自客戶端的數據,並且用戶可以通過這些數據庫來進行簡單的查詢和處理工作。 特點
新如何學習大數據技術?大數據怎麽入門?怎麽做大數據分析?
tex 展示 這才 無法 bec 離線 可選 預測分析 研究 由於大數據技術涉及內容太龐雜,大數據應用領域廣泛,而且各領域和方向采用的關鍵技術差異性也會較大,難以三言兩語說清楚,本文從數據科學和大數據關鍵技術體系角度,來說說大數據的核心技術什麽,到底要怎麽學習它,以及怎
大數據分析師和大數據工程師職位,孰輕孰重(個人角度)
媒體 表達 算法設計 分析工具 nor soft 靈活運用 -a 大數 在互聯網盛行的今天,能夠預測未來需要依靠更多數據支持,從數據的趨勢和分析中,就可以把未來的發展動向掌握得淋漓盡致。在大數據背景之下,精通大數據的專業人才將成為企業最重要的業務角色,大數據從業人員薪酬持續
大數據技術#1 大數據技術生態體系
conf 並行計算 展開 當前 你的選擇 mahout 海量數據 作者 cloud 什麽是大數據 ? 關於大數據麥肯錫全球研究所給出的定義是:一種規模大到在獲取、存儲、管理、分析方面大大超出了傳統數據庫軟件工具能力範圍的數據集合,具有海量的數據規模、快速的數據流轉、多樣的數
POJ 2389
Bull Math Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16175 Accepted: 8268 Description Bulls are so muc
【大數問題】C++大數問題模板
#define MAXN 9999 #define MAXSIZE 10 #define DLEN 4 class BigNum { private: int a[1500]; //可以控制大數的位數 int len; //大數長度 pu
強大數定律與弱大數定律的圖示詳解
程式碼來自:https://stats.stackexchange.com/questions/2230/convergence-in-probability-vs-almost-sure-convergence?noredirect=1&lq=1該連結中,下面是強大