HDU 1131 Count the Trees 大数计算
题目是说给出一个数字,然后以1到这个数为序号当做二叉树的结点,问总共有几种组成二叉树的方式。这个题就是用卡特兰数算出个数,然后因为有编号,不同的编号对应不同的方式,所以结果是卡特兰数乘这个数的阶乘种方案。因为数字比较大,所以要用高精度的方法也就是用字符数组来做,我分别写了三个函数,一个算加法,一个算乘法,最后一个打表,等打出表来最后只要判断一下输入的数是第几个,直接输出就行了,下面是我的代码,第一次写高精度的这种大数处理,可能看上去比较繁琐= =
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char ans[][];
char ads[],mus[];
char jc[][];
char res[][]; int multiply(char* a1,char* b1)
{
memset(mus,,sizeof(mus));
int i,j,k;
int len,len1,len2;
len1=strlen(a1);
len2=strlen(b1);
int mut=,t;
bool va[];
int s[],adt[];
char a[],b[];
memset(s,,sizeof(s));
memset(adt,,sizeof(adt));
memset(va,,sizeof(va));
for(i=len1-,j=;i>=;i--)
{
a[i]=a1[j];
j++;
}
for(i=len2-,j=;i>=;i--)
{
b[i]=b1[j];
j++;
}
for(i=;i<len1;i++)
{
mut=;
for(j=;j<len2;j++)
{
t=(a[i]-'')*(b[j]-'')+mut;
mut=;
if(t>=)
{
mut=t/;
t=t%;
}
s[i+j]=t+s[i+j]+adt[i+j];
va[i+j]=;
adt[i+j]=;
if(s[i+j]>=)
{
if(!va[i+j+])
adt[i+j+]=s[i+j]/+adt[i+j+];
else
adt[i+j+]=s[i+j]/;
s[i+j]=s[i+j]%;
}
}
s[i+j]=mut;
}
s[i+j-]=mut+adt[i+j-];
if(s[i+j-]!=)
k=i+j-;
else
k=i+j-;
for(i=k,j=;i>=;i--)
{
mus[i]=(s[j]+'');
j++;
}
return ;
} int additive(char* a,char* b)
{
memset(ads,,sizeof(ads));
int len,len1,len2;
int i;
int ad[];
len1=strlen(a);
len2=strlen(b);
if(len1==len2)
{
len=len1;
}
else if(len1>len2)
{
len=len1;
for(i=len;i>=len-len2;i--)
{
b[i]=b[i-len+len2];
}
for(i=len-len2-;i>=;i--)
{
b[i]='';
}
}
else if(len1<len2)
{
len=len2;
for(i=len;i>=len-len1;i--)
{
a[i]=a[i-len+len1];
}
for(i=len-len1-;i>=;i--)
{
a[i]='';
}
}
int t=;
for(i=len-;i>=;i--)
{
ad[i]=(a[i]-'')+(b[i]-'')+t;
t=;
if(ad[i]>=)
{
t++;
ad[i]=ad[i]-;
ads[i]=ad[i]+'';
}
else
{
ads[i]=ad[i]+'';
}
}
if(t==)
{
for(i=len;i>=;i--)
{
ads[i]=ads[i-];
}
ads[]='';
}
return ;
} int excel()
{
ans[][]='';
ans[][]='';
char sum[];
int n;
int i,j;
char t[];
memset(sum,,sizeof(sum));
for(i=;i<=;i++)
{
for(j=i;j>;j--)
{
multiply(ans[i-j],ans[j-]);
additive(mus,sum);
strcpy(sum,ads);
}
strcpy(ans[i],sum);
memset(sum,,sizeof(sum));
}
jc[][]='';
for(i=;i<;i++)
{
memset(t,,sizeof(t));
if(i>=)
{
t[]=i/+'';
t[]=i%+'';
}
else
{
t[]=i+'';
}
multiply(jc[i-],t);
strcpy(jc[i],mus);
}
multiply(jc[],"");
strcpy(jc[],mus);
for(i=;i<=;i++)
{
multiply(ans[i],jc[i]);
strcpy(res[i],mus);
//cout<<"res["<<i<<"]="<<res[i]<<endl;
}
return ;
} int main()
{
int n;
excel();
while(scanf("%d",&n)!=EOF)
{
if(n==)
break;
cout<<res[n]<<endl;
}
return ;
}
HDU 1131 Count the Trees 大数计算的更多相关文章
- Uva 10007 / HDU 1131 - Count the Trees (卡特兰数)
Count the Trees Another common social inability is known as ACM (Abnormally Compulsive Meditation) ...
- HDU 1131 Count the Trees
卡特兰数再乘上n的阶乘 #include<iostream> #include<cstdio> using namespace std; #define base 10000 ...
- hdu 1130,hdu 1131(卡特兰数,大数)
How Many Trees? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- zjuoj 3602 Count the Trees
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3602 Count the Trees Time Limit: 2 Seco ...
- Count the Trees[HDU1131]
Count the Trees Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- hdu 1023 卡特兰数《 大数》java
Train Problem II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- js 大数计算
js 大数计算 原理 JavaScript 安全整数 是 -253-1 ~ 253-1 ,即: -9007199254740991 ~ 9007199254740991; 换句话说,整数超过这个范围就 ...
- HDU 4588 Count The Carries 计算二进制进位总数
点击打开链接 Count The Carries Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65535/32768 K (Java ...
- HDU 1042 大数计算
这道题一开始就采用将一万个解的表打好的话,虽然时间效率比较高,但是内存占用太大,就MLE 这里写好大数后,每次输入一个n,然后再老老实实一个个求阶层就好 java代码: /** * @(#)Main. ...
随机推荐
- Atitit rgb yuv hsv HSL 模式和 HSV(HSB) 图像色彩空间的区别
Atitit rgb yuv hsv HSL 模式和 HSV(HSB) 图像色彩空间的区别 1.1. 色彩的三要素 -- 色相.明度.纯度1 1.2. YUV三个字母中,其中"Y&quo ...
- Atitit 图像处理 灰度图片 灰度化的原理与实现
Atitit 图像处理 灰度图片 灰度化的原理与实现 24位彩色图与8位灰度图 首先要先介绍一下24位彩色图像,在一个24位彩色图像中,每个像素由三个字节表示,通常表示为RGB.通常,许多24位彩色图 ...
- PHP 环境塔建
快速搭建环境可用软件 每种语言的第一步都是要先搭建环境 WAMP(windows系统下搭建php开发环境): APPSERVER L(Linux)A(Apache)M(Mysql)P(Php)架构 P ...
- iOS-SDWebImage
我之前写过一篇博客,介绍缓存处理的三种方式,其中最难,最麻烦,最占内存资源的还是图片缓存,最近做的项目有大量的图片处理,还是采用了SDWebImage来处理,但是发现之前封装好的代码报错了.研究发现, ...
- Leetcode 69 Sqrt(x) 二分查找(二分答案)
可怕的同时考数值溢出和二分的酱油题之一,常在各种小公司的笔试中充当大题来给你好看... 题意很简单,在<二分查找综述>中有描述. 重点:使用简单粗暴的long long来避免溢出,二分均方 ...
- SQL Server的小数数值类型(float 和 decimal)用法
在SQL Server中,小数数值实际上只有两种数据类型:float 和 decimal.double precision 整体是数据类型,等价于 float(53),real等价于float(24) ...
- CSS中模拟父元素选择器
很多情况下,我们需要找到父元素,但可惜的是css中并没有这样的一个选择器. 至于原因可以看张鑫旭的如何在CSS中实现父选择器效果这篇文章. 简单来说这个实现并不是真正的父元素选择器,只是利用其它思路来 ...
- ZZUOJ1196: 单调数
/* 注意的事项:是输出小于 10^n的正整数的个数哦!开始的时候总比样例输出多一个数, 纠结了好久,原来是 0加了进去了! dpI[n][m]表示的是第n位添加数字m(0....9)的构成单调递增数 ...
- Spring MVC 学习总结(二)——控制器定义与@RequestMapping详解
一.控制器定义 控制器提供访问应用程序的行为,通常通过服务接口定义或注解定义两种方法实现. 控制器解析用户的请求并将其转换为一个模型.在Spring MVC中一个控制器可以包含多个Action(动作. ...
- Quartz应用实践入门案例一(基于Web环境)
Quartz是一个完全由java编写的开源作业调度框架,正是因为这个框架整合了许多额外的功能,所以在使用上就显得相当容易.只是需要简单的配置一下就能轻松的使用任务调度了.在Quartz中,真正执行的j ...