Страницы

Поиск по вопросам

среда, 21 ноября 2018 г.

Решение уравнений высших степений

Прошу подсказать алгоритм для поиска корней уравнения высшей степени. Конкретней: есть многочлен вида k[0] * x^n + k[1] * x ^ (n - 1) + ... + k[n - 1] k[i] принадлежит Z и |k[i]| <= 10^9.Известно, что все корни целые.


Ответ

Все целые корни многочлена с целыми коэффициентами являются делителями его свободного члена. Поэтому есть такой путь: 1. Провести факторизацию свободного члена. 2. Найти все делители свободного члена как произведения его простых множителей (взятых в степенях не выше, чем в каноническом разложении), со знаками плюс и минус. 3. Отобрать все корни среди делителей.
На самом деле главная проблема - в нахождении одного корня x=a, поскольку в соответствии с теоремой Безу многочлен разделится на x-a, и следующий корень можно будет подставлять в частное. При этом повторная факторизация также получается путём несложного пересчёта.

android Как узнать, что приложения удаляют?

android Как узнать, что приложения удаляют? и перед удалением выполнить действия по очистке данных


Ответ

Cоздайте класс, унаследуйте его от BroadcastReceiver, и в манифесте объявите его таким образом:

Далее перекройте onReceive, в котором опишите Вашу логику при удалении приложения
@Override public void onReceive(Context context, Intent intent) { if (intent.getDataString().equals("package:your.package.name")) { //methods } }

Варианты реализации lock-free алгоритма

Допустим, есть класс:
class LockFree { LockFree(int num) : n(num) {} int next() {n += 1; return n;} private: int n; };
Какие есть стандартные методы организовать lock-free доступ к n? То есть, интересует lock-free (без мьютексов) реализация функции next(), которую можно было бы использовать в многопоточной многоядерной системе.
Было бы круто узнать как о возможностях современного стандарта (вероятно это std::atomic + варианты compare_exchange), так и о самопальных велосипедах, которые можно было бы использовать в plain c.


Ответ

Самый простой метод:
class LockFree { LockFree(int num) : n(num) {} int next() {return ++n;} private: std::atomic n; };
Это покроет все Ваши нужды в 99% случаев.

а если next() будет вида next() { return n + n^2 + n^3; }
Тогда будет так:
int next() { int oldN = n; while(true) { int newN = oldN + oldN*oldN + oldN*oldN*oldN; if(n.compare_exchange_strong(oldN, newN)) return newN; } }

Как одновременно перехватывать касания в onTouch методе и двойной клик для RelativeLayout?

Как одновременно перехватывать касания в onTouch методе и двойной клик для RelativeLayout??


Ответ

Попробуйте так:
activity_main.xml

MainActivity.class
public class MainActivity extends AppCompatActivity {
private GestureDetectorCompat DoubleTap; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); RelativeLayout main_layout = (RelativeLayout) findViewById(R.id.main_layout);
DoubleTap = new GestureDetectorCompat(this, new MyGestureListener()); main_layout.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (MotionEvent.ACTION_DOWN == event.getAction()){ Log.d("...", "onTouch сработал"); } return DoubleTap.onTouchEvent(event); } }); }
private class MyGestureListener extends GestureDetector.SimpleOnGestureListener { @Override public boolean onDown(MotionEvent e) { return true; } @Override public boolean onDoubleTap(MotionEvent e) { Log.d("...", "DoubleTap сработал"); return false; } } }

Как передать/получить данные в/из диалогового фрагмента DatePicker

Есть диалоговый фрагмент:
public class SelectDateFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { // устанавливаем дату, которая отображается в диалоговом окне Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(getActivity().date_choice_millis); int yy = calendar.get(Calendar.YEAR); int mm = calendar.get(Calendar.MONTH); int dd = calendar.get(Calendar.DAY_OF_MONTH); return new DatePickerDialog(getActivity(), this, yy, mm, dd); } public void onDateSet(DatePicker view, int yy, int mm, int dd) { // получаем выбранную в диалоговом окне дату и сохраняем ее Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.DAY_OF_MONTH, dd); calendar.set(Calendar.MONTH, mm); calendar.set(Calendar.YEAR, yy); getActivity().date_choice_millis = calendar.getTimeInMillis(); } }
И несколько Окон (Activity), обращающихся к нему. В каждом Окне есть метод, вызывающий диалоговый фрагмент:
public void onclick_date_view (View view) { DialogFragment newFragment = new SelectDateFragment(); newFragment.show(getSupportFragmentManager(), "DatePicker");
действия после выбора новой даты ...// Возможно, действия после обновления должны происходить в другом месте? }
Конструкция getActivity().date_choice_millis (переменная из вызвавшего класса) не работает. Как получить и передать данные из/в вызвавшее Окно?


Ответ

Пример из моего проекта - передача из фрагмента в DatePicker и возврат результата в фрагмент. Способ корректно переносит повороты устройства и тп. бедствия:
UPD: в связи с исключением метода getCalendarView() из Material-стиля календаря переписал получение введенной даты из переданных в колбэк параметров
Класс Date Picker:
public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener{
@Override public Dialog onCreateDialog(Bundle savedInstanceState) { Long mDate = getArguments().getLong("date"); final Calendar c = Calendar.getInstance(); c.setTimeInMillis(mDate); int year = c.get(Calendar.YEAR); int month = c.get(Calendar.MONTH); int day = c.get(Calendar.DAY_OF_MONTH);
return new DatePickerDialog(getActivity(), this, year, month, day); }
@Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
Calendar с = Calendar.getInstance(); с.set(year,monthOfYear,dayOfMonth); long date = c.getTimeInMillis(); Intent i = new Intent(); i.putExtra ("date" , date); getTargetFragment().onActivityResult(getTargetRequestCode() , Activity.RESULT_OK , i);
} }
Часть фрагмента, в котором по нажатию на поле TextView (vDate) появляется Date Picker, получение результата, а так же вывод полученной даты в поле TextView, по которому кликали:
public class EditTransactionFragment extends Fragment {

private final DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM); private TextView vDate; private final int CHANGE_DATE = 2; Transaction mTransaction;
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setRetainInstance(true); if (mTransaction == null) mTransaction = new Transaction(); }
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { long mDate;
View view = inflater.inflate(R.layout.edit_transaction, null);
mDate = mTransaction.getDate(); vDate = (TextView) view.findViewById(R.id.tr_date); vDate.setOnClickListener(new DateClickListener(mDate)); setTextDate(mDate); return view; }
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data);
if (data == null || resultCode != Activity.RESULT_OK) return;
switch (requestCode) { case CHANGE_DATE: Long date = data.getLongExtra("date", 0); mTransaction.setDate(date); setTextDate(date); return; } }
private void setTextDate(Long date) { vDate.setText(dateFormat.format(date)); }
private class DateClickListener implements View.OnClickListener { private long mDate;
public DateClickListener(long date) { mDate = date; }
@Override public void onClick(View v) { DialogFragment changeDate = new DatePickerFragment(); Bundle args = new Bundle(1); args.putLong("date", mDate); changeDate.setArguments(args); changeDate.setTargetFragment(EditTransactionFragment.this, CHANGE_DATE); changeDate.show(getFragmentManager(), "changeDate"); } } }

Модификаторы доступа в Java

Чем отличаются эти два класса, и какого типа будет класс во втором случае?
public class Man { int age; string name; Man (int age, string name) { this.age = age; this.name = name; } }
и
class Man { int age; string name; public Man (int age, string name) { this.age = age; this.name = name; } }


Ответ

Есть, по умолчанию - доступ из пакета (т.е. из этого пакета доступен, с другого нет).
Public доступен из любого другого класса. Если по нормальному всё делать, то в .java файле ровно 1 public класс и название файла совпадает с названием класса.

Как должен работать %n?

На Хабре говорится
Спецификатор "%n" не учитывает количество символов, выведенных с помощью таких спецификаторов, как "%f". Поэтому, перед "%n" поставим один пробел, чтобы записать в isOkPassword значение 1.
Однако, проверка показывает, что это вовсе не так:
#include
int main(void) { int n;
printf("%f %n
", 12.0, &n); printf("%d", n);
return 0; }

12.000000 10
А как на самом деле должен работать этот код? Вроде %n для того и нужен, чтобы учитывать форматы, ведь иначе в нём не было бы смысла.


Ответ

Спецификатор %n приводит к записи в аргумент-приемник общего количества символов посланных к этому моменту в выходной поток ("...the number of characters written to the output stream so far by this call to fprintf."). Никакого "не учитывания" каких-то спецификаторов формата в нем нет и быть не может.