Closed. This question is off-topic. It is not currently accepting answers. Learn more。
想改进这个问题吗Update the question所以堆栈溢出的值小于aa>。
我的问题是:
我想找到一个小于N
的质数,在2基数系统中对应的数包含最大数。
例如,对于N = 87
我的程序返回了31
(在2个基本系统中为11111)。
我正在寻找更好的解决办法来解决这个问题。
我的算法如下:
static int Slow(int N)
{
int maxCount = 0;
int maxi = 5;
for (int i = 5; i <= N; i+=2)
{
if (Isprime(i))
{
string x = ConvertToPBase(i, 2);
int count = Count1In(x);
if (count > maxCount)
{
maxCount = count;
maxi = i;
}
}
}
return maxi;
}
我的
IsPrime
方法如下:static bool Isprime(int n)
{
if (n == 2)
return true;
if (n == 3)
return true;
if (n % 2 == 0)
return false;
if (n % 3 == 0)
return false;
int i = 5;
int w = 2;
while (i * i <= n)
{
if (n % i == 0)
return false;
i += w;
w = 6 - w;
}
return true;
}
我的
ConvertToPBase
方法如下:static string ConvertToPBase(int numberInTenBase, int P)
{
List<int> list = new List<int>();
while (numberInTenBase > 0)
{
list.Add((numberInTenBase % P));
numberInTenBase /= P;
}
list.Reverse();
string x = "";
foreach (var item in list)
{
x += item;
}
return x;
}
我的count1方法如下:
static int Count1In(string x)
{
int count = 0;
for (int i = 0; i < x.Length; i++)
{
if (Convert.ToInt32(x[i].ToString()) == 1)
count++;
}
return count;
}
最佳答案
如果对输入值有限制(值为int
因而value <= int.MaxValue
)
我建议解决所有可能的位集(1..30
)的问题,并将解决方案放入一个集合中,即。
| min prime composed
bits set | binary | decimal
-------------------------------
1 | 10 | 2
2 | 11 | 3
3 | 111 | 7
4 | 10111 | 23
5 | 11111 | 31
...
完成此操作后,您可以轻松地将解决方案实现为
private static Dictionary<int, int> s_Solutions = new Dictionary<int, int>() {
{0, int.MinValue},
{1, 2},
{2, 3},
{3, 7},
{4, 23},
{5, 31},
...
};
// O(1) solution - 31 items to scan only for the arbitrary N
static int NotThatSlow(int N) {
return s_Solutions
.Where(pair => pair.Value < N)
.OrderByDescending(pair => pair.Key)
.Select(pair => pair.Value)
.First();
}
09-19 18:14