আবারো চলে এলাম আপনাদের মাঝে। গত পর্বে আমরা আলোচনা করেছিলাম কীভাবে বিশাআআআআআআআআআল বড় একটা সংখ্যাকে আরেকটা সংখ্যা দিয়ে ভাগ করে তার ভাগশেষটা খুব সহজে এবং O(বড় সংখ্যার ডিজিট) কমপ্লেক্সিটিতে বের করে ফেলা যায়! আজ আমরা কি শিখতে পারি? হ্যা,বঞ্চিত হয়ে আসা ”ভাগফল” টাও কীভাবে নিখুঁতভাবে বের করে ফেলা যায়,আজ আমরা সেটা শিখে ফেলতে পারি।

প্রথমেই বলে রাখি,যারা  শেষ পর্বটি পড়ে আসিনি,তারা যেন অবশ্যই এখান থেকে সেটি পড়ে আসি। এবং অবশ্যই ভাগশেষ বের করার প্রক্রিয়াটি এবং কোডটি বুঝে আসি। আমি যথেষ্ট সহজ ভাষায় ব্যাখ্যা করার চেষ্টা করেছি,যদি কোনো প্রশ্ন থাকে তাহলে অবশ্যই যেন আমাকে জানানো হয়। 🙂

আচ্ছা,মনে আছে গত পর্বের কোডটার কথা? চলো আরেকবার একটু দেখে আসিঃ

#include <stdio.h>
#include <string.h>
 
int main()
{
    char bhajjo[1000];
    long long i,bhajok,bhagshesh=0;
 
    scanf("%s",bhajjo);
    scanf("%lld",&bhajok);
 
    int l=strlen(bhajjo);
 
    for(i=0; i<l; i++)
    {
        bhagshesh = ((bhagshesh*10) + (bhajjo[i]-'0') )%bhajok; // Amra character theke integer e convert kore nilam '0' biyog kore
    }
    printf("%lld\n",bhagshesh);
    return 0;
}

এবং জাভাতেঃ

import java.util.Scanner;


public class Main{
    static Scanner sc= new Scanner(System.in);
    
    public static void main(String[] args){
        char[] bhajjo = new char[1000];
        int i,bhajok,bhagshesh=0;
     
        bhajjo=sc.next().toCharArray();
        bhajok=sc.nextInt();
     
       int l=bhajjo.length;
     
        for(i=0; i<l; i++)
        {   
            
            bhagshesh = ((bhagshesh*10 + bhajjo[i]-'0')%bhajok); 
        }
        System.out.println(bhagshesh);
}
}

 

 

 

আচ্ছা,আমরা কোন প্রক্রিয়াতে ভাগশেষ বের করেছিলাম মনে আছে? ভাজ্যের একটা একটা অংক নামিয়ে নামিয়ে তাকে ১০ দিয়ে গুণ করে করে সামনে এগিয়ে গিয়েছি,যখনি সেটা ভাজকের সমান বা বড় হয়ে গিয়েছিলো,আমরা টুক করে তৎক্ষণাৎ সংখ্যাটাকে ভাজক দিয়ে ভাগ করে ভাগশেষটাকে সঙ্গে নিয়ে আরো সামনে এগিয়ে গিয়েছি! আচ্ছা,ভাগশেষ না হয় এভাবে বের করে যাচ্ছো,খেয়াল করে দেখো তো,ভাগফলটাও কিন্তু একই প্রক্রিয়াতেই বের করে আসছি আমরা এতকাল! 😀

ধরো,২৫৯২ কে আমরা ১৩ দিয়ে ভাগ করতে চাই। তাহলে আমরা কীভাবে এই ভাগফলটা বের করবো?

স্টেপ ১ঃ প্রথমে ২৫৯২ থেকে ২ কে নামিয়ে নিয়ে আসবো। তারপর চেক করে দেখবো যে,২ কে ১৩ দিয়ে ভাগ করলে ভাগফল কত থাকে। কিন্তু দেখো,২ কে ১৩ দিয়ে ভাগ করা যায়না,গেলেও সেটা শুণ্য হয়। আমরা তাই ২ এর পর আরেকটা অংক ৫ কে নামিয়ে নিয়ে আসতে পারি।

স্টেপ ২ঃ এবার সেই ২ এর সাথে ১০ গুণ দিয়ে আমরা একে ২০ বানাবো। তার সাথে জুড়ে দেবো ৫ কে। হয়ে গেলো ২৫ 😀 এবার চেক করবো যে,২৫ কে ১৩ দিয়ে ভাগ করলে কত হয়। ভাগফল আসলো “১”,আর ভাগশেষ আসলো ১২। আমরা এই ১২ কে পরবর্তী স্টেপ এ বহন করে নিয়ে যাবো।


১২*১০ + ৯ = ১২৯
১২৯/১৩ = “৯”
১২৯%১৩=১২

১২*১০ + ২ = ১২২
১২২/১৩=”৯”

১২২%১৩=৫  <— ভাগশেষ

এই প্রক্রিয়াটি আর সামনে আগাবে না। কারণ ভাজ্যের সব ডিজিট শেষ 😀

দেখো,কোটেড অংকগুলোই আমাদের ভাগফল। এগুলো শুরু থেকে প্রিন্ট করে দিলেই আমরা ভাগফলটা পেয়ে যাবো। অথবা আমরা একটা এ্যারেতে সেটা সেভ করে রেখে পরবর্তীতে যেকোনো জায়গায় কাজেও লাগাতে পারি।

তাহলে,ভাগফল যা আসছে তা হচ্ছেঃ ২৫৯২/১৩ = “১””৯””৯” এবং ভাগশেষ আসছে ৫ 😀

 

এর কোডটাও খুব সহজ! গত পর্বের কোডটা মাথায় রেখে এক লাইন দুই লাইন যোগ করেই তোমরা সম্পূর্ণ কোডটা লিখে ফেলতে পারো। চেষ্টা করে দেখো,না পারলে নিচে এসে কোডটা দেখে নিয়ো। তবে একেবারে চেষ্টা না করে কোডটা না দেখার অনুরোধ রইলোঃ

#include <stdio.h>
#include <string.h>

int main()

{

    char num[10000];

    long long i,l,number,mod=0;

    int carry=0;

    scanf("%s%lld",num,&number);

    l=strlen(num);
    printf("Bhaagfol: ");

    int print_done = 0;

    for(i=0; i<l; i++)
    {
        mod=(mod*10+num[i]-'0');
        if(mod<number && !print_done) continue;
        printf("%lld",mod/number);
        print_done = 1;
        mod = mod % number;
    }
    printf("\nBhaagshesh: %lld",mod);

    return 0;

}

জাভাতেঃ

import java.util.Scanner;

public class Main {

    static Scanner sc = new Scanner(System.in);

    public static void main(String[] args) {
        char[] bhaajjo = new char[1000];
        int i, bhaajok, bhaagshesh = 0,mod = 0;
          
        bhaajjo = sc.next().toCharArray();
        bhaajok = sc.nextInt();

        int l = bhaajjo.length;

        System.out.print("Bhaagfol: ");
        int print_done = 0;

        for (i = 0; i < l; i++) {
            mod = (mod * 10 + bhaajjo[i] - '0');
            if (mod < bhaajok && print_done==0) {
                continue;
            }
            System.out.print(mod / bhaajok);
            print_done = 1;
            mod = mod % bhaajok;
        }
        System.out.println("\nBhaagshesh: " + mod);
    }
}

আজ এ পর্যন্তই! 🙂

সংশোধনঃ ধন্যবাদ আদিবাকে সি কোডটার একটি ভুল ধরিয়ে দেয়ার জন্য। ঠিক করে দেয়া হয়েছে।