求N会计建账的详细过程程

博客分类:
用三种方法来实现n!实现使用BigDecimal类,因为用int最多正确算到12!,用long最多正确算到20!.实现方法都比较简单,但是转换为BigDecimal实现后可能看起来有点莫名其妙。废话不多说,直接上代码:
第一种方法:从1开始,一直递增乘到n,从而实现n!
import java.math.BigD
import java.util.S
public class Factorial1 {
public static BigDecimal factorial(int n){
BigDecimal result = new BigDecimal(1);
for(int i = 2; i &= i++){
a = new BigDecimal(i);//将i转换为BigDecimal类型
result = result.multiply(a);//不用result*a,因为BigDecimal类型没有定义*操作
public static void main(String[] arguments){
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();//读取控制台输入的整数
System.out.println(a + "!=" + factorial(a));
第二种方法:从n开始,一直递减乘到2,从而实现n!
import java.math.BigD
import java.util.S
public class Factorial3 {
public static BigDecimal factorial(BigDecimal n){
BigDecimal bd1 = new BigDecimal(1);//BigDecimal类型的1
BigDecimal bd2 = new BigDecimal(2);//BigDecimal类型的2
BigDecimal result = bd1;//结果集,初值取1
pareTo(bd1) & 0){//参数大于1,进入循环
result = result.multiply(n.multiply(n.subtract(bd1)));//实现result*(n*(n-1))
n = n.subtract(bd2);//n-2后继续
public static void main(String[] arguments){
Scanner sc = new Scanner(System.in);
BigDecimal
n = sc.nextBigDecimal();
System.out.print(n + "!=" + factorial(n));
第三种方法,用递归实现:f(n)=n*f(n-1),f(1)=1,递归相乘,从而实现n!
import java.util.S
import java.math.BigD
public class Factorial2 {
public static BigDecimal factorial(BigDecimal n){
BigDecimal bd1 = new BigDecimal(1);//1
if(n.equals(new BigDecimal(1))){
return bd1;
return n.multiply(factorial(n.subtract(bd1)));//n*f(n-1)
public static void main(String[] arguments){
Scanner sc = new Scanner(System.in);
BigDecimal a = sc.nextBigDecimal();
BigDecimal result = factorial(a);
System.out.println(a + "!=" +result);
浏览 43917
浏览: 63029 次
文章写的不错,但是感觉BigInteger还是有很多内容没有写 ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
实际上考虑到执行效率,如果对于每一次输入的数据都需要这个处理过程是非常浪费时间的。我们可以采用指向指针的指针来实现该过程,或者是采用指针数组来实现该过程。&
2.蝶形运算的循环结构。&从图4中我们可以看到对于点数为N = 2^L的fft运算,可以分解为L阶蝶形图级联,每一阶蝶形图内又分为M个蝶形组,每个蝶形组内包含K个蝶形。根据这一点我们就可以构造三阶循环来实现蝶形运算。编程过程需要注意旋转因子与蝶形阶数和蝶形分组内的蝶形个数存在关联。
&3.浮点到定点转换需要注意的关键问题
上边的分析都是基于浮点运算来得到的结论,事实上大多数嵌入式系统对浮点运算支持甚微,因此在嵌入式系统中进行离散傅里叶变换一般都应该采用定点方式。对于简单的DFT运算从浮点到定点显得非常容易。根据式(1),假设输入x(n)是经过AD采样的数字序列,AD位数为12位,则输入信号范围为0~4096。为了进行定点运算我们将旋转因子实部虚部同时扩大2^12倍,取整数部分代表旋转因子。之后,我们可以按照(1)式计算,得到的结果与原结果成比例关系,新的结果比原结果的2^12倍。但是,对于使用蝶形运算的fft我们不能采用这种简单的放大旋转因子转为整数计算的方式。因为fft是一个非对称迭代过程,假设我们对旋转因子进行了放大,根据蝶形流图我们可以发现其最终的结果是,不同的输入被放大了不同的倍数,对于第一个输入x(0)永远也不会放大。举一个更加形象的例子,还是以图4为例。从图中可以看出右侧的X(0)可以直接用下式表示:
从上式我们可以看到不同输入项所乘的旋转因子个数(注意这里是个数,就算是wn^0,也被考虑进去了,因为在没有放大时wn^0等于1,放大后所有旋转因子指数模均不为1,因此需要考虑)。这就导致输入不平衡,运算结果不正确。经查阅相关资料,比较妥善的做法是,首先对所有旋转因子都放大2^Q倍,Q必须要大于等于L,以保证不同旋转因子的差异化。旋转因子放大,为了保证其模为1,在每一次蝶形运算的乘积运算中我们需要将结果右移Q位来抵消这个放大,从而得到正确的结果。之所以采用放大倍数必须是2的整数次幂的原因也在于此,我们之后可以通过简单的右移位运算将之前的放大抵消,而右移位又代替了除法运算,大大节省了时间。
&& &&& 4.计算过程中的溢出问题
最后需要注意的一个问题就是计算过程中的溢出问题。在实际应用中,AD虽然有12位的位宽,但是采样得到的信号可能较小,例如可能在0~8之间波动,也就是说实际可能只有3位的情况。这种情况下为了在计算过程中不丢失信息,一般都需要先将输入数据左移P位进行放大处理,数据放大可能会导致溢出,从而使计算错误,而溢出的极限情况是这样:假设我们数据位宽为D位(不包括符号位),AD采样位数B位,数字放大倍数P位,旋转因此放大倍数Q位,FFT级联运算带来的最大累加倍数L位。我们得到:
假设AD位宽12,数据位宽32,符号位1位,因此有效位宽31位,采样点数N,那么我们可以得到log2(N)+P+Q&=19,假设点数128,又Q&=L可以得到放大倍数P&=5。
&& FFT代码示例
根据以上的分析,我整理了一份128点的FFT代码如下,该代码在keil中仿真运行,未发现问题。
128 #define POWER
6//该值代表了输入数据首先被放大的倍数,放大倍数为2^POWER #define P_COEF
8//该值代表了旋转因子被放大的倍数,放大倍数为2^POWER #if (N == 4) #define L
2//L的定义满足L = log2(N) #elif (N == 8) #define L
3//L的定义满足L = log2(N) #elif (N == 16) #define L
4//L的定义满足L = log2(N) #elif (N == 32) #define L
5//L的定义满足L = log2(N) #elif (N == 64) #define L
6//L的定义满足L = log2(N) #elif (N == 128) #define L
7//L的定义满足L = log2(N) #endif
//AD采样位数为12位,本可以采用s16 x[N]定义数据空间,但是为了节省存储空间,fft结果也将存储在该变量空间。由于受 //fft影响变量需要重新定义,定义的方式及具体原因如下: //fft过程会乘以较大旋转因子,因此需要32位定义 //fft过程会产生负数,因此需要有符号定义 //fft过程会出现复数,因此需要定义二维数组,[][0]存放实部,[][1]存放虚部 s32 x[N][2] = {};
//定义*p[N]是为了在第一次指针初始化以后,该数组指针按照位倒序指向数据变量x //p[i][0]代表了指向数据的实部,p[i][1]代表了指向数据的虚部 s32 *p[N];
//定义旋转因子矩阵 //旋转因子矩阵存储了wn^0,wn^1,wn^2...wn^(N/2-1)这N/2个复数旋转因子
s16 w[N&&1][2] = {256,0,256,-13,255,-25,253,-38,251,-50,248,-62,245,-74,241,-86,237,-98,231,-109,226,&&&&&&&&&&&&&&&&& -121,220,-132,213,-142,206,-152,198,-162,190,-172,181,-181,172,-190,162,-198,152,&&&&&&&&&&&&&&&&& -206,142,-213,132,-220,121,-226,109,-231,98,-237,86,-241,74,-245,62,-248,50,-251,38,&&&&&&&&&&&&&&&&& -253,25,-255,13,-256,0,-256,-13,-256,-25,-255,-38,-253,-50,-251,-62,-248,-74,-245,-86,&&&&&&&&&&&&&&&&& -241,-98,-237,-109,-231,-121,-226,-132,-220,-142,-213,-152,-206,-162,-198,-172,-190,-181,&&&&&&&&&&&&&&&&& -181,-190,-172,-198,-162,-206,-152,-213,-142,-220,-132,-226,-121,-231,-109,-237,-98,-241,&&&&&&&&&&&&&&&&& -86,-245,-74,-248,-62,-251,-50,-253,-38,-255,-25,-256,-13};
void init_pointer(void) {
unsigned char i = 0;
unsigned char j = 0;
unsigned char k = 0;
for(i = 0; i & N; i++)
for(k = 0; k & L; k++)
j |= (((i && k)&0x01)&&(L-k-1));
p[i] = &x[j][0];
/* *description:基2fft主函数,该函数将借助指针数组p对全局变量数组x进行fft计算 *
并将结果存储在数组x中 *global var:rw-&x; r-&p,w。(r表示读,w表示写,rw表示读写) */ void fft2(void) {
u8//i用于表示蝶形图级联的阶数
u8//表示蝶形分组起始点序列,蝶形分组跨度为2^i
u8//k表示蝶形组内偶数分支序列点号
u8 gp_distance = 1;//蝶形分组跨度
u8//temp用于记录当前组间距离的一半,同时也表示了同一碟形两分支间的距离
u8 gp_hf = 0;//记录当前组的中间点序号
u8 delta = N;//旋转因子下标增量,本来下标初始值应该为N/2,但是。。
s16 *pw = &(w[0][0]);
int tp_result[2];
//用于临时存放旋转因子和奇数分组的乘积
//输入信号序列放大
for(i = 0; i & N; i++)
x[i][0] &&= POWER;
x[i][1] &&= POWER;
for(i = 0; i & L; i++)
temp = gp_
gp_distance &&= 1;
for(j = 0; j & N; j+=gp_distance)
gp_hf = temp +
pw = &(w[0][0]);
for(k = k & gp_ k++)//完成一组内的所有蝶形运算
//蝶形运算中的一组复数乘法过程
tp_result[0] = pw[0] * (p[k+temp][0]) - pw[1] * (p[k+temp][1]);
tp_result[1] = pw[0] * (p[k+temp][1]) + pw[1] * (p[k+temp][0]);
tp_result[0] &&= P_COEF;
tp_result[1] &&= P_COEF;
//蝶形运算中的2组复数加法过程
p[k+temp][0] = p[k][0] - tp_result[0];
p[k+temp][1] = p[k][1] - tp_result[1];
p[k][0] += tp_result[0];
p[k][1] += tp_result[1];
delta &&= 1;
阅读(95641)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_082066',
blogTitle:'FFT原理与实现',
blogAbstract:'在数字信号处理中常常需要用到离散傅立叶变换(DFT),以获取信号的频域特征。尽管传统的DFT算法能够获取信号频域特征,但是算法计算量大,耗时长,不利于计算机实时对信号进行处理。因此至DFT被发现以来,在很长的一段时间内都不能被应用到实际的工程项目中,直到一种快速的离散傅立叶计算方法——FFT,被发现,离散是傅立叶变换才在实际的工程中得到广泛应用。需要强调的是,FFT并不是一种新的频域特征获取方式,而是DFT的一种快速实现算法。本文就FFT的原理以及具体实现过程进行详尽讲解。',
blogTag:'fft,dft',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:3,
publishTime:3,
permalink:'blog/static/',
commentCount:22,
mainCommentCount:15,
recommendCount:16,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}数列求前n项和的基本方法和技巧_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
数列求前n项和的基本方法和技巧
&&高中数列求前n项和基本方法及一些基础训练题
阅读已结束,下载文档到电脑
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩3页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢随机过程课后习题_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
随机过程课后习题
&&随机过程
阅读已结束,下载文档到电脑
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩14页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢}

我要回帖

更多关于 莫斯树的详细制作过程 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信