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

 更新时间:2013年06月26日 15:22:33   作者:  
本篇文章是对打印菱形及斐波纳契数列的几种解法进行了详细的分析介绍,需要的朋友参考下
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);
}

运行结果:

相关文章

  • C++调用matlab函数的实例

    C++调用matlab函数的实例

    这篇文章主要介绍了C++调用matlab函数的方法,包括封装matlab函数,编译matlab函数及C++环境配置,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • C/C++ int数与多枚举值互转的实现

    C/C++ int数与多枚举值互转的实现

    在C/C++在C/C++的开发中经常会遇到各种数据类型互转的情况,本文主要介绍了C/C++ int数与多枚举值互转的实现,具有一定的参考价值,感兴趣的可以了解一下
    2021-08-08
  • 浅析bilateral filter双边滤波器的理解

    浅析bilateral filter双边滤波器的理解

    这篇文章主要介绍了bilateral filter双边滤波器的通俗理解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • C++前缀和与差分的使用示例讲解

    C++前缀和与差分的使用示例讲解

    前缀和是指某序列的前n项和,可以把它理解为数学上的数列的前n项和,而差分可以看成前缀和的逆运算。合理的使用前缀和与差分,可以将某些复杂的问题简单化。类似于数学中的求导和积分,差分可以看成前缀和的逆运算
    2023-03-03
  • C语言不使用strcpy函数如何实现字符串复制功能

    C语言不使用strcpy函数如何实现字符串复制功能

    这篇文章主要给大家介绍了关于C语言不使用strcpy函数如何实现字符串复制功能的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • C++实现基数排序的方法详解

    C++实现基数排序的方法详解

    本篇文章是对使用C++实现基数排序的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 深入浅析C/C++ 的条件编译

    深入浅析C/C++ 的条件编译

    条件编译是指预处理的时候根据条件编译的指令有条件的选择源程序中的一部分代码送给编译器进行编译,进行有选择性的操作,防止宏替换的内容重复包含,这篇文章主要介绍了C/C++ 的条件编译,需要的朋友可以参考下
    2022-04-04
  • C++实现基于时序公平的读写锁详解

    C++实现基于时序公平的读写锁详解

    读写锁与普通的互斥锁的区别在于有两种上锁方式:读锁和写锁,不用的用户对同一个读写锁获取读锁是非互斥的,其他情况则是互斥的,本文小编将给大家详细介绍C++实现基于时序公平的读写锁,需要的朋友可以参考下
    2023-10-10
  • C++虚继承的实现原理由内存布局开始讲起

    C++虚继承的实现原理由内存布局开始讲起

    为了解决多继承时的命名冲突和冗余数据问题,C++提出了虚继承,使得在派生类中只保留一份间接基类的成员,下面我们从内存布局看看虚继承的实现原理
    2022-06-06
  • C++11的新特性简单汇总介绍 (一)

    C++11的新特性简单汇总介绍 (一)

    本文将对C++11的以上新特性进行简单的讲解,以便大家能够快速了解到C++11对C++的易用性方面祈祷的巨大作用。
    2016-07-07

最新评论