সমস্যা ১ – জোড়-বিজোড় ১
সমস্যার বিবরণ
কোনো একটি পূর্ণসংখ্যা দেওয়া থাকবে, সেটি জোড় না বিজোড় তা বের করতে হবে।
(সমস্যাটির অনলাইন লিঙ্ক: http://bit.ly/1-52-problem-1)
ইনপুট
প্রথম লাইনে একটি সংখ্যা T (1<=T<=100) দেওয়া থাকবে। পরবর্তীতে T-এর মান যত, ততটি লাইন থাকবে। প্রতিটি লাইনে একটি করে পূর্ণসংখ্যা n (0<=n<=2147483647) দেওয়া থাকবে।
আউটপুট
প্রতিটি পূর্ণসংখ্যার জন্য, সংখ্যাটি জোড় হলে even আর বিজোড় হলে odd কথাটি প্রিন্ট করতে হবে।
উদাহরণ
| ইনপুট | আউটপুট |
|---|---|
| 3 100 0 1111 |
even even odd |
সমাধান দেখুন
সমাধান
জোড়-বিজোড় সংখ্যার সঙ্গে ছোটবেলা থেকেই তোমরা পরিচিত। সমস্যার বর্ণনায় প্রথমেই বলা আছে কোনো একটি সংখ্যা দেওয়া থাকলে সেটি জোড় না বিজোড় তা বের করতে হবে। খুবই সহজ একটি সমস্যা (মানে সমাধান সহজ আর কী)।
যেকোনো প্রোগ্রামিং করার আগে সেটি মনোযোগ দিয়ে পড়ে নিতে হবে। প্রথমেই ইনপুট/আউটপুটের দিকে খেয়াল কর। ইনপুটে বলা আছে প্রথম লাইনে একটি পূর্ণ সংখ্যা T থাকবে। T-এর মান যত পরবর্তী ঠিক ততটি লাইনে একটি করে পূর্ণ সংখ্যা n দেওয়া থাকবে। এখানে দেখ, পূর্ণ সংখ্যাটির একটি রেঞ্জ দেওয়া আছে 0 থেকে 2147483647-এর মধ্যে। তোমরা যে int টাইপের ভ্যারিয়েবল ব্যবহার কর সেটির সর্বোচ্চ মান হচ্ছে 2147483647। তার মানে int টাইপের ভ্যারিয়েবল ব্যবহার করলেই চলবে।
উদাহরণ ইনপুটে দেখ, প্রথম লাইনে দেওয়া আছে 3 এবং পরবর্তী তিনটি লাইনে তিনটি আলাদা আলাদা সংখ্যা, 100, 0, 1111 দেওয়া আছে। এবার আউটপুটে দেখ, প্রথম সংখ্যা 100-এর জন্য আউটপুটে আছে even, দ্বিতীয় সংখ্যা 0-এর জন্য আউটপুটে দেওয়া আছে even, তৃতীয় সংখ্যা 1111-এর জন্য আউটপুটে দেওয়া আছে odd।
এবার আমাদের কোড লেখার পালা। প্রথমেই main() ফাংশনে ভ্যারিয়েবল ডিক্লেয়ার করে নিতে হবে।
int T, i, n;
T ব্যবহার করব প্রথম ইনপুটটি নেওয়ার জন্য (যেটি নির্দেশ করবে যে এর পর আর কয়টি সংখ্যা আছে), i ব্যবহার করব for লুপের ইনডেক্স হিসেবে আর n হচ্ছে আমরা T-সংখ্যক লাইনে যে সংখ্যাগুলো ইনপুট হিসেবে নেব সে জন্য। এ জন্য আমরা T-এর মান ইনপুট নেব।
scanf("%d", &T);
for লুপটি T সংখ্যকবার চলবে।
for(i = 1; i <= T; i++) { }
লুপ চলার সময় প্রতিবার আমরা n-এর মান ইনপুট নিব।
scanf("%d", &n);
যদি n দুই দ্বারা বিভাজ্য হয় তাহলে প্রিন্ট করব even। অন্যথায় প্রিন্ট করব odd।
if (n % 2 == 0)
{
printf("even\n");
}
else
{
printf("odd\n");
}
সমস্যার বর্ণনায় নিউলাইন প্রিন্ট করার কথা বলা না থাকলেও আমি দুটি printf()-এর শেষে একটি করে নিউলাইন প্রিন্ট করেছি। কারণ, লক্ষ করে দেখো উদাহরণ আউটপুটে even, odd এগুলো প্রতিটি নতুন লাইনে প্রিন্ট করা আছে।
মনে রাখতে হবে, সমস্যার বর্ণনায় বলা আছে ঠিক সেভাবেই আউটপুট প্রিন্ট করতে হবে। অনেক সময় দেখা যায় তোমরা নিজেদের ইচ্ছামতো “This is an even number” এভাবে প্রিন্ট করো। আবার অনেক সময় দেখা যায় Even, Odd এভাবে প্রিন্ট করো। এভাবে করা যাবে না। আউটপুটে সব ছোট হাতের অক্ষরে থাকলে ছোট হাতের অক্ষরেই প্রিন্ট করতে হবে, নইলে উত্তর ভুল হবে।
এবার পুরো প্রোগ্রামটি নিচে দেখি:
#include<stdio.h>
int main()
{
int T, i, n;
scanf("%d", &T);
for(i = 1; i <= T; i++)
{
scanf("%d", &n);
if (n % 2 == 0)
{
printf("even\n");
}
else
{
printf("odd\n");
}
}
return 0;
}
সমস্যা ২ – জোড়-বিজোড় ২
সমস্যার বিবরণ
কোনো একটি পূর্ণসংখ্যা দেওয়া থাকবে, সেটি জোড় না বিজোড় তা বের করতে হবে।
(সমস্যাটির অনলাইন লিঙ্ক: http://bit.ly/1-52-problem-2)
ইনপুট
প্রথম লাইনে একটি সংখ্যা T (1<=T<=100) দেওয়া থাকবে। পরবর্তীতে T সংখ্যক লাইন একটি করে ঋণাত্মক নয় (Non-negative) পূর্ণসংখ্যা n দেওয়া থাকবে। একটি সংখ্যায় সর্বোচ্চ 100টি অঙ্ক (digit) থাকতে পারে।
আউটপুট
প্রতিটি পূর্ণসংখ্যার জন্য, সংখ্যাটি জোড় হলে even আর বিজোড় হলে odd প্রিন্ট করতে হবে।
উদাহরণ
| ইনপুট | আউটপুট |
|---|---|
| 3 100 0 1111 |
even even odd |
সমাধান দেখুন
সমাধান
তোমার যদি আগের সমস্যাটির সমাধান করা থাকো, তাহলে সেটি আবার জমা দাও। উত্তর কী পেলে? রং আনসার?
আগের সমস্যার সঙ্গে এই সমস্যাটির পার্থক্য কোথায়? মাত্র একটি জায়গায়। বলা আছে যে সংখ্যাটিতে সর্বোচ্চ 100-টি অঙ্ক থাকতে পারে। 100-টি অঙ্ক মানে কিন্তু অনেক বড় সংখ্যা। int ভ্যারিয়েবল হচ্ছে 32 বিট, তার মানে এই ধরনের ভ্যারিয়েবলে 232-টি সংখ্যা রাখা যায়। 232 মানে 4294967296। তাহলে যদি signed int ধরি অর্থাৎ ঋণাত্মক ও ধনাত্মক উভয় ধরনের সংখ্যাই রাখি, তাহলে আমরা -231 থেকে 231-1 পর্যন্ত সংখ্যা (-2147483648 থেকে 2147483647) রাখতে পারব।
আর যদি unsigned int ব্যবহার করা, তাহলে 0 থেকে 4294967295 পর্যন্ত সংখ্যা রাখা যাবে। তোমাদের মনে রাখার জন্য এখানে একটা চার্ট দিয়ে দিলাম।
| ডেটা টাইপ | সর্বনিম্ন সীমা বা লিমিট | সর্বোচ্চ সীমা বা লিমিট | মোট সংখ্যা |
|---|---|---|---|
| signed int | -231 = -2147483648 | 231-1 = 2147483647 | 232 = 4294967296 টি |
| unsigned int | 0 | 232-1 = 4294967295 | 232 = 4294967296 টি |
আরেক ধরনের ডেটা টাইপ আছে, যাকে long long int এর ফরম্যাট স্পেসিফায়ার হচ্ছে %lld (প্রথম দুইটি এল)। এটি 64 বিট। এখন তোমরা বের করো, এই ভ্যারিয়েবলে কত পর্যন্ত সংখ্যা রাখা যাবে। দেখবে 19 অঙ্কের বেশি নয়। কিন্তু আমাদের দরকার 100 অঙ্কের সংখ্যা রাখতে পারে, এমন ভ্যারিয়েবল!
আসলে এখানে স্ট্রিং ব্যবহার করতে হবে। আর জোড় না বিজোড়, সেটি বোঝা যাবে স্ট্রিংয়ের শেষ ক্যারেক্টারটি বা বর্ণটি পরীক্ষা করলেই। তাহলে আমাদের প্রোগ্রামটি দাঁড়াবে এ রকম:
#include<stdio.h>
#include<string.h> // strlen ব্যবহারের জন্য
int main()
{
int T, i;
char n[101]; // 100 অঙ্কের জন্য 101 সাইজের অ্যারে
int len;
scanf("%d", &T);
for(i = 1; i <= T; i++)
{
scanf("%s", &n);
len = strlen(n);
// শেষ অঙ্কটি জোড় কি না তা পরীক্ষা করি
if ((n[len-1] - '0') % 2 == 0)
{
printf("even\n");
}
else
{
printf("odd\n");
}
}
return 0;
}
তাহলে প্রোগ্রাম ঠিকঠাকভাবে লিখে ওয়েবসাইটে গিয়ে জমা দাও।