জাভাতে যখন আপনি করবেন
a % b
যদি কোনওটি নেতিবাচক হয় তবে এটি খ এর মতো মোড়কের পরিবর্তে নেতিবাচক ফলাফল দেয়। এটি ঠিক করার সর্বোত্তম উপায় কী? আমি ভাবতে পারি একমাত্র উপায়
a < 0 ? b + a : a % b
জাভাতে যখন আপনি করবেন
a % b
যদি কোনওটি নেতিবাচক হয় তবে এটি খ এর মতো মোড়কের পরিবর্তে নেতিবাচক ফলাফল দেয়। এটি ঠিক করার সর্বোত্তম উপায় কী? আমি ভাবতে পারি একমাত্র উপায়
a < 0 ? b + a : a % b
উত্তর:
এটি% b = a - a / b * b এর মতো আচরণ করে; অর্থাৎ এটি বাকি
আপনি (একটি% বি + বি)% বি করতে পারেন
এই অভিব্যক্তিটি ইতিবাচক বা নেতিবাচক হোক না কেন ফলাফলের (a % b)
চেয়ে অগত্যা কম হওয়ায় কাজ করে । যোগ করা নেতিবাচক মানগুলির যত্ন নেয় , যেহেতু এবং এর মধ্যে একটি নেতিবাচক মান হয় , এটি অগত্যা কম এবং ধনাত্মক। গত মডিউল আছে ক্ষেত্রে দিয়ে শুরু করতে, যেহেতু যদি ইতিবাচক ছিল ইতিবাচক চেয়ে বড় হয়ে যাবে । অতএব, এটিকে আবার আগের চেয়ে ছোট করে তোলে (এবং নেতিবাচক মানগুলিকে প্রভাবিত করে না )।b
a
b
a
(a % b)
-b
0
(a % b + b)
b
a
a
(a % b + b)
b
(a % b + b) % b
b
a
(a % b)
অগত্যা চেয়ে কম b
(কোন ব্যাপার যদি a
ইতিবাচক বা নেতিবাচক হয়) যোগ b
নেতিবাচক মূল্যবোধের যত্ন নেয় a
, যেহেতু (a % b)
কম b
এবং কম 0
, (a % b + b)
অগত্যা চেয়ে কম b
এবং ইতিবাচক। গত মডিউল আছে ক্ষেত্রে a
দিয়ে শুরু করতে, যেহেতু যদি ইতিবাচক ছিল a
ইতিবাচক (a % b + b)
চেয়ে বড় হয়ে যাবে b
। অতএব, (a % b + b) % b
এটিকে b
আবার আগের চেয়ে ছোট করে তোলে (এবং নেতিবাচক a
মানগুলিকে প্রভাবিত করে না )।
a < 0
, সম্ভবত আপনি একবার দেখতে পারেন)
(a % b + b) % b
খুব বড় মানের a
এবং এর জন্য ভেঙে যায় b
। উদাহরণস্বরূপ, ব্যবহার a = Integer.MAX_VALUE - 1
এবং ফলাফল হিসাবে b = Integer.MAX_VALUE
দেবে -3
, যা একটি নেতিবাচক সংখ্যা, যা আপনি এড়াতে চেয়েছিলেন।
while
করা ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে হুড়োহুদি, যদি আপনার প্রয়োজন হয় তবে if
এটি আসলে দ্রুততর হয়।
জাভা 8-র হিসাবে, আপনি ম্যাথ.ফ্লুরমড (ইনট এক্স, ইনট y) এবং ম্যাথ.ফ্লোরমড (লং এক্স, লং ওয়াই) ব্যবহার করতে পারেন । এই দুটি পদ্ধতিই পিটারের উত্তর হিসাবে একই ফলাফল দেয়।
Math.floorMod( 2, 3) = 2
Math.floorMod(-2, 3) = 1
Math.floorMod( 2, -3) = -1
Math.floorMod(-2, -3) = -2
float
বা double
তর্ক নিয়ে কাজ করে না । মোড বাইনারি অপারেটর ( %
) এছাড়াও কাজ করে float
এবং double
অপারেশন করে।
যাঁরা এখনও জাভা 8 ব্যবহার করছেন না (বা ব্যবহার করতে সক্ষম নন) তাদের জন্য পেয়ারা ইন্টমাথ.মোড () নিয়ে উদ্ধার করতে এসেছিল , গুয়ারা ১১.০ এর পরে পাওয়া যায়।
IntMath.mod( 2, 3) = 2
IntMath.mod(-2, 3) = 1
একটি সতর্কতা: জাভা 8 এর ম্যাথ.ফ্লোরমড () এর বিপরীতে বিভাজক (দ্বিতীয় প্যারামিটার) নেতিবাচক হতে পারে না।
সংখ্যার তত্ত্বে, ফলাফলটি সর্বদা ইতিবাচক হয়। আমি অনুমান করব যে কম্পিউটারের ভাষায় এটি সর্বদা হয় না কারণ সমস্ত প্রোগ্রামার গণিতবিদ নয়। আমার দুই সেন্ট, আমি এটিকে ভাষার একটি ডিজাইনের ত্রুটি হিসাবে বিবেচনা করব, তবে আপনি এখন এটি পরিবর্তন করতে পারবেন না।
= এমওডি (-4,180) = 176 = এমওডি (176, 180) = 176
কারণ 180 * (-1) + 176 = -4 180 * 0 + 176 = 176 এর সমান
এখানে ঘড়ির উদাহরণ ব্যবহার করে, http://mathworld.wolfram.com/Congruence.html আপনি সময়কাল_আপনি সময় চক্রের দৈর্ঘ্য -45 মিনিট বলতে পারবেন না, আপনি উভয় উত্তরই বেস সমীকরণকে সন্তুষ্ট করলেও 15 মিনিট বলবেন।
-1
পরিবর্তে নির্বাচন করা n-1
) তারপর এটি আছে।
জাভা 8 রয়েছে Math.floorMod
, তবে এটি খুব ধীর (এর বাস্তবায়নের একাধিক বিভাগ, গুণ এবং শর্তসাপেক্ষ রয়েছে)। এটি সম্ভব যে জেভিএমের এটির জন্য একটি অন্তর্নিহিত অনুকূলিত স্টাব রয়েছে, যা এটি উল্লেখযোগ্যভাবে বাড়িয়ে তুলবে।
এটি ছাড়াই এটির দ্রুততম উপায় floorMod
হ'ল এখানে অন্যান্য উত্তরগুলির মতো, তবে শর্তযুক্ত কোনও শাখা নেই এবং কেবল একটি ধীর গতি নেই %
।
ধরে নেওয়া n ইতিবাচক, এবং এক্স কিছু হতে পারে:
int remainder = (x % n); // may be negative if x is negative
//if remainder is negative, adds n, otherwise adds 0
return ((remainder >> 31) & n) + remainder;
ফলাফলগুলি যখন n = 3
:
x | result
----------
-4| 2
-3| 0
-2| 1
-1| 2
0| 0
1| 1
2| 2
3| 0
4| 1
আপনার যদি কেবল সঠিক মোড অপারেটরের মধ্যে 0
এবং n-1
নয় এবং এর মধ্যে অভিন্ন বিতরণ প্রয়োজন হয় এবং আপনার x
ক্লাস্টারটি কাছাকাছি না থেকে থাকে 0
তবে নিম্নলিখিতটি আরও দ্রুততর হবে, কারণ আরও বেশি নির্দেশের স্তরের সমান্তরালতা রয়েছে এবং ধীর %
গণনা অন্যটির সাথে সমান্তরালে ঘটবে অংশগুলি যেমন তার ফলাফলের উপর নির্ভর করে না।
return ((x >> 31) & (n - 1)) + (x % n)
উপরেরগুলির জন্য ফলাফলগুলি n = 3
:
x | result
----------
-5| 0
-4| 1
-3| 2
-2| 0
-1| 1
0| 0
1| 1
2| 2
3| 0
4| 1
5| 2
যদি ইনপুটটি কোনও পূর্ণ পরিসরে র্যান্ডম হয় তবে দুটি সমাধানের বিতরণ একই হবে be যদি ইনপুট ক্লাস্টার শূন্যের কাছাকাছি n - 1
হয় তবে পরবর্তী সমাধানগুলিতে খুব কম ফলাফল আসবে।
এখানে একটি বিকল্প:
a < 0 ? b-1 - (-a-1) % b : a % b
এটি অন্য সূত্রের চেয়ে দ্রুত হতে পারে বা নাও হতে পারে [(একটি% বি + বি)% বি]। অন্যান্য সূত্রের বিপরীতে, এটিতে একটি শাখা রয়েছে তবে এটি একটি কম মডুলো অপারেশন ব্যবহার করে। কম্পিউটার যদি কোনও <0 টি সঠিকভাবে ভবিষ্যদ্বাণী করতে পারে তবে সম্ভবত একটি জয়।
(সম্পাদনা করুন: সূত্রটি স্থির করা হয়েছে))