如果正整數可以被 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