如果正整数可以被 A 或 B 整除,那么它是神奇的。 返回第 N 个神奇数字。由于答案可能非常大,返回它模 10^9 + 7 的结果。


没有很好的思路,只想到了逐渐逼近的方式,应该还有更好的算法

  1 public class Solution {
  2     int GetNum(int A, int B)//最小公倍数 3  { 4 int temp = 0; 5 int num1 = A; 6 int num2 = B; 7 while(B != 0) 8  { 9 temp = A % B; 10 A = B; 11 B = temp; 12  } 13 14 return (num1 * num2) / A; 15  } 16 17 public int NthMagicalNumber(int N, int A, int B) { 18 double min = Math.Min(A, B); 19 if (N == 1) 20 return (int)(min % (Math.Pow(10, 9) + 7)); 21 22 if (A == B)//两数相等直接求积 23  { 24 return (int)(((double)A * (double)N) % (Math.Pow(10, 9) + 7)); 25  } 26 27 double max = Math.Max(A, B); 28 29 if (max % min == 0)//一数为另一数倍数直接求积 30  { 31 double minValue = (double)N * (double)min; 32 return (int)(minValue % (Math.Pow(10, 9) + 7)); 33  } 34 else 35  { 36 double temp = GetNum((int)min, (int)max);//最小公倍数 37 double num = N; 38 double minValue; 39 int delt; 40 int tempDelt; 41 double ret; 42 int change; 43 while (true) 44  { 45 minValue = num * min; 46 delt = (int)(minValue / max); 47 tempDelt = (int)(minValue / temp); 48 49 if ((num + delt - tempDelt) > N+1)//递进次数 50  { 51 num -= (int)((num + delt - tempDelt - N) / 2); 52 continue; 53  } 54 55 change = (int)num + delt - tempDelt - N; 56 57 if (change > 0) 58  { 59 if (delt * max > num *min)//大数次数去1 60  { 61 ret = Math.Max((delt - change) * max, num * min); 62  } 63 else if (delt * max == num * min)//同时去1 64  { 65 ret = Math.Max((delt-change) * max, (num - change) * min); 66  } 67 else//小数去1 68  { 69 ret = Math.Max(delt * max, (num-change) * min); 70  } 71 72  } 73 else 74  { 75 ret = Math.Max(delt * max, num * min); 76  } 77 78 return (int)(ret % (Math.Pow(10, 9) + 7)); 79  } 80 81  } 82  } 83 }

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM