সি দিয়ে কিভাবে 10^6(1000000) ডিজিটের সংখ্যা ইনপুট নেয়া যায়?

এই প্রবলেমটি https://www.hackerrank.com/challenges/big-sorting সলভ করতে গিয়ে এত বড় সংখ্যা ইনপুট নেয়ার পর আউটপুটে গারবেজ ভ্যালু দেখাচ্ছে।

asked 23 May '17, 05:27

shameem's gravatar image

shameem
334

edited 23 May '17, 17:51

menon's gravatar image

menon
4.7k335


আপনাকে গারবেজ ভেলু দেখাচ্ছে । কারণ আপনি হয়ত ডাটা টাইপ int or long long int or unsigned int ব্যবহার করেছেন । আসলে 10^6 ডিজিটের সংখ্যা এইগুলার কোনটা তেই ধরবে না । long long int ম্যাক্স ২০ ডিজিটের সংখ্যা ধরতে পারবে । এর থেকে বড় হলে গারবেজ ভেলু দেখাবে ।

তাহলে প্রশ্ন হল 10^6 ডিজিটের সংখ্যা ইনপুট নেব কিভাবে ?

এর উত্তর হল আপানাকে স্ট্রিং হিসাবে ইনপুট নিবেন । আপনার এই সমস্যার জন্য আপনি একটা char অ্যারে লিখতে পারেন এইভাবে

char number[1000005];

এতে আপনি ইনপুট নিবেন এইভাবে

scanf("%s", &number);

এখন আপানাকে যেহেতু এই ধরনের অনেকগুলো সংখ্যা ইনপুট নিতে হবে এইজন্য আপনাকে একটা 2D char অ্যারে লিখতে হবে । আমি ধরে নিলাম আপানাকে ম্যাক্স ১০০ টা সংখ্যা ইনপুটে থাকবে । এই জন্য 2D অ্যারে টা দেখতে এইরকম হবে ।

char numbers[100][1000005];

এখন আপনি একটা for লুপ চালায়া ইনপুট নিতে পারবেন । এইভাবে ।

for(i = 0; i < n; i++) {
    scanf("%s", &numbers[i]);
}

ইনপুট নেয়া শেষ এখন সর্ট করার পালা । int এর জন্য তো <, > দিয়ে চেক করা যেত যে কোনটা বড় বা ছোটো । কিন্তু আমাদের ইনপুট তো int না এটা একটা স্ট্রিং এটাকে কিভাবে ছোটো বড় চেক করবেন ?

কাজটা খুব সহজ । আমরা সর্ট করার সময় কি করি ? লিস্ট থেকে প্রতিবার ২ টা করে সংখ্যা নেয় এবং তুলনা করি ছোটো না বড় যদি ছোটো হয় তবে আমরা swap করি । এখানেও আমরা একই কাজটি করবে । এটা জন্য এলগরিদম টা এই রকম হবে ।

  • আমরা ২ টা সংখ্যা নেবো । সর্টিং এলগরিদমে যেভাবে ২ টা int নেয় সেভাবে ।
  • এখন দেখব যদি ২ টা সংখ্যার স্ট্রিং এর length সমান হয় তবে দেখব lexicographically কোন স্ট্রিং টি ছোটো । যেটা ছোটো সেটাই ছোটো সংখ্যা । সেটাকে আগেই রাখতে হবে ।
  • যদি সংখ্যার স্ট্রিং length সমান না হয় তবে যেটার length ছোটো সেটা আসলে ছোটো সংখ্যা ।
  • এই প্রসেস টা চলতে থাকবে । যতক্ষণ না সব সংখ্যা সর্ট হয় ।

এর জন্য কোড টা এই রকম লিখা যেতে পারে ।

if(strlen(first_number) == strlen(second_number)) {

    if(strcmp(first_number, second_number) > 1) { // if true then first_number is > second_number
         // now swap this two number
    }
}
else if(strlen(first_number) > strlen(second_number)){
   // swap this two number
}

ধন্যবাদ :)

permanent link

answered 23 May '17, 17:48

menon's gravatar image

menon
4.7k335

ধন্যবাদ ভাইয়া।

(26 May '17, 02:23) shameem
Your answer
toggle preview

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Markdown Basics

  • *italic* or _italic_
  • **bold** or __bold__
  • link:[text](http://url.com/ "title")
  • image?![alt text](/path/img.jpg "title")
  • numbered list: 1. Foo 2. Bar
  • to add a line break simply add two spaces to where you would like the new line to be.
  • basic HTML tags are also supported

Question tags:

×90
×7
×5
×3

question asked: 23 May '17, 05:27

question was seen: 661 times

last updated: 26 May '17, 02:23