সংখ্যাকে ছোট অংশ হিসাবে বিবেচনা করার জন্য এটি পর্যাপ্ত সঞ্চয় এবং অ্যালগরিদমের সমস্ত বিষয়। ধরে নেওয়া যাক আপনার একটি সংকলক রয়েছে যার মধ্যে একটি int
কেবল 0 থেকে 99 এর মধ্যে হতে পারে এবং আপনি 999999 পর্যন্ত সংখ্যা পরিচালনা করতে চান (এটি কেবল সহজ রাখতে আমরা এখানে ইতিবাচক সংখ্যাগুলি নিয়েই উদ্বেগ করব)।
আপনি প্রতিটি নম্বর তিনটি int
দিয়ে এবং একই বিধিগুলি ব্যবহার করে যা আপনি (প্রাথমিকভাবে) বিদ্যালয়ে যোগ, বিয়োগ এবং অন্যান্য মৌলিক ক্রিয়াকলাপগুলির জন্য ফিরে শিখেছিলেন তা ব্যবহার করে তা করতে পারেন do
একটি স্বেচ্ছাসেবী নির্ভুল গ্রন্থাগারে, আমাদের সংখ্যা উপস্থাপনের জন্য ব্যবহৃত বেসের সংখ্যার কোনও নির্দিষ্ট সীমা নেই, মেমরিটি যা কিছু ধারণ করতে পারে তা কেবল।
উদাহরণস্বরূপ সংযোজন 123456 + 78
:
12 34 56
78
-- -- --
12 35 34
সর্বনিম্ন উল্লেখযোগ্য প্রান্ত থেকে কাজ করা:
- প্রাথমিক বহন = 0।
- 56 + 78 + 0 ক্যারি = 134 = 34 সহ 1 বহন
- 34 + 00 + 1 ক্যারি = 35 = 35 সহ 0 ক্যারি
- 12 + 00 + 0 ক্যারি = 12 = 12 সাথে 0 বহন করুন
এটি আসলে কীভাবে সংযোজন আপনার সিপিইউর অভ্যন্তরে বিট স্তরে কাজ করে।
বিয়োগটি একই রকম (বেস প্রকারের বিয়োগ এবং বাহনের পরিবর্তে ধার নেওয়া), বার বার সংযোজন (খুব ধীর) বা ক্রস-প্রোডাক্ট (দ্রুত) দিয়ে ভাগ করা যায় এবং বিভাগটি আরও জটিল হয় তবে সংখ্যার স্থান পরিবর্তন এবং বিয়োগ দ্বারা করা যেতে পারে জড়িত (দীর্ঘ বিভাগ আপনি একটি শিশু হিসাবে শিখতে হবে)।
আমি দশটি সর্বাধিক শক্তি ব্যবহার করে এই ধরণের স্টাফ করতে আসলে গ্রন্থাগারগুলি লিখেছি যা বর্গক্ষেত্রের ক্ষেত্রে পূর্ণসংখ্যার সাথে মানানসই হতে পারে (দুইটি এক সাথে গুণিত করার সময় ওভারফ্লো প্রতিরোধ করতে int
যেমন 16-বিট int
0 থেকে 99 এর মধ্যে সীমাবদ্ধ থাকে) স্কোয়ার করা হলে int
9,801 (<32,768) উত্পন্ন করুন বা 32-বিট 99,980,001 (<2,147,483,648) জেনারেট করতে 9,999 এর মাধ্যমে 0 ব্যবহার করে যা অ্যালগরিদমগুলিকে ব্যাপকভাবে স্বাচ্ছন্দ্য দিয়েছে।
কিছু কৌশল অবলম্বন করা।
1 / সংখ্যা যুক্ত বা গুণনের সময়, প্রয়োজনীয় সর্বাধিক স্থানের প্রাক-বরাদ্দ করুন তবে যদি আপনি এটি খুব বেশি পেয়ে থাকেন তবে পরে হ্রাস করুন। উদাহরণস্বরূপ, দুটি 100- " int
সংখ্যা " (যেখানে অঙ্ক একটি ) সংখ্যা যুক্ত করা আপনাকে কখনই 101 এর বেশি সংখ্যায় দেবে না। 12-অঙ্কের সংখ্যাকে 3 অঙ্কের সংখ্যা দিয়ে গুণ করুন কখনই 15 টির বেশি সংখ্যার উত্পন্ন করা যাবে না (অঙ্কের সংখ্যা যুক্ত করুন)।
2 / অতিরিক্ত গতির জন্য, কেবলমাত্র যদি প্রয়োজন হয় তবে সংখ্যাগুলিকে স্বাভাবিক করুন (প্রয়োজনীয় স্টোরেজ হ্রাস করুন) - আমার গ্রন্থাগারের একটি পৃথক কল হিসাবে এটি ছিল যাতে ব্যবহারকারী গতি এবং সঞ্চয়স্থানের উদ্বেগগুলির মধ্যে সিদ্ধান্ত নিতে পারে।
3 / ধনাত্মক এবং negativeণাত্মক সংখ্যার সংযোজন হ'ল বিয়োগফল, এবং numberণাত্মক সংখ্যাকে বিয়োগ করা সমান ধনাত্মক যোগ করার সমান। সংকেতগুলি সামঞ্জস্য করার পরে অ্যাড এবং বিয়োগ পদ্ধতিগুলি একে অপরকে কল করে আপনি বেশ কিছুটা কোড সংরক্ষণ করতে পারেন।
4 / ছোটদের কাছ থেকে বড় সংখ্যা বিয়োগ করা থেকে বিরত থাকুন যেহেতু আপনি অবিচ্ছিন্ন সংখ্যার সাথে শেষ করেন:
10
11-
-- -- -- --
99 99 99 99 (and you still have a borrow).
পরিবর্তে, 11 থেকে 10 বিয়োগ করুন, তারপরে এটিকে উপেক্ষা করুন:
11
10-
--
1 (then negate to get -1).
আমি যে লাইব্রেরির জন্য এটি করতে হয়েছিল তার একটি মন্তব্য (পাঠ্যে রূপান্তরিত) এখানে রইল। কোডটি নিজেই, দুর্ভাগ্যক্রমে, কপিরাইটযুক্ত, তবে আপনি চারটি বুনিয়াদি ক্রিয়াকলাপ পরিচালনা করতে পর্যাপ্ত তথ্য নিতে সক্ষম হতে পারেন। নিম্নলিখিত যে ধরে -a
এবং -b
ঋণাত্মক সংখ্যা প্রতিনিধিত্ব করেন এবং a
এবংb
শূন্য বা ইতিবাচক নম্বর আছে।
জন্য উপরন্তু , লক্ষণ পৃথক হয়, তাহলে অস্বীকৃতি ব্যবহার বিয়োগ:
-a + b becomes b - a
a + -b becomes a - b
জন্য বিয়োগ , লক্ষণ পৃথক হয়, তাহলে অস্বীকৃতি ব্যবহার উপরন্তু:
a - -b becomes a + b
-a - b becomes -(a + b)
এছাড়াও আমরা বড় থেকে কম সংখ্যক বিয়োগ করছি তা নিশ্চিত করার জন্য বিশেষ হ্যান্ডলিং:
small - big becomes -(big - small)
গুণফল এন্ট্রি-লেভেল ম্যাথ ব্যবহার করে:
475(a) x 32(b) = 475 x (30 + 2)
= 475 x 30 + 475 x 2
= 4750 x 3 + 475 x 2
= 4750 + 4750 + 4750 + 475 + 475
যে উপায়ে এটি অর্জন করা হয় তাতে একবারে (পিছনের দিকে) একবারে 32 টির প্রতিটি অঙ্ক বের করা জড়িত থাকে তারপরে ফলাফলটিতে যুক্ত করার জন্য একটি মান গণনা করার জন্য অ্যাড ব্যবহার করে (প্রাথমিকভাবে শূন্য)।
ShiftLeft
এবং ShiftRight
অপারেশনগুলি দ্রুত গুন বা ভাগ করতে ব্যবহৃত হয়LongInt
মোড়ানো মোড়কের মান ("বাস্তব" গণিতের জন্য 10) দ্বারা । উপরের উদাহরণে, আমরা 950 (ফলাফল = 0 + 950 = 950) পেতে 2 বার শূন্যের 2 বার (32 এর শেষ সংখ্যা) যুক্ত করি।
তারপরে আমরা 4750 টি পেতে শিফটটি 4750 এবং ডান শিফটটি 32 পেতে 3 টি পেতে বামে 4750 থেকে 3 বার শূন্যস্থানে 14250 পেতে তারপরে 950 এর ফলাফল যুক্ত করুন 15200 পেতে।
47500 পেতে বাম শিফট 4750, ডান শিফট 3 পেতে 0 পেতে। ডান স্থানান্তরিত 32 এখন শূন্য হওয়ায়, আমরা সমাপ্ত এবং বাস্তবে 475 x 32 সমান 15200 করে 15
বিভাগ (জন্য "gazinta" পদ্ধতি "মধ্যে যায়") এছাড়াও চতুর কিন্তু প্রথম দিকে গাণিতিক উপর ভিত্তি করে। নিম্নলিখিত দীর্ঘ বিভাগ বিবেচনা করুন 12345 / 27
:
457
+-------
27 | 12345 27 is larger than 1 or 12 so we first use 123.
108 27 goes into 123 4 times, 4 x 27 = 108, 123 - 108 = 15.
---
154 Bring down 4.
135 27 goes into 154 5 times, 5 x 27 = 135, 154 - 135 = 19.
---
195 Bring down 5.
189 27 goes into 195 7 times, 7 x 27 = 189, 195 - 189 = 6.
---
6 Nothing more to bring down, so stop.
অতএব 12345 / 27
হয় 457
বাকি সঙ্গে 6
। যাচাই করুন:
457 x 27 + 6
= 12339 + 6
= 12345
এটি ড্র-ডাউন ভেরিয়েবল (প্রাথমিকভাবে শূন্য) ব্যবহার করে একবারে 12345 একের সেগমেন্টগুলি আরও 27 বা এর সমান হওয়া অবধি নামিয়ে আনতে প্রয়োগ করা হয়।
তারপরে আমরা কেবল 27 থেকে বিয়োগ করবো যতক্ষণ না আমরা 27 এর নীচে নামি - বিয়োগের সংখ্যাটি শীর্ষ রেখায় যোগ করা অংশটি।
যখন নামার জন্য আর কোনও বিভাগ নেই, তখন আমাদের ফলাফল হয়।
মনে রাখবেন এগুলি বেশ বেসিক অ্যালগরিদম। জটিল সংখ্যাগুলি করার আরও অনেক ভাল উপায় আছে যদি আপনার সংখ্যাগুলি বিশেষত বড় হতে চলেছে। আপনি জিএনইউ মাল্টিপল প্রিসিশন অ্যারিমেটিক লাইব্রেরির মতো কিছু দেখতে পারেন - এটি আমার নিজের লাইব্রেরির চেয়ে যথেষ্ট উন্নত এবং দ্রুত।
এটির পরিবর্তে দুর্ভাগ্যজনক ভুল ধারণা রয়েছে যে এটি মেমরির বাইরে চলে গেলে সহজেই বেরিয়ে আসবে (আমার মতে সাধারণ উদ্দেশ্য গ্রন্থাগারের জন্য এটি মারাত্মক ত্রুটি) তবে, আপনি যদি অতীতটি দেখতে পারেন তবে এটি কী করে তা খুব সুন্দর।
যদি আপনি লাইসেন্সের কারণে এটি ব্যবহার করতে না পারেন (বা কারণ আপনার অ্যাপ্লিকেশনটি কেবল কোনও আপাত কারণ ছাড়াই আপনি বেরিয়ে আসতে চান না) তবে আপনি নিজের কোডটিতে সংহত করার জন্য কমপক্ষে সেখান থেকে অ্যালগরিদম পেতে পারেন।
আমি আরও জানতে পেরেছি যে এমপিআইআর (জিএমপি-র একটি কাঁটাচালক ) এ থাকা বোডগুলি সম্ভাব্য পরিবর্তনগুলি নিয়ে আলোচনার জন্য আরও সুসজ্জিত - এগুলি আরও বিকাশকারী-বান্ধব গুচ্ছ বলে মনে হয়।