SCAU-1078 破密-数学的应用
还可以参考
https://blog.csdn.net/sinat_34200786/article/details/78288634--CSDN的大佬(就是对这个题目的数学的逻辑的分析了)
Description
用到了小学的数学方法,就是横坐标之差和纵坐标之差的和减去两个差的最大公约数
我的方法:
1 /******这其实是典型的数学题目:小学的时候就会接触的,就是在一个 2 直角坐标系里面,两个点连成的线会经过多少的格子,其实就是这两个点的 3 横坐标之差和纵坐标之差之和然后再减去两个差的最大公约数(画一下图就会知道在同一个横坐标格子的时候会可能就穿过了好几个纵坐标的格子了 4 这就是最大公约数的了 5 ***********/ 6 #include <stdio.h> 7 #include <stdlib.h> 8 //#define Abs(x) (x)>0?(x):(-x); 9 int gcd(int a,int b)//这就是一个常规的找最大公约数的函数gcd了 10 { 11 int y; 12 //if(a==0) 13 // return 0; 14 while(a%b!=0) 15 { 16 y=a%b; 17 a=b; 18 b=y; 19 } 20 return b; 21 } 22 int main() 23 { 24 int x1,y1,x2,y2; 25 scanf("%d%d%d%d",&x1,&y1,&x2,&y2); 26 int m=abs(x1-x2); 27 int n=abs(y1-y2); 28 if(m<n)//由于gcd的第一个参数是要保证比第二个参数要大的 29 { 30 int temp=m; 31 m=n; 32 n=temp; 33 } 34 int ans=0;//储存答案了 35 if(m!=0&&n!=0)//由于如果两个点是相同横坐标并且也是相同的纵坐标的时候,或者是相同横坐标不同纵坐标 36 //或者是相同纵坐标而横坐标不同的时候,都是不穿过格子的,所以就不对ans进行操作,也就是说输出已经被初始化的值ans+0 37 38 { 39 int w=gcd(m,n);//w是m和n的最大公约数 40 ans=m+n-w;//直接带入公式 41 } 42 // ans=(m+n)-gcd(m,n); 43 printf("%d",ans); 44 return 0; 45 }