max of 直线划平面

在一个无限延伸平面上有一个圆和n条直线,这些直线中每一条都在一个圆内,并且同其他所有的直线相交,假设没有3条直线相交于一点,试问这些直线最多将圆分成多少区域。
第一行包含一个整数T,(0< T<=100)表示测试次数。
每组测试数据包含一个整数N(0<=N<=10000000),表示直线的条数。
对于每一组测试数据,输出这个圆能被这N条直线分成的最多区域数。

sample Input

2
1
2

sample Output

2
4
 
 
详细解答:

问题描述:

     n条直线最多能划分出多少个平面?

问题分析:

     平面上只要多出现一条直线,就能至少多把平面分出一部分,而若此直线与其他直线有n个交点,就再能把平面多分出n个部分,因此若想把平面划分的部分最多,新添入的直线必须与前k条直线交k个点,即第二条直线要与第一条直线交1个点,第三条要与前两条交2个点,……,第1999条与前1998条交1998个点,这样,第二条直线多划分出1+1=2个部分,第三条直线多划分出1+2=3个部分,……,第1999条直线多划分出1+1998=1999个部分。而第一条直线把平面划分出2个部分,因此1999条直线能划分平面的块数为:
2+2+3+4+5+…+1998+1999  = 1+(1+2+3+4+5+…+1998+1999)  = 1+(1+1999)*1999/2  = 1999001

     对n条直线最多划分平面数:

    (1)使用递归

         f(n) = n + f(n-1) ,   n > 1     

         f(n) = 2               ,   n = 1

    (2)使用递推

         n = 1,  S1 = 2       

         n > 1,  Sn = 2 + 2 + 3 + …… + n  = 1 + n * (n+1) / 2

#include<stdio.h>
int main()
{
    int t;
    long long n;
    long long sum;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%lld",&n);//64bit防溢出
        sum=1+n*(n+1)/2;//递推公式使用
        printf("%lld
",sum);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/gti2baby/p/10456432.html