帕斯卡三角形(杨辉三角形)
问题: 形成一个杨辉三角
输入:n —-杨辉三角的高度
输出:杨辉三角
解法:
/**
* 下一层是上一层计算得到的,所以我们每次要保存上一层的数据
*
**/
void print(int n){
int *b = NULL;//声明一个变量来保存上一层的数据
for(int i = 1; i <= n; i++){//分别处理每一层
if(b==NULL){//第一层特殊处理
b = (int *)malloc(1);
b[0] = 1;
continue;
}else{//其他层处理
int *a = NULL;
for(int j = 0; j < i; j++){//分别处理每一层的每一个数据,保存到数组a
a = (int *)malloc(i);//创建数组,当前这一层的数据,为打印用。
if(j == 0 || j == i - 1){
a[j] = 1;
continue;
}
a[j] = b[j-1] + b[j];
}
//拷贝a数组的数据到b数组,为下次计算做准备
b = (int *)malloc(i);
for(int m = 0; m < i; m++){
b[m] = a[m];
}
//打印该层数据
int n = i;
while(n--){//打印开始的空格
printf(" ");
}
for(int k = 0; k < i; k++){
printf(" %d ", a[k]);
}
}
}
}
费式数列(Fibonacci)
问题:1,1,2,3,5,8,13… ()
输入:n
输出:f(n)
解法:
/**
*
* 计算数列第n项
**/
int fun(int n){
if(n == 1) return 1;
if(n == 2) return 1;
return fun(n-1) + f(n-2);
}
河内之塔(汉诺塔)
问题:三根柱子,首先在第一个柱子上有一碟盘子,这些盘子满足小盘子在上,大盘子在下。要求将所有盘子从柱子1移动到柱子3,并且移动过程中遵守大盘子在小盘子之下的原则。
输入:盘子数目
输出:盘子移动路径
//C语言实现
/**
* @Author h&m
* @Date 2014/1/29
* @Param n 盘子数
* @Param a 柱子编号
* @Param b 柱子编号
* @Param c 柱子编号
**/
//盘子从上到下默认编号为1,2,3...
//如果是1个盘子 直接A->C
//如果是2个或者更多盘子 盘子分为两个部分,第一个部分为除去底层的那个盘子剩下的所有,底层的盘子为第二部分。先把第二部分都移到柱子B,再把第一部分移动到柱子C。
void hannuota(int n, char a, char b, char c){
if(n == 1) printf("移动盘子%d,从%c移动到%c\n",1,a,c);
else{
hannhuota(n-1,a,c,b);
printf("移动盘子%d,从%c移动到%c\n",n,a,c);
hannuota(n-1,b,a,c);
}
}