快速傅里叶转换 模版
来源:互联网 发布:九阴真经捏脸数据 编辑:程序博客网 时间:2024/06/04 01:05
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
const double PI = acos(-1.0);
//复数结构体
struct Complex
{
double x,y;//实部和虚部 x+yi
Complex(double _x = 0.0,double _y = 0.0)
{
x = _x;
y = _y;
}
Complex operator -(const Complex &b)const
{
return Complex(x-b.x,y-b.y);
}
Complex operator +(const Complex &b)const
{
return Complex(x+b.x,y+b.y);
}
Complex operator *(const Complex &b)const
{
return Complex(x*b.x-y*b.y,x*b.y+y*b.x);
}
};
class myfft
{
public:
Complex x1[100],x2[100];
Complex x[100];
int sum[100];
void fft(Complex p[],int len,int on)
{
Complex pcpy[100];
for(int width=2;width<=len;width*=2)
{
memcpy(pcpy,p,sizeof(pcpy));
Complex wn(cos(on*2*PI/width),sin(on*2*PI/width));
int jiange=len/width;
for(int i=0;i<jiange;i++)
{
Complex w(1,0);
int ap=i;
int bp=ap+jiange;
int cp=i;
int dp=i+width/2*jiange;
for(int j=0;j<width/2;j++)
{
p[cp]=pcpy[ap]+w*pcpy[bp];
p[dp]=pcpy[ap]-w*pcpy[bp];
w=w*wn;
ap+=2*jiange;
bp+=2*jiange;
cp+=jiange;
dp+=jiange;
}
}
}
}
void solve(int a,int b)
{
int len1=0;
int len2=0;
for(int i=0; i<100; i++)
x1[i].x=x1[i].y=x2[i].x=x2[i].y=0;
while(a)
{
x1[len1++].x=a%10;
a/=10;
}
while(b)
{
x2[len2++].x=b%10;
b/=10;
}
int len=1;
while(len<len1*2||len<len2*2)len*=2;
fft(x1,len,1);
fft(x2,len,1);
for(int i=0; i<len; i++)
x[i]=x1[i]*x2[i];
fft(x,len,-1);
for(int i=0; i<len; i++)
x[i].x=x[i].x/len;
for(int i=0; i<len; i++)
sum[i]=(int)(x[i].x+0.5);
for(int i=0; i<len; i++)
{
sum[i+1]+=sum[i]/10;
sum[i]=sum[i]%10;
}
int i;
for(i=len-1; i>=0; i--)
if(sum[i])
break;
for(; i>=0; i--)
printf("%d",sum[i]);
printf("\n");
}
};
myfft m;
int main()
{
int a,b;
scanf("%d%d",&a,&b);
m.solve(a,b);
return 0;
}
#include <string.h>
#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
const double PI = acos(-1.0);
//复数结构体
struct Complex
{
double x,y;//实部和虚部 x+yi
Complex(double _x = 0.0,double _y = 0.0)
{
x = _x;
y = _y;
}
Complex operator -(const Complex &b)const
{
return Complex(x-b.x,y-b.y);
}
Complex operator +(const Complex &b)const
{
return Complex(x+b.x,y+b.y);
}
Complex operator *(const Complex &b)const
{
return Complex(x*b.x-y*b.y,x*b.y+y*b.x);
}
};
class myfft
{
public:
Complex x1[100],x2[100];
Complex x[100];
int sum[100];
void fft(Complex p[],int len,int on)
{
Complex pcpy[100];
for(int width=2;width<=len;width*=2)
{
memcpy(pcpy,p,sizeof(pcpy));
Complex wn(cos(on*2*PI/width),sin(on*2*PI/width));
int jiange=len/width;
for(int i=0;i<jiange;i++)
{
Complex w(1,0);
int ap=i;
int bp=ap+jiange;
int cp=i;
int dp=i+width/2*jiange;
for(int j=0;j<width/2;j++)
{
p[cp]=pcpy[ap]+w*pcpy[bp];
p[dp]=pcpy[ap]-w*pcpy[bp];
w=w*wn;
ap+=2*jiange;
bp+=2*jiange;
cp+=jiange;
dp+=jiange;
}
}
}
}
void solve(int a,int b)
{
int len1=0;
int len2=0;
for(int i=0; i<100; i++)
x1[i].x=x1[i].y=x2[i].x=x2[i].y=0;
while(a)
{
x1[len1++].x=a%10;
a/=10;
}
while(b)
{
x2[len2++].x=b%10;
b/=10;
}
int len=1;
while(len<len1*2||len<len2*2)len*=2;
fft(x1,len,1);
fft(x2,len,1);
for(int i=0; i<len; i++)
x[i]=x1[i]*x2[i];
fft(x,len,-1);
for(int i=0; i<len; i++)
x[i].x=x[i].x/len;
for(int i=0; i<len; i++)
sum[i]=(int)(x[i].x+0.5);
for(int i=0; i<len; i++)
{
sum[i+1]+=sum[i]/10;
sum[i]=sum[i]%10;
}
int i;
for(i=len-1; i>=0; i--)
if(sum[i])
break;
for(; i>=0; i--)
printf("%d",sum[i]);
printf("\n");
}
};
myfft m;
int main()
{
int a,b;
scanf("%d%d",&a,&b);
m.solve(a,b);
return 0;
}
阅读全文
0 0
- 快速傅里叶转换 模版
- Lightinthebox模版快速修改
- 矩阵快速幂模版
- 模版快速排序
- EJS模版快速入门
- 快速幂 模版
- 快速排序模版
- POJ1995 快速幂模版
- 快速幂模版
- 快速幂模版
- 模版--矩阵快速幂
- {模版}快速排序
- 矩阵快速幂模版
- 快速幂 模版
- Express模版快速搭建
- 矩阵快速幂模版
- 矩阵快速幂 模版
- 矩阵快速幂模版
- 问题 : 点球大战
- 求图的割边(桥)(邻接矩阵 无向图)C~
- 关于list从属的关系
- 进程和线程的区别
- maven环境配置
- 快速傅里叶转换 模版
- 在Linux中怎样修改hostname(主机名)
- 【支付系统学习笔记】-支付系统整体架构
- 机房收费系统-上下机
- 问题 : Engine-字符串
- LA3983 Robotruck
- 号称精通Java的你,是否真的名副其实
- HTTP2 新特性
- 将博客搬至CSDN》的文章, 并将文章地址填写在上方的"搬家通知博文地址"中。