打印菱形以及斐波纳契数列的几种解法介绍_C 语言

1、编写程序,打印*菱形
推出第i行要打印的空白个数及*号个数,用for循环依次打印各行

复制代码 代码如下:

#include<stdio.h>
//总共要打印2*n-1行,逐行打印
void print1(int n)
{
 int i,j;
 for(i=1;i<=n;i++){//打印1至n行
  for(j=1;j<=n-i;j++)//打印n-i个空格
      printf(" ");
  for(j=1;j<=2*i-1;j++)//打印2*i-1个*号
   printf("*");
     printf("\n");
 }
    for(;i<2*n;i++){//打印n+1至2*n-1行,同(2*n-i)行
  for(j=1;j<=n-(2*n-i);j++)
      printf(" ");
  for(j=1;j<=2*(2*n-i)-1;j++)
   printf("*");
     printf("\n");
 }
}
void main()
{
 int n;//n是菱形边上*号的个数
 printf("enter n:");
 scanf("%d",&n);
 print1(n);
}

2、斐波纳契数列(Fibonacci Sequence),又称黄金分割数列,指的是这样一个数列:
1、1、2、3、5、8、13、21、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n>=2,n∈N*).编写程序,输出F(20)的值。

这里给出四种不同的解法,注意递归和改进的递归效率上有很大区别。

复制代码 代码如下:

#include<stdio.h>
#include<math.h>
#include<time.h>
#define MAX 100
//递归
int f1(int n)
{
 if(n==1 || n==0)
  return 1;
 return f1(n-1)+f1(n-2);
}
//改进版的递归,去除重复计算
int f2(int n)
{
 //保存中间结果的数组
 static result[MAX]={1,1};
 if(n==1 || n==0)
  return 1;
    if(result[n-1] == 0)
  result[n-1]=f2(n-1);
 if(result[n-2] == 0)
  result[n-2]=f2(n-2);
 return result[n-1]+result[n-2];
}
//用数组保存中间结果(来自陈孝杰)
int f3(int n)
{
    int a[MAX],i;
 a[1]=1;
 a[0]=1;
 for(i=2;i<=n;i++)
  a[i]=a[i-1]+a[i-2];
 return a[n];
}
//迭代
int f4(int n)
{
    int i=2,a=1,b=1,sum=1;
 while(i<=n){
       sum=a+b;
    a=b;
    b=sum;
    i++;
 }
 return sum;
}
void main()
{
 long start,end;
 start=clock();
 printf("f(40)==%d\n",f1(40));
 end=clock();
    printf("用时:%d ms\n",end-start);
 start=clock();
 printf("f(40)==%d\n",f2(40));
 end=clock();
    printf("用时:%d ms\n",end-start);
 start=clock();
 printf("f(20)==%d\n",f3(20));
 end=clock();
    printf("用时:%d ms\n",end-start);
 start=clock();
 printf("f(20)==%d\n",f4(20));
 end=clock();
    printf("用时:%d ms\n",end-start);
}

运行结果:

时间: 2024-10-27 00:37:50

打印菱形以及斐波纳契数列的几种解法介绍_C 语言的相关文章

打印菱形以及斐波纳契数列的几种解法介绍

1.编写程序,打印*菱形推出第i行要打印的空白个数及*号个数,用for循环依次打印各行 复制代码 代码如下: #include<stdio.h> //总共要打印2*n-1行,逐行打印 void print1(int n) { int i,j; for(i=1;i<=n;i++){//打印1至n行 for(j=1;j<=n-i;j++)//打印n-i个空格 printf(" "); for(j=1;j<=2*i-1;j++)//打印2*i-1个*号 prin

C++输出斐波那契数列的两种实现方法_C 语言

定义: 斐波那契数列指的是这样一个数列:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...这个数列从第三项开始,每一项都等于前两项之和. 以输出斐波那契数列的前20项为例: 方法一:比较标准的做法,是借助第三个变量实现的. 复制代码 代码如下: #include<iostream>  using namespace std;int main(){    int f1=0,f2=1,t,n=1;    cout<<"数列第1个

C语言求Fibonacci斐波那契数列通项问题的解法总结_C 语言

一:递归实现  使用公式f[n]=f[n-1]+f[n-2],依次递归计算,递归结束条件是f[1]=1,f[2]=1. 二:数组实现  空间复杂度和时间复杂度都是0(n),效率一般,比递归来得快. 三:vector<int>实现  时间复杂度是0(n),时间复杂度是0(1),就是不知道vector的效率高不高,当然vector有自己的属性会占用资源. 四:queue<int>实现  当然队列比数组更适合实现斐波那契数列,时间复杂度和空间复杂度和vector<int>一样

用PHP迭代器来实现一个斐波纳契数列

斐波纳契数列通常做法是用递归实现,当然还有其它的方法.这里现学现卖,用PHP的迭代器来实现一个斐波纳契数列,几乎没有什么难度,只是把类里的next()方法重写了一次.注释已经写到代码中,也是相当好理解的. <?php /* *@author nicesunboy@gmail.com */ class Fibonacci implements Iterator { private $previous = 1; private $current = 0; private $key = 0; publ

java实现斐波那契数列的3种方法_java

先说说为什么写这个吧,这个完全是由去阿里巴巴面试引起的一次惨目忍睹的血案.去面试的时候,由于面试前天晚上11点钟才到阿里巴巴指定面试城市,找到旅馆住下基本都1点多,加上晚上完全没有睡好,直接导致第二天面试效果很不好(对于那些正在找工作的大虾们不要向小虾一下悲剧,提前做好准备还是很重要滴),面试大概进行了一个多小时(面试结束回去的时候基本走路都快睡着了,悲催!!),面试快结束的时候面试官问的我问题就是关于费波那西数列,当时头脑完全浆糊,只知道要设置三个变量或者用List先初始化,当写到for循环的

PHP迭代器实现斐波纳契数列的函数_php实例

复制代码 代码如下: class Fibonacci implements Iterator {     private $previous = 1;     private $current = 0;     private $key = 0;     public function current() {         return $this->current;     }     public function key() {         return $this->key;  

输出斐波那契数列的算法

斐波那契数列(Fibonacci polynomial),又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.-- 要求编程输出这样的一组数,比如输出10个数的序列 /** * @param i 第n个数 * @param j 第n+1个数 * @param n 输出个数 */ public static void ff( int i,int j,int n){ int m=1; System.out.print(i+","); while(m++<n)

斐波那契数列和反向计算问题

反向计算:编写一个函数将一个整型转换为二进制形式 反向计算问题,递归比循环更简单 分析:需要理解,奇数的二进制最后一位是1,偶数的二进制最后一位一定是0,联想记忆,这个和整型的奇偶性是一致的,1本身就是奇数,0本身是偶数.     十进制整数转换为二进制整数采用"除2取余,逆序排列"法. 具体做法是:用2整除十进制整数,可以得到一个商和余数,再用2去除商,又会得到一个商和余数,如此进行,直到商为0时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,

斐波那契数列-有一对兔子

/************************************************************************************************  题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,*  小兔子长到第三后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? *  1.程序分析: 兔子(对)的规律为数列1,1,2,3,5,8,13,21....* @param args* [斐波那契数列]*********