Electric Fence

题意:坐标系中三点(0, 0), (n, m), (p, 0)围成一个三角形(0<=n<32000, 0<m<32000, p>0),求三角形内部(不在边上)整数坐标的点有多少个?

解题思路

  1. 将整个三角形分为两个部分(设(0, 0)为O,(n, m)为A,(p, 0)为P,(n, 0)为N),这两部为ONA和PNA。
  2. 分别统计这两个三角形中整数坐标点的个数sum1和sum2。对于每一个横坐标i,求对应的纵坐标j,那么就能得到这个横坐标下的整数坐标点有多少个。
  3. sum1的统计不包含横坐标n,sum2的统计也不包含横坐标n。如果为钝角三角形,sum2的统计还要加上AP上的整数点。
  4. 最后根据情况输出最后的结果。如果为p > n且 n != 0,则整数点个数为sum1 + sum2 + (m - 1),如果n == 0,则个数为sum1 + sum2。如果p < n,则为sum1 - sum2。如果p == n,则为sum1

代码

/*
ID: zc.rene1
LANG: C
PROG: fence9
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main(void)
{
    FILE *fin, *fout;
    int n, m, p;
    int i, sum1 = 0, sum2 = 0;

    fin = fopen("fence9.in", "r");
    fout = fopen("fence9.out", "w");

    fscanf(fin, "%d %d %d", &n, &m, &p);

    for (i=1; i<n; i++)
    {
	sum1 += (m * i / n);
	if (((m * i ) % n) == 0)
	{
	    sum1--;
	}
    }

    if (p > n)
    {
	for (i=n+1; i<p; i++)
	{
	    sum2 += (p - i) * m / (p - n);
	    if ((((p - i) * m) % (p - n)) == 0)
	    {
		sum2--;
	    }
	}
    }
    else
    {
	for (i=p+1; i<n; i++)
	{
	    sum2 += (p - i) * m / (p - n);
	}
    }

    if (p > n)
    {
	if (n != 0)
	{
	    fprintf(fout, "%d\n", sum1 + sum2 + (m - 1));
	}
	else
	{
	    fprintf(fout, "%d\n", sum1 + sum2);
	}

    }
    else if (p < n)
    {
	fprintf(fout, "%d\n", sum1 - sum2);
    }
    else
    {
	fprintf(fout, "%d\n", sum1);
    }

    return 0;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值