版权声明:本文由 Micheal 超 博客 创作,转载请附带链接,有问题欢迎交流。 https://blog.csdn.net/qq_42887760/article/details/84504286
题目(总):
解答(答案为博主自已所写,并非最优代码,仅供参考)
第一题
- 题目
求斐波那契数列前20项
- 参考代码(答案并非最优代码,仅供参考)
#include<stdio.h>
#include<stdlib.h>
int func(int n);
int main(){
int sum=0;
FILE *fp;
if((fp=fopen("fab.txt","w"))==NULL){
printf("不能打开此文件");
exit(0);//需要头文件#include<stdlib.h>
}
for(int i=1;i<=20;i++){
sum+=func(i);
fprintf(fp,"%5d",func(i));
if(i%5==0)//每5个元素,输出一个回车(以下4种方法都可以)
//fputc('\n',fp);//相对于putchar()函数
//fputc(10,fp);//相对于putchar()函数;'\n'的ASCII码值为10
//fprintf(fp,"\n");//相对于printf()函数
fputs("\n",fp);//相对于puts()函数
}
printf("斐波那契数列的前20项之和为%d\n",sum);
fclose(fp);//关闭输出文件
return 0;
}
int func(int n){
if(n==1||n==2)
return 1;
else if(n>2)
return func(n-1)+func(n-2);
else{}
}
- 代码说明
关于斐波那契数列的求解方法有很多种,本题由于题目限定,只能用递归函数实现,否则还可以用其他方式实现斐波那契数列问题。例如推荐文章中的方法。
推荐参考:
- 运行结果
第二题
- 题目
辆卡车违反了 交通规则,撞人后逃逸。现场有三人目击该事件,但都没有记住车号,只记住车号的一些特征。甲说:车号的前两位数字是相同的;乙说:车号的后两位数字是相同的,但与前两位不同;丙是位数学家,他说:4位的车号正好是一个整数的平方。请根据以上线索编程协助警方找出车号,以便尽快破案,抓住交通肇事犯。
- 参考代码(答案并非最优代码,仅供参考)
#include<stdio.h>
#include<math.h>
int func(int a);
int main(){
int i,j;
int result,t;//int型能表示 -32768~32767 之间的整数
for(i=0;i<10;i++){
for(j=0;j<10;j++){
result=i*1000+i*100+j*10+j;
t=func(result);//函数返回开方后的数据
if(t)
printf("%d= %d*%d \n",result,t,t);
}
}
return 0;
}
int func(int a){
double temp=a;
if(sqrt(temp)==floor(sqrt(temp)))//开方取整=开方
return sqrt(temp);
else
return 0;
}
- 代码说明
该程序在判断一个数是否是某个数的平方时,采用的是判断 “ 开方取整=开方 ” 的方法:下面介绍几个函数(包含在#include<math.h>头文件中)
double sqrt(double x):计算 (使用时确保 x ≥0 )
double floor(double x):计算不大于x的最大整数(如:floor(5.0)=5.0; floor(5.1)=5.0; floor(5.9)=5.0);
另外,程序的解题方法有很多,也为读者推荐几个其他解法。
推荐参考:
- 运行结果
第三题
- 题目
输入一个日期:startdate(年月日)和天数(days>=1),输出字该输入日期days天的日期enddate(即enddate=startdate+days)要求输入和输出的年份为四位整数,并确保得到有效的输入数据。同时需要考虑跨年和闰年等情况,闰年用自定义函数计算,日期自定义结构体描述。
- 参考代码(答案并非最优代码,仅供参考)
#include<stdio.h>
#include<math.h>
bool isLeapyear(int year);
bool isRight(int year,int month,int day);
int getday(int year,int month);
struct date{
int year;
int month;
int day;
};
int main(){
struct date startdate,enddate;
int days;
do{
printf("请输入一个日期:");
scanf("%d %d %d",&startdate.year,&startdate.month,&startdate.day);
}while(!isRight(startdate.year,startdate.month,startdate.day));
printf("请输入days:");
scanf("%d",&days);
enddate.year=startdate.year;
enddate.month=startdate.month;
enddate.day=startdate.day+days;
while(!isRight(enddate.year,enddate.month,enddate.day)){
enddate.day=abs(enddate.day-getday(enddate.year,enddate.month));//最后一次必定是负数,故取绝对值
enddate.month++;
if(enddate.month>12){
enddate.year++;
enddate.month=1;
}
}
printf("(year-month-day):%d-%d-%d\n",enddate.year,enddate.month,enddate.day);
return 0;
}
int getday(int year,int month){//根据年份、月份,返回天数
switch(month){
case 1:case 3:case 5:case 7:case 8:case 10:case 12:
return 31;
break;
case 4:case 6:case 9:case 11:
return 30;
break;
case 2:
if(isLeapyear(year))
return 29;
else
return 28;
break;
default:
return 0;
break;
}
}
bool isRight(int year,int month,int day){//判断日期的合法性函数
bool flag=false;
if(year>=1000 && year<9999){//判断年份
if(month>=1 && month<=12){//判断月份
switch(month){//根据月份判断日期正确性
case 1:case 3:case 5:case 7:case 8:case 10:case 12:
if(day>=1 && day<=31)
flag=true;
break;
case 4:case 6:case 9:case 11:
if(day>=1 && day<=30)
flag=true;
break;
case 2:
if(isLeapyear(year))
if(day>=1 && day<=29)
flag=true;
else{}
else
if(day>=1 && day<=28)
flag=true;
else{}
break;
}//结束switch()
}
}
return flag;
}
bool isLeapyear(int year){
return year%400==0||year%4==0&&year%100!=0;
}
- 代码说明
其中:对于 getday(int year,int month) 函数 还可以采用如下写法;
int getday(int year,int month){//根据年份、月份,返回天数
int month_day[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int leapyear_month_day[12]={31,29,31,30,31,30,31,31,30,31,30,31};
if(isLeapyear(year))
return leapyear_month_day[month-1];
else
return month_day[month-1];
}
/*
int getday(int year,int month){//根据年份、月份,返回天数
switch(month){
case 1:case 3:case 5:case 7:case 8:case 10:case 12:
return 31;
break;
case 4:case 6:case 9:case 11:
return 30;
break;
case 2:
if(isLeapyear(year))
return 29;
else
return 28;
break;
default:
return 0;
break;
}
}
*/
方法有很多种,也可以参考:
- 运行结果