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);
}
}
递归实现斐波纳契数列,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)(重复运算,算法复杂度高)
2. 题目标题: 高斯日记
大数学家高斯有个好习惯:无论如何都要记日记。
他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?
高斯出生于:1777年4月30日。
在高斯发现的一个重要定理的日记上标注着:5343,因此可算出那天是:1791年12月15日。
高斯获得博士学位的那天日记上标着: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; }
我感觉与日期相关的问题,基本可以建立一个二维数组,存放平闰年的每个月的天数,以此简化一些复杂日期计算问题。并且需要熟记平闰年判断函数,很重要。
- C练习(三)
- linux c 多线程编程练习(三)
- C语言练习作业(三)
- C初级阶段练习题目(三)
- C语言基础练习(三)
- 练习三 Problem C
- c 练习三
- C/C++专项练习 (三)
- C语言程序练习三
- C语言编程(练习1:循环,三大循环结构 )
- C语言编程(练习2:循环,三大循环结构 )
- C语言编程(练习4:循环,三大循环结构 )
- C语言编程(练习3:循环,三大循环结构 )
- C语言编程(练习5:循环,三大循环结构 )
- C语言编程(练习6:循环,三大循环结构 )
- C语言编程(练习7:循环,三大循环结构 )
- C语言双链表框架搭建练习(三)
- 查询练习(三)
- Ubuntu16.04清理boot分区
- App性能优化
- Unity教程——Simplex噪声
- 创建一个线程
- java计算目录及文件个数,文件夹大小
- C练习(三)
- python定时任务windows服务
- Chapter 1 用Vim配置Python IDE
- MyEclipse10安装PropertiesEditor的插件
- HITS算法
- leetcode_[python/C++逐步深入] 43. Multiply Strings_(大数乘法分析)
- 二叉寻找数的实现
- WebView详解与简单实现Android与H5互调
- leetcode 412. Fizz Buzz