Problem:三角形计数

三角形计数
Description
快码佳编四兄弟姐妹来到了明代,这天他们看到一个很有学术风范的老者在地上画着东西,一打听,原来是著名的数学家徐光启。徐光启在数学方面的最大贡献当推《几何原本》(前6卷)翻译。徐光启提出了实用的“度数之学“的思想,同时还撰写了《勾股义》和《测量异同》两书。他们看到徐先生在地上画着好多三角形。把大三角形的每条边n等分,将对应的等分点连接起来(连接线分别平行于三条边),这样一共会有多少三角形呢?编程来解决这个问题
Input
第一行为整数t(≤100),表示测试数据组数;接下来t行,每行一个正整数n(≤500)。
Output
对于每个n,输出一个正整数,表示三角形个数
Sample Input
3
1
2
3
Sample Output
1
5
13
这题分别计数头朝上的三角形个数和头朝下的三角形个数。将三角形n等份后,最小的三角形边长计为1。
1.头朝上:
以n=4为例,边长i=1的时候,三角形个数s1=1+2+3+4;
i=2,s2=1+2+3;
i=3,s3=1+2;
i=4,s4=1;
由此可以得出si=(n-i+1)(n-i+2)/2;
所以头朝上的即为i=1到i=n的si求和;
2.头朝下 :
n=1, s=0;
n=2, s=0+1;
n=3, s=0+1+2;
n=4, s=0+1+(1+2+3);
n=5, s=0+(1+2)+(1+2+3+4);
n=6 ,s=0+1+(1+2+3)+(1+2+3+4+5);
由此可以推出,n为偶数时,f(n)=(1+…+n-i)+f(n-2);
n为奇数时,f(n)=(1+…+n-i)+f(n-2); 累加即可。
代码如下:

#include<iostream>
#include<cstdio>
using namespace std;
int f(int n)
{
	if(n%2==0)
	{
		if(n==2) return 1;
		else if(n==4) return 7;
		else if(n>4)  return (n-1)*n/2+f(n-2);
	}
	else 
	{
		if(n==1) return 0;
		else if(n==3) return 3;
		else if(n==5) return 13;
		else if(n>5) return (n-1)*n/2+f(n-2);
	}
}
int main()
{
	int  t,sum1,sum2;
	cin>>t;
	while(t--)
	{
		sum1=0,sum2=0;
		int n;
		cin>>n;
		for(int i=1;i<=n;i++)
		{
			sum1+=(n-i+1)*(n-i+2)/2;
		}
		sum2=f(n)+sum1;
		cout<<sum2<<endl;
	}
	return 0;
}
  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZSTU_呆大鹅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值