ভূমিকা
0 এবং 1 এর মধ্যে প্রতিটি যৌক্তিক সংখ্যা বিটগুলির পর্যায়ক্রমিক ক্রম হিসাবে উপস্থাপিত হতে পারে। উদাহরণস্বরূপ, 11/40 এর বাইনারি উপস্থাপনাটি
0.010 0011 0011 0011 ...
যেখানে 0011
অংশটি অনির্দিষ্টকালের জন্য পুনরাবৃত্তি করে। এই প্রতিনিধিত্ব সন্ধানের একটি উপায় নিম্নলিখিত। দিয়ে শুরু করুন R = 11/40 , তারপর বারবার এটা বহুগুণে বৃদ্ধি করবেন এবং ভগ্ন অংশ নিতে, রেকর্ডিং যখন এটি উপরে 1. যায় যখন এর মান দ পুনরাবৃত্তি, আপনি জানেন আপনি একটি লুপ লিখে ফেলেছেন।
1. r = 11/40
2. 2*r = 11/20 < 1 -> next bit is 0, r = 11/20
3. 2*r = 11/10 >= 1 -> next bit is 1, r = 2*r - 1 = 1/10
4. 2*r = 1/5 < 1 -> next bit is 0, r = 1/5
5. 2*r = 2/5 < 1 -> next bit is 0, r = 2/5
6. 2*r = 4/5 < 1 -> next bit is 0, r = 4/5
7. 2*r = 8/5 >= 1 -> next bit is 1, r = 2*r - 1 = 3/5
8. 2*r = 6/5 >= 1 -> next bit is 1, r = 2*r - 1 = 1/5, same as in 4.
The loop 5. -> 6. -> 7. -> 8. now repeats.
বাইনারি স্ট্রিং থেকে 11/40 এ ফিরে যেতে, আপনি সূত্রটি ব্যবহার করতে পারেন
(int(prefix) + int(suffix)/(2^len(suffix) - 1)) / 2^len(prefix)
prefix
প্রাথমিক অংশটি কোথায় 010
, suffix
পুনরাবৃত্তিকারী অংশ 0011
, এবং int
বাইনারি স্ট্রিংটিকে পূর্ণসংখ্যায় রূপান্তর করে।
এই জাতীয় দুটি উপস্থাপনা দেওয়া, আমরা তাদের উপর বিটওয়াইস এক্সওআর অপারেশন করতে পারি। ফলস্বরূপ ক্রমটি পর্যায়ক্রমিকও হবে, সুতরাং এটি যৌক্তিক সংখ্যার প্রতিনিধিত্ব করে।
কিছু যুক্তিযুক্ত সংখ্যার জন্য দুটি বাইনারি উপস্থাপনা রয়েছে।
1/4 = 0.010000000...
= 0.001111111...
তাদের মধ্যে পছন্দটি বিটওয়াইজ এক্সওরটির ফলাফলকে প্রভাবিত করতে পারে। এই ক্ষেত্রে, আমরা প্রাক্তন উপস্থাপনা ব্যবহার করি, যার অসীম 0 টি রয়েছে s
কাজটি
অর্ধ-খোলা ব্যবধানে আপনার ইনপুটগুলি দুটি যৌক্তিক সংখ্যা [0,1)। আপনার আউটপুটটি যুক্তিযুক্ত সংখ্যা হিসাবে প্রকাশিত ইনপুটগুলিতে বিটওয়াইজ এক্সওআর অপারেশনের ফল হবে shall নোট করুন যে আউটপুটটি 1 হতে পারে, যদিও ইনপুটগুলির কোনওটিই নয়।
ইনপুট এবং আউটপুট সঠিক ফরম্যাটের নমনীয়, কিন্তু প্রতিটি যুক্তিসঙ্গত দুই নম্বর পূর্ণসংখ্যার, লব ও হর (0 এবং 1 এর ব্যতিক্রম, যা হিসাবে প্রতিনিধিত্ব করা যাবে দ্বারা প্রতিনিধিত্ব করা উচিত 0
এবং 1
আকাঙ্ক্ষিত থাকেন)। আপনি ধরে নিতে পারেন যে ইনপুটগুলি সর্বনিম্ন শর্তে প্রকাশিত হয়েছে। আউটপুট অবশ্যই সর্বনিম্ন শর্তে প্রকাশ করা উচিত । একটি অন্তর্নির্মিত যৌক্তিক সংখ্যা প্রকারটি একটি গ্রহণযোগ্য ফর্ম্যাট, যতক্ষণ না এটি এই বিধিনিষেধকে সন্তুষ্ট করে। আপনি আপনার ভাষার দ্বারা আরোপিত পূর্ণসংখ্যার কোনও সীমা অবহেলা করতে পারেন, তবে আপনার অ্যালগরিদমটি তাত্ত্বিকভাবে সমস্ত যুক্তিযুক্ত সংখ্যার জন্য কাজ করা উচিত।
সর্বনিম্ন বাইট গণনা জিতেছে। স্ট্যান্ডার্ড কোড-গল্ফ বিধি প্রযোজ্য।
উদাহরণ
ইনপুটগুলি 11/40 এবং 3/7 বিবেচনা করুন। পাইপ দ্বারা পুনরাবৃত্তি অংশগুলি সীমিত করে আমরা তাদের উপস্থাপনাগুলি একে অপরের উপরে লিখি |
। তারপরে আমরা সমান দৈর্ঘ্যের অংশগুলি পুনরাবৃত্তি করি এবং তাদের এবং তার আগে অংশগুলিতে বিটওয়াইজ এক্সওআর প্রয়োগ করি।
11/40 = 0. 0 1 0|0 0 1 1|0 0 1 1|0 0 1 1|0 0 1 1|0 0 1 1|0 0 1 1|0 0 1 ...
3/7 = 0.|0 1 1|0 1 1|0 1 1|0 1 1|0 1 1|0 1 1|0 1 1|0 1 1|0 1 1|0 1 1|...
-> 0. 0 0 1|0 1 0 1 1 1 1 0 1 0 0 0|0 1 0 1 1 1 1 0 1 0 0 0|0 1 0 ...
ফলাফল যুক্তিযুক্ত সংখ্যা 89/520 হয়।
পরীক্ষার মামলা
0 0 -> 0
1/2 1/2 -> 0
1/2 1/4 -> 3/4
1/3 2/3 -> 1
1/2 3/4 -> 1/4
5/8 1/3 -> 23/24
1/3 1/5 -> 2/5
15/16 3/19 -> 257/304
15/16 257/304 -> 3/19
3/7 11/40 -> 89/520
5/32 17/24 -> 59/96
16/29 16/39 -> 621001733121535520/696556744961512799
000...
যা এই ক্ষেত্রেশেষ হয়(যা আমরা যদি আলগোরিদমটি ব্যবহার করি তবে এটিই আমরা পাইr
)। উদাহরণস্বরূপ, ক্ষেত্রে5/8, 1/3
আমরা পাই23/24
কারণ আমরা এর0.101000...
জন্যসম্প্রসারণটি বেছে নিই5/8
। যদি আমরা পরিবর্তে0.10011111...
হিসাবেবেছে নিই5/8
, এক্সওর হওয়ার পরে ফলাফলটি হয়ে যায়19/24
, তাই এটি ভুল। উইকিপিডিয়া
(a ^ b) ^ b == a
নেই। যেমন (19/24 ^ 1/3) ^ 1/3 != 19/24
। এটি আমাকে এই সম্পর্কে বেশ খানিকটা উত্তেজনা হারাতে