信息互动

当前位置/ 首页/ 信息互动/ 正文

free pascal 教程(free pascal)

导读 大家好,我是小五,我来为大家解答以上问题。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;

    }

}

本文到此讲解完毕了,希望对大家有帮助。