free pascal 教程(free pascal)
大家好,我是小五,我来为大家解答以上问题。free pascal 教程,free pascal很多人还不知道,现在让我们一起来看看吧!
首先,我们看看要执行完成这项计划,最多需要多少天,最直接的就是第一天0圈,第二天1圈,第三天2圈,第四天3圈,第m-1天m圈,合计
相当于:m2-m-2n=0
所以方程的解就是所需要的天数,由于必须为整数天,而且后面的要比前面的跑得圈数多,所以求得的m需要截尾取整。
根据一元二次方程的解法,首先是判断式:b2-4ac=1+8n
1天不可能完成,所以至少需要2天,而安排两天的只有1种可能性,第1天0圈,第二天n圈;
安排成四天,那么后三天需要安排,至少为x+(x+1)+(x+2)=3x+3=3(x+1),也就是后三天的第1天可以排1到圈,就变成两天的问题。
安排成五天,那么x+(x+1)+(x+2)+(x+3)=4x+6
安排成六天,那么x+(x+1)+(x+2)+(x+3)+(x+4)=5x+10
可以看出,我们都可以将第二天的跑的圈数给出,剩余的就是m-2的问题,这样就将一个m-1的问题转换为m-2的问题,换句话说,可以使用递归实现对该问题解决。
下面是程序,结果比你的结果多了1种选择.
#include <stdio.h>
#include <math.h>
long caculate(int day,int circlenum);
void main()
{
int n,k;
long num,m;
printf("please input n:");
scanf("%d",&n);
//计算机最多安排的天数,这里包含第一天,第一天的圈数为0
k=(int)(1+sqrt(1+8*n))/2;
num=1;
for(int i=k;i>2;i--)
{
m=caculate(i,n);
num+=m;
printf("%ld ",m);
}
printf(" k=%d ",k);
printf("%ld ",num);
}
long caculate(int day,int circlenum)
{
int x;
long sum;
if(day==3)
if (circlenum%2==0)
return circlenum/2-1;
else
return circlenum/2;
else
{
x=(int)(((double)circlenum)/(day-1)-(day-2)/2.0);
//printf("%d ",x);
sum=0;
for(int i=x;i>0;i--) //对每种安排,分别求出低一级问题的安排数,然后求得总和
{
sum+=caculate(day-1,circlenum-(day-1)*i);
}
return sum;
}
}
本文到此讲解完毕了,希望对大家有帮助。