C练习(三)

22 篇文章 0 订阅

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值