Wednesday, September 11, 2013

1's compliment 2's compliment

1’s compliment:
case 1:
  1001                       1001
 -1000             =>      0111(complimented)
__________                  __________
                               10000
              =>                    1
                           -----------
                               0001   

why? -->  a-b = a + (1111-b) – 1111
if a + (1111-b) > 1111 ans is posetive.
when a + (1111-b) > 1111 then a + (1111-b) have to be bigger than three bit.
So, a-b = a + (1111-b) -1111 = a + (1111-b) – 1000 + 1.
case 2: when a + (1111-b) < 1111
  1000                       1000
 -1001             =>      0110(complimented)  
__________                  __________
                               1110 => -0001(complimented)
So, a-b = a + (1111-b) -1111 =  - (1111 – (a + (1111-b)) ).

2’s compliment:
case 1:
  1001                       0111(complimented)
 -1000             =>      +   1
__________                  __________
                               1000
              =>             1001
                           -----------
                              10001 => 0001
a-b = a + (1111-b + 1) -10000.
case 2:
  1000                       0110 (complimented)  
 -1001             =>        +1
__________                  __________
                                0111
                             +1000
                           ----------
                               1111 =>      0000(complm.) + 1 = 0001
 => - 0001

why ? a - b = a + (1111 - b + 1) -10000 = - ( (1111 – (a + (1111 - b + 1) ) ) + 1 )

Wednesday, August 21, 2013

তোমরা এখান থেকে কিছু সহজ সমস্যা সমাধান শুরু করো।
http://cpbook.subeen.com/p/blog-page_11.html

Friday, March 8, 2013

Some application of loops:


## You are told to "do something" until u get  EOF(End of file) or you are not told when you would stop


while (scanf("%d",&n) == 1)
{
//do something
}


scanf যতটা আলাদা আলাদা জিনিস ইনপুট নেয় তত return করে। এখানে একটা জিনিস ইনপুট নিছে তাই, 1 return করছে। দুটা ইনপুট নিলে 2 return করত। যেই পর্যন্ত সে কিছু পাবে ওই পর্যন্ত সে scan করবে। যখন পাবে না তখন  EOF অর্থাৎ -1 return করবে, আর তখন লুপ ব্রেক করবে।

or


while (scanf("%d",&n) != EOF)
{
//do something
}

EOF পাওয়ার আগ পর্যন্ত loop চালাবে। EOF এর মান -1

or


while (scanf("%d",&n) != -1)
{
//do something
}

একই জিনিস। EOF এর বদলে -1 দেয়া হইছে।

## You are told to "do something" until u get n = 0


while (scanf("%d",&n) != EOF && n != 0)
{
//do something
}

দুইটা শর্ত-এর যেকোন একটা false হলেই loop break করবে। scan করে 0 পেলেই লুপ ব্রেক করবে।

## iterating a string:

ধরি আমাদের একটা স্ট্রিং দেয়া আছে, এর মাঝে কতটা small latter আছে বের করতে হবে;


char str[100];

// str এ কোন কিছু scan করব।

int count=0,len = strlen(str);  // strlen() is a library function, need to declare #include<string.h> to use it                                                                                                                  

for (int i = 0; i < len; i += 1)  // কোন স্ট্রিং এর length lenn হলে এর character গুলোর  index 0 -> len-1
{
if(str[i] >= 'a' && str[i] <= 'z') count++;
}

কাজটা একটু অন্য ভাবেও কওরা যায়। string এর শেষে যেহেতু NULL অর্থাৎ  '\0' থাকে তাই একে লেখা যায়



int count=0;                                                                                                                

for (int i = 0; str[i] != '\0' ; i += 1)  // NULL পাওয়ার আগ পর্যন্ত loop চলবে।
{
if(str[i] >= 'a' && str[i] <= 'z') count++;
}

কোন condition true হলে 1 return হয়, নাহলে 0. condition এ 0 ছাড়া অন্য সবকিছুর মান এর কাছে true. NULL এর ASCI value 0. মানে NULL মানে false আর সবকিছু true. তাই loop টা এইভাবেও লেখা যায়।


int count=0;                                                                                                                

for (int i = 0; str[i] ; i += 1)  // str[i] এর value '\0' অর্থাৎ 0 হলেই loop ব্রেক করবে।
{
if(str[i] >= 'a' && str[i] <= 'z') count++;
}

find n-th Fibonacci number :

Fibonacci series: 0 1 1 2 3 5 8 13 21 ....
এই সিরিজের প্রথম ও দ্বিতীয় পদ ১, এর পরের যেকোন পদের মান তার আগের দুই পদের যোগফল।

CODE:


long long first,second,third,n; // ফিবনাচ্চি সিরিজ খুব দ্রুত বাড়ে, তাই long long, এটা দিয়েও
                                               // বড় n এর জন্য মান বের করা যাবে না
first=0;
second = third = 1; // হ্যাঁ, এমনে একবারে দুইটার মান change করা যায়।

//  ->  scan n, we would find n'th fibonacci number
// প্রতিবার আমরা third পদ বের করব যখন আমাদের আগের দুই(second, first) পদ যানা আছে।


for (int i = 3; i <= n; i += 1)
{
third = first + second; // n তম পদ আগের দুই পদের যোগফল।
first = second; // আগের second এখন first পদ হয়ে গেছে।
second = third; // আগের third এখন second পদ হয়ে গেছে।
// আগে first কে change ও পরে second কে change করা হয়েছে।
// উল্টোটা করলে কি কাজ করতো?
}
 if(n == 1)   // -> print 0  // first Fibonacci number is 0
else
//  -> print third



( কোন একটা কারণে বাংলা কিছু যুক্ত বর্ণ ঠিকভাবে দেখাচ্ছে না। কষ্ট করে বুঝে নিও )