C练习(三)

来源:互联网 发布:linux nfs配置 编辑:程序博客网 时间:2024/05/17 00:55

C练习

 

1.实现Fibonacci数列算法

unsigned longFib(int n)

{

    if (n <= 1) {

        return n;

    } else {

        return F(n - 1) + F(n - 2);

    }

}

递归实现斐波纳契数列,F1=1Fn=F(n-1)+F(n-2)n≥2nN*)(重复运算,算法复杂度高)

 

2. 题目标题: 高斯日记

    大数学家高斯有个好习惯:无论如何都要记日记。

    他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?

高斯出生于:1777430日。

    在高斯发现的一个重要定理的日记上标注着:5343,因此可算出那天是:17911215日。

高斯获得博士学位的那天日记上标着:8113  

    请你算出高斯获得博士学位的年月日。

提交答案的格式是:yyyy-mm-dd,例如:1980-03-21


#include <stdio.h>#include <stdlib.h>int a[2][12] = {{31,28,31,30,31,30,31,31,30,31,30,31},               {31,29,31,30,31,30,31,31,30,31,30,31}};int b[2] = {365,366};/*判断平年闰年函数*/int judge_run_year(int year){    if((year % 400 == 0) || (year % 4 == 0) && (year % 100 != 0))    {         return 1;    }    else    {        return 0;    }}/*输出格式控制函数*/void prin(int year,int month, int day){    printf("%d-",year);    if(month < 10)    {        printf("0%d-",month);    }    else    {        printf("%d",month);    }    if(day < 10)    {        printf("0%d-",day);    }    else    {        printf("%d",day);    }}int main(){    int year = 1777;    int month = 4;    int day = 30;    int src = 8113;    int num = 1;    /*将1777年的剩余天数减去*/    while(++month <= 12)    {        num += a[0][month - 1];    }    /*找出对应的年份*/    while((num += b[judge_run_year(++year)]) <= src);    num -= b[judge_run_year(year)];    month = 0;    day = 0;    /*找到对应的月份*/    while((num += a[judge_run_year(year)][++month]) <= src);    num -= a[judge_run_year(year)][month];    day = src - num;    prin(year,month,day);    return 0;}

题目分析:

有两个基本的思路,第一个思路常规的想法,按照顺序,从出生那天开始一直找到标记的那一天(题目中给出的是8113),然后输出那一天的日期;

一个思路是逆向思维,从标记的那一天开始,不断减去经历过的年头,然后当减去的结果为0时,就是要输出的日期。

上述程序是用的思路一

 

下面的C++程序使用思路二

#include <stdio.h>  #include <iostream>  #include <string.h>  #include <algorithm>  #include <math.h>  using namespace std;    int a[20] = {0,31,28,31,30,31,30,31,31,30,31,30,31};    int leap(int y)  {      if(y%400 == 0 || (y%4==0 && y%100!=0))      return 1;      return 0;  }    int main()  {      int y,m,d;      const int Y = 1777,M = 4,D = 30;      int day=8113;      for(m = 5;m<=12;m++)      day-=a[m];      y = Y+1;      while(day>365)      {                if(leap(y))                day-=366;                else                day-=365;                y++;          }      if(leap(y))      a[2]++;      for(m = 1;m<=12;m++)      {            if(day<a[m])            break;            day-=a[m];      }      cout << y << "-" << m << "-" << day-1 << endl;            system("pause");      return 0;  }

我感觉与日期相关的问题,基本可以建立一个二维数组,存放平闰年的每个月的天数,以此简化一些复杂日期计算问题。并且需要熟记平闰年判断函数,很重要。




0 0
原创粉丝点击