没有很好的思路,只想到了逐渐逼近的方式,应该还有更好的算法
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 }
浙公网安备 33010602011771号