Полагаю, вы имеете в виду 16 цифр, а не 16 бит. 16 бит действительно легко, и вы можете просто проверить это с помощью простого цикла и деления. Ваш checkPrime()
может быть оптимизирован следующим образом:
public static boolean checkPrime(long n)
{
if (n == 2)
return true;
if (n % 2 == 0)
return false;
for (long i = 3; i <= Math.sqrt(n); i += 2)
{
if (n % i == 0)
return false;
}
return true;
}
Но если число становится слишком большим (я думаю, что даже для 16 цифр это не понадобится), вы можете использовать примитивность Миллера-Робина тест . Этот тест можно использовать для проверки, является ли число ОЧЕНЬ БОЛЬШИМ простым или нет.
Если вам нужно сгенерировать все простые числа до определенного числа , вы можете использовать Сито Эратосфена .
Просто помните, что диапазон int
составляет от -2,147,483,648
до 2,147,483,647
, поэтому он не может содержать 16-значное число. Вы можете использовать long
, потому что его диапазон от -9,223,372,036,854,775,808
до 9,223,372,036,854,775,807
, поэтому он может содержать 16-значный номер.
У вас есть несколько вариантов:
(int)
- Оператор приведения. Работает, если объект уже является целым числом на некотором уровне в иерархии наследования или если определено неявное преобразование.
int.Parse () / int.TryParse ()
- Для преобразования из строки неизвестного формата.
int.ParseExact () / int.TryParseExact ()
- для преобразования из строки в определенный формат
Convert.ToInt32 ()
- для преобразования объекта неизвестного типа. Он будет использовать явное и неявное преобразование или реализацию IConvertible, если таковые определены.
как int?
- Обратите внимание на «?». Оператор as
предназначен только для ссылочных типов, поэтому я использовал «?» для обозначения Nullable
. " as
" оператор работает как Convert.To ____ ()
, но подумайте TryParse ()
, а не Parse ()
: он возвращает ноль
, а не бросает исключение, если преобразование завершается неудачей.
Из них я бы предпочел (int)
, если объект действительно представляет собой целое число в штучной упаковке. В противном случае используйте Convert.ToInt32 ()
в этом случае.
Обратите внимание, что это очень общий ответ : я хочу обратить внимание на ответ Даррена Кларка, потому что я думаю, что это так хорошая работа по рассмотрению специфики здесь, но пришла поздно и еще не проголосовала. Во всяком случае, он получает мой голос за «принятый ответ», за то, что тоже рекомендовал (int) указать, что в случае неудачи (int) (short)
может работать вместо этого,
Приведение (int) myobject
должно просто работать.
Если это дает вам недопустимое исключение приведения, то это, вероятно, потому, что тип варианта isn ' t VT_I4. Я держу пари, что вариант с VT_I4 преобразуется в упакованное int, VT_I2 - в короткое и т.д.
При приведении типа в штучной упаковке допустимо приводить только тип в штучной упаковке.
Например, если возвращенный вариант на самом деле является VT_I2, то (int) (short) myObject
должен работать.
Самый простой способ выяснить это проверить возвращаемый объект и взглянуть на его тип в отладчик. Также убедитесь, что в сборке взаимодействия у вас есть возвращаемое значение, помеченное MarshalAs (UnmanagedType.Struct)
Convert.ToInt(myobject);
Это будет обрабатывать случай, когда myobject
равен null
и возвращать 0
вместо исключения.
Используйте Int32.TryParse
следующим образом.
int test;
bool result = Int32.TryParse(value, out test);
if (result)
{
Console.WriteLine("Sucess");
}
else
{
if (value == null) value = "";
Console.WriteLine("Failure");
}
Также есть TryParse .
Из MSDN:
private static void TryToParse(string value)
{
int number;
bool result = Int32.TryParse(value, out number);
if (result)
{
Console.WriteLine("Converted '{0}' to {1}.", value, number);
}
else
{
if (value == null) value = "";
Console.WriteLine("Attempted conversion of '{0}' failed.", value);
}
}
Может быть Convert.ToInt32 .
Следите за исключениями, в обоих случаях.