挑战变成设计->2.6 数学问题的解题窍门->线段上格点的个数

来源:互联网 发布:创建域名邮箱 编辑:程序博客网 时间:2024/05/18 02:04
#include<stdio.h>int gcd(int a,int b){    return b?gcd(b,a%b):a;}int min(int a,int b){    return a>b?b:a;}int max(int a,int b){    return a>b?a:b;}int miners(int a,int b){    return (a-b>0)?(a-b):(b-a);}int main(){    int x1,y1,x2,y2;    while (~scanf("%d%d%d%d",&x1,&y1,&x2,&y2))    {        int gcd_x=miners(x1,x2)/gcd(miners(x1,x2),miners(y1,y2)),x;        int gcd_y=miners(y1,y2)/gcd(miners(x1,x2),miners(y1,y2)),y;       //printf("~~~%d~~~\n",gcd_x);        //printf("~~~%d~~~\n",gcd_y);        if  (x1==x2&&y1==y2)//两个点坐标相等,输出原来的点            printf("(%d,%d)\n",x1,y1);        else if (x1==x2)//斜率不存在时        {            x=x1,y=min(y1,y2)+1;            while (y<max(y1,y2))            {                printf("(%d,%d)\n",x,y);                y++;            }        }        else if (y1==y2)//斜率存在且为0时        {            x=min(x1,x2)+1,y=y1;            while (x<max(x1,x2))            {                printf("(%d,%d)\n",x,y);                x++;            }        }        if (x1<x2&&y1<y2)        {            x=x1+gcd_x,y=y1+gcd_y;            while (x<x2)            {                printf("(%d,%d)\n",x,y);                x+=gcd_x;                y+=gcd_y;            }        }        else if (x1<x2&&y1>y2)        {            x=x1+gcd_x,y=y1-gcd_y;            while (x<x2)            {                printf("(%d,%d)\n",x,y);                x+=gcd_x;                y-=gcd_y;            }        }    }    return 0;}

0 0
原创粉丝点击