একটি পূর্ণসংখ্যা সমান বা বিজোড় কিনা তা আমি কীভাবে পরীক্ষা করব? [বন্ধ]


193

প্রদত্ত নম্বরটি সিতে সমান বা বিজোড় কিনা তা আমি কীভাবে পরীক্ষা করতে পারি?


5
বিটওয়াইজ এবং (&) ব্যবহার করা সংস্করণটি মডিউলো (%) সংস্করণের চেয়ে অনেক বেশি দক্ষ। আপনি সঠিক উত্তর হিসাবে বেছে নিয়েছেন এমন একটি পরিবর্তন করা উচিত।
স্টিফান রুসেক 11

6
মতবিরোধ মত নয় - যুক্তি একটি ধ্রুবক। অপ্টিমাইজারের জন্য সহজ
এমএসএলটাররা

2
পাঠযোগ্যতার কারণগুলিও এটির মধ্যে।
ব্রায়ান জি

2
এম্বেড থাকা অ্যাপ্লিকেশনগুলিতে (বিশ্ব যেখানে আমি আমার প্রোগ্রামিংয়ের বেশিরভাগ সময় ব্যয় করি), কিছু প্রসেসরের খুব আদিম গাণিতিক ইউনিট থাকে এবং সহজেই বিভাগ / মডুলাস অপারেশন করতে পারে না। এই কারণে, আমি সাধারণত এর পরিবর্তে বিটওয়াইস-এবং পদ্ধতিটি ব্যবহার করি। তবে, একটি আধুনিক ডেস্কটপের সিপিইউতে এটি হবে না।
বিটিএ

3
মডুলাস অপারেশনটি বোঝার জন্য সহজ হতে আমি খুঁজে পাই নি। আমি যখন প্রথম বা এমনকি বা বিজোড় নির্ধারণ করার দরকার পড়েছিলাম তখন বিটওয়াইজ মাস্কটি প্রথম জিনিসটি মনে আসল। এটি কিছুটা প্রাকৃতিক, যেহেতু আমরা হাতের মাধ্যমে এটি করার প্রবণতা হ'ল এটির} 0 2 4 6 8} বা {1 3 5 7 9} হয় কিনা তা দেখার জন্য কমপক্ষে উল্লেখযোগ্য অঙ্কের দিকে নজর দেওয়া} এটি 0 বা 1 এর মধ্যে অন্তত তাৎপর্যপূর্ণ বিটটি দেখার জন্য সরাসরি অনুবাদ করে
পি ড্যাডি

উত্তর:


449

2 দ্বারা বিভাজক করার সময় অবশিষ্ট রয়েছে কিনা তা পরীক্ষা করতে মডুলো (%) অপারেটরটি ব্যবহার করুন:

if (x % 2) { /* x is odd */ }

কয়েক জন আমার উপরের উত্তরটির সমালোচনা করে বলেছেন যে x & 1 ব্যবহার করা "দ্রুত" বা "আরও দক্ষ"। আমি এটি বিশ্বাস করি না।

কৌতূহলের বাইরে আমি দুটি তুচ্ছ পরীক্ষার কেস প্রোগ্রাম তৈরি করেছি:

/* modulo.c */
#include <stdio.h>

int main(void)
{
    int x;
    for (x = 0; x < 10; x++)
        if (x % 2)
            printf("%d is odd\n", x);
    return 0;
}

/* and.c */
#include <stdio.h>

int main(void)
{
    int x;
    for (x = 0; x < 10; x++)
        if (x & 1)
            printf("%d is odd\n", x);
    return 0;
}

এরপরে আমি আমার মেশিনে 5 টি ভিন্ন সময়ে জিসিসি 4.1.3 দিয়ে এগুলি সংকলন করেছি:

  • কোনও অপ্টিমাইজেশন পতাকা নেই।
  • সাথে -ও
  • সাথে -ও
  • -ও 2 সহ
  • সাথে -O3

আমি প্রতিটি সংকলনের (জিসিসি-এস ব্যবহার করে) বিধানসভা আউটপুট পরীক্ষা করে দেখেছি যে প্রতিটি ক্ষেত্রে and.c এবং modulo.c এর আউটপুট অভিন্ন ছিল (তারা উভয়ই andl $ 1,% eax নির্দেশ ব্যবহার করেছিল)। আমি সন্দেহ করি এটি একটি "নতুন" বৈশিষ্ট্য, এবং আমার সন্দেহ হয় যে এটি প্রাচীন সংস্করণগুলির সাথে সম্পর্কিত। আমি যে কোনও আধুনিককে (বিগত 20 বছরে তৈরি) সন্দেহ করি নন-আরকেন সংকলক, বাণিজ্যিক বা উন্মুক্ত উত্সে, এমন অপ্টিমাইজেশনের অভাব রয়েছে। আমি অন্যান্য সংকলকগুলিতে পরীক্ষা করতাম, তবে এই মুহুর্তে আমার কোনও উপলব্ধ নেই।

অন্য কেউ যদি অন্য সংকলক এবং / অথবা প্ল্যাটফর্মের লক্ষ্যগুলি পরীক্ষা করতে যত্নবান হন এবং অন্যরকম ফলাফল পান তবে আমি এটি জানতে আগ্রহী।

পরিশেষে, স্বাক্ষরকৃত পূর্ণসংখ্যার বাস্তবায়নের উপস্থাপনা নির্বিশেষে পূর্ণসংখ্যাটি ধনাত্মক, negativeণাত্মক বা শূন্য কিনা তা কার্যকর করার জন্য মানক দ্বারা মডুলো সংস্করণটি গ্যারান্টিযুক্ত । বিটওয়াইস-এবং সংস্করণটি নয়। হ্যাঁ, আমি বুঝতে পারি যে দুটির পরিপূরক কিছুটা সর্বব্যাপী, সুতরাং এটি আসলে কোনও সমস্যা নয়।


11
প্রশ্নটি বিশেষত সিটিতে এটি কীভাবে করা উচিত তা জিজ্ঞাসা করেছিল তাই আমি জাস্টে এটি কীভাবে করতে পারি তা চুস্টারের উল্লেখ থাকা সত্ত্বেও আমি সিটিতে এর উত্তর দিয়েছিলাম। আমি দাবি করিনি বা বোঝাইনি এটি একটি জাভা উত্তর ছিল, আমি জাভা জানি না। আমি মনে করি আমি সবেমাত্র আমার প্রথম ডাউনটি পেয়েছি এবং কেন তা নিয়ে বিভ্রান্ত। আচ্ছা ভালো.
ক্রিস ইয়ং

33
আমি বলব, যদি (x% 2! = 0) {/ * x বিজোড় হয় * /}, তবে কে জানে। জাভাও জানে না।
ইউজেনস্ক

9
আমাদের কর্মফলকে ভোটে ব্যয় না করে বিটওয়াইজ অপারেটর মুরনদের থেকে এটিকে আলাদা করার জন্য প্রচুর উদ্দীপনা পাচ্ছে।
wnoise

13
আমি একটি জিনিস ব্যতীত সমস্ত কিছুর সাথে একমত: আমি পূর্ণসংখ্যা এবং সত্যের মানকে ধারণাগতভাবে পৃথক রাখতে চাই, তাই আমি "যদি (x% 2 == 1)" লিখতে পছন্দ করি। এটি সংকলকটির সমান, তবে মানুষের কাছে সম্ভবত এটি আরও পরিষ্কার। এছাড়াও আপনি ভাষাগুলিতে একই কোড ব্যবহার করতে পারেন যা অ-শূন্যকে সত্য হিসাবে ব্যাখ্যা করে না।
টমাস প্যাড্রন-ম্যাকার্থি

46
আমার বেঞ্চমার্ক? কি মানদণ্ড? আমি কোনও বেঞ্চমার্কিং করিনি। আমি উত্পন্ন সমাবেশ ভাষা পরীক্ষা করেছি। প্রিন্টফের সাথে এর কোনও যোগসূত্র নেই।
ক্রিস ইয়ং

207

আপনি ছেলেরা খুব দক্ষ। আপনি যা চান তা হ'ল:

public boolean isOdd(int num) {
  int i = 0;
  boolean odd = false;

  while (i != num) {
    odd = !odd;
    i = i + 1;
  }

  return odd;
}

জন্য পুনরাবৃত্তি isEven

অবশ্যই, এটি নেতিবাচক সংখ্যার জন্য কাজ করে না। তবে তেজ নিয়ে ত্যাগ হয় ...


17
যদি আপনি নেতিবাচক মানগুলিতে একটি যুক্তি ব্যতিক্রম ছুঁড়ে ফেলেছেন এবং ডকুমেন্টেশনে উল্লেখ করেছেন যে এই ফাংশনটি হ'ল (এন), তবে আমি এটি দিয়ে ঠিক করব।
জেফ্রি এল হুইলেটজ

7
এন্টারপ্রাইজ সংস্করণে এক্সএমএল ব্যবহার করতে হবে। অবশ্যই আজকাল আপনার কাছে একটি ওয়েব পরিষেবা থাকবে যা আপনি জিজ্ঞাসা করতে পেরেছিলেন
মার্টিন বেকেট

58
আপনি চেহারা সারণী দিয়ে এটি অপ্টিমাইজ করা উচিত।
ওয়েবেল

1
আমি এমন একজন সন্ন্যাসী, আপনার 6,999 জনকে নতুন সহস্রাব্দে +1 করতে হয়েছিল
ইরান মেডান 10'12

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

97

বিট গাণিতিক ব্যবহার করুন:

if((x & 1) == 0)
    printf("EVEN!\n");
else
    printf("ODD!\n");

এটি বিভাগ বা মডুলাস ব্যবহারের চেয়ে দ্রুত।


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

21
আমি (x এবং 1) আরও ভাল পছন্দ করি কারণ এটি সংখ্যাটি একইভাবে লোকেরা করা হয় কিনা তা পরীক্ষা করে দেখায়: শেষ সংখ্যাটি সমান বা বিজোড় কিনা তা পরীক্ষা করে দেখুন। আমার মতে এটি মডুলো পদ্ধতির চেয়ে তার অভিপ্রায়টি বেশি যোগাযোগ করে। (এটি খুব বেশি গুরুত্ব দেয় না))
জেরেমি রুটেন

2
আপনি ঠিক বলেছেন, আমি অনুমান করি এটির সাবজেক্টিভ। যদিও "এমনকি" এর সাধারণ সংজ্ঞাটি "পূর্ণসংখ্যা যা 2 দ্বারা বিভাজ্য হয়", এটি "0, 2, 4, 6 বা 8 এর মধ্যে শেষ হয় এমন পূর্ণসংখ্যার" নয়। :-)
ক্রিস ইয়ং

4
@ ট্রাউমাপনি - এএনএসআই স্ট্যান্ডার্ড সি এবং প্রাথমিক জাভার জন্য কম্পিউটার সিস্টেমের উপর নির্ভর করে। এটা তোলে অনির্দিষ্ট কি উপস্থাপনা স্বাক্ষরিত সংখ্যার জন্য ব্যবহার করা হয় - 2 এর প্রশংসা, 1 এর প্রশংসা, ধূসর-কোডেড, ইত্যাদি কিন্তু মডুলাস সবসময় মডুলাস হয়
হারুন

9
Negativeণাত্মক সংখ্যার জন্য সর্বজনীনভাবে কাজ করে না। আরও বিশদের জন্য এই উত্তরটি দেখুন: বিশদ বিবরণের জন্য stackoverflow.com/questions/160930/…
অ্যান্ড্রু এডজকমবে

36

[জোক মোড = "চালু"]

public enum Evenness
{
  Unknown = 0,
  Even = 1,
  Odd = 2
}

public static Evenness AnalyzeEvenness(object o)
{

  if (o == null)
    return Evenness.Unknown;

  string foo = o.ToString();

  if (String.IsNullOrEmpty(foo))
    return Evenness.Unknown;

  char bar = foo[foo.Length - 1];

  switch (bar)
  {
     case '0':
     case '2':
     case '4':
     case '6':
     case '8':
       return Evenness.Even;
     case '1':
     case '3':
     case '5':
     case '7':
     case '9':
       return Evenness.Odd;
     default:
       return Evenness.Unknown;
  }
}

[জোক মোড = "অফ"]

সম্পাদনা: এনামগুলিতে বিভ্রান্তিকর মান যুক্ত হয়েছে।


2
বাহ ... এসসিডিএফ এর সমাধানের চেয়ে এটি আরও বেশি জঘন্য! যশ! যদিও কোনও আপভোট নেই ... এটি সুপারিশ করতে পারে না। তবে মজার জন্য ধন্যবাদ!
ওয়েজ পি

1
এই পদ্ধতির সুবিধাটি হ'ল এটি কেবল সংখ্যার চেয়ে বেশি কাজ করে। এছাড়াও, আপনি যদি এই লাইনটি প্রতিস্থাপন করেন: চর বার = foo [foo.Length - 1]; এর সাথে: ডাবল বার = Char.GetNumericValue (foo [foo.Length - 1]); তারপরে এটি যে কোনও নম্বর সিস্টেমের সাথে কাজ করবে।
জেফ্রি এল হুইলেটজ

5
ত্রুটি রিপোর্ট: 14.65 টি অজানা হিসাবে জানা উচিত যখন এটি অজানা হওয়া উচিত।
TheSoftwareJedi

4
সফ্টওয়্যার জেডি, এটি একটি "বৈশিষ্ট্য"। ;)
Sklivvz

31
থসফটওয়্যারজেডি: 14.65 হ'ল আমি যে আজবতম সংখ্যক পূর্ণসংখ্যার দেখা পেয়েছি।
ব্রুস অল্ডারম্যান

16

জবাবে ffpf - আমি ঠিক সহকর্মীর সাথে একই যুক্তি বছর পূর্বে ছিল, এবং উত্তর কোন এটি ঋণাত্মক সংখ্যা সাথে কাজ করে না।

সি স্ট্যান্ডার্ড নির্ধারণ করে যে negativeণাত্মক সংখ্যাগুলি 3 উপায়ে উপস্থাপন করা যেতে পারে:

  • 2 এর পরিপূরক
  • 1 এর পরিপূরক
  • চিহ্ন এবং প্রস্থ

এটি পরীক্ষা করা হচ্ছে:

isEven = (x & 1);

2 এর পরিপূরক এবং সাইন এবং প্রস্থের প্রতিনিধিত্বের জন্য কাজ করবে তবে 1 এর পরিপূরক নয়।

তবে আমি বিশ্বাস করি যে নিম্নলিখিত সকল ক্ষেত্রে কাজ করবে:

isEven = (x & 1) ^ ((-1 & 1) | ((x < 0) ? 0 : 1)));

পাঠ্য বাক্সটি চরিত্রের চেয়ে আমার চেয়ে কম পরে সমস্ত খাচ্ছে বলে উল্লেখ করার জন্য এফএফপিএফকে ধন্যবাদ!


আমি মনে করি আপনার দ্বিতীয় কোড উদাহরণটিতে কিছু পাঠ্য নেই।
জেফ ইয়েটস

3
আসুন সেই সংখ্যাগুলির প্রশংসা করি!
thejh

14

সুন্দর একটি হ'ল:

/*forward declaration, C compiles in one pass*/
bool isOdd(unsigned int n);

bool isEven(unsigned int n)
{
  if (n == 0) 
    return true ;  // I know 0 is even
  else
    return isOdd(n-1) ; // n is even if n-1 is odd
}

bool isOdd(unsigned int n)
{
  if (n == 0)
    return false ;
  else
    return isEven(n-1) ; // n is odd if n-1 is even
}

নোট করুন যে এই পদ্ধতিতে দুটি ফাংশন জড়িত লেজ পুনরাবৃত্তি ব্যবহার করুন। যদি আপনার সংকলক স্কিম সংকলকের মতো লেজ পুনরাবৃত্তি সমর্থন করে তবে এটি দক্ষতার সাথে প্রয়োগ করা যেতে পারে (কিছুক্ষণের মধ্যে / এক ধরণের লুপ পর্যন্ত রূপান্তরিত)। এই ক্ষেত্রে স্ট্যাকের উপচে পড়া উচিত নয়!


1
এটি isdd (0) ভালভাবে পরিচালনা করে না।
স্টিভ ম্যাকলিউড 11

1
আমি মনে করি আপনি কোনও অসামান্য মান সহ আইসওড () এর জন্য একটি লেগ (পুনরাবৃত্তি সহ) বা একটি স্ট্যাক ওভারফ্লো (লেজ পুনরাবৃত্তি ছাড়াই) পেয়েছেন। এটি কেবল সত্য দিয়েই শেষ হয়। এটি আবারও থামার সমস্যা।
জেফ্রি এল হুইলেটজ

7
ওহ, অবশ্যই, কোনও মন্তব্য না করে এটিকে ঠিক করুন, এবং আমাকে একটি বোকামির মতো দেখান। সেটা ঠিক আছে.
জেফ্রি এল হুইলেটজ

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

5
সংকলন ত্রুটি: সমস্ত নমুনা আপনার নমুনা কোডে বাগ মন্তব্য দিয়ে আপনাকে বোমা দেওয়ার জন্য একটি মান ঘৃণা করে না, তবে যখন আপনি কল করবেন তখন কী হয় ইভেন (5)
কেভিন

11

একটি সংখ্যা এমনকি দুটি, যখন দুটি দ্বারা বিভাজন করা হয়, তখন বাকী 0 হয় A একটি সংখ্যাটি বিজোড় হয় যখন 2 দ্বারা বিভাজিত হয়, অবশিষ্ট 1 হয়।

// Java
public static boolean isOdd(int num){
    return num % 2 != 0;
}

/* C */
int isOdd(int num){
    return num % 2;
}

পদ্ধতিগুলি দুর্দান্ত!


আপনার জাভা পদ্ধতিটি ভেঙে গেছে কারণ নেতিবাচক বিজোড় সংখ্যার জন্য সংখ্যা% 2 == -1।
ডাব্লুএমআর

তুমি কি আমাকে হতাশ করেছ?
jjnguy

3
আমি এটিকে ডাউনভোট করেছিলাম কারণ সিতে আপনার ফাংশনটি যা করে তার চেয়ে বেশি অক্ষর নেয়। আইই নাম্বার% I হ'ল স্পেস সহ আইওডড (আই) 8 টি অক্ষর। আপনি কেন এমন কোনও ক্রিয়াকলাপ তৈরি করবেন যা কেবল অপারেশন করার চেয়ে দীর্ঘতর?
কেভিন

13
আমার মতামত কোডে থাকা কেভিন অক্ষর দ্বারা পরিমাপ করা হয় না বরং চিন্তাভাবনা + ডিবাগের সময় সহ এটি লেখার সময় আপনাকে দেয়। আইওএসডি-র চেয়ে ভাবতে% 2% এক মিলিসেকেন্ড বেশি সময় নেয়। এখন বিশ্বব্যাপী সংখ্যা যুক্ত করুন এবং আপনি একটি সম্মিলিত বছর হারিয়েছেন। আইসডও পরীক্ষা করা যায়, যাচাই করা যায় এবং শেষ পর্যন্ত বাগ ফ্রি সার্টিফাইড (যেমন নেতিবাচক সংখ্যা হ্যান্ডলিং) যেখানে নাম্বার% 2 হিসাবে দেখা যায় - কিছু বিকাশকারীদের সর্বদা সন্দেহ থাকবে এবং পরীক্ষায় যেতে হবে। ভাল কোডটি এমন কোড যা আপনি লিখেন না, কেবল পুনরায় ব্যবহার করুন ... কেবল আমার 2 সেন্ট।
ইরান মেডান

2
@ ইরানমেডান, একই যুক্তি i++ প্রতিস্থাপনের ক্ষেত্রে বৃদ্ধি-বায়োইন (i) এর সাথে প্রয়োগ করবে এবং এটি ঠিক একটি ধারণা হিসাবে খারাপ। যদি কোনও বিকাশকারী নম্বর% 2 কী সম্পর্কে সন্দেহ করে তবে আমি আমার কোডের কাছে তাকে বা তার কাছে চাই না।
কেভিন


7

আমি এটিকে কেবল 2 দিয়ে ভাগ করব এবং যদি 0 টি বাকী থাকে তবে এটি সমান, অন্যথায় এটি অদ্ভুত।

মডিউলাস (%) ব্যবহার করা এটি সহজ করে তোলে।

যেমন। 4% 2 = 0 অতএব 4 টি 5% 2 = 1 তাই 5 টি বিজোড়


6

সমস্যার আরও একটি সমাধান
(শিশুরা ভোট দেওয়ার ক্ষেত্রে স্বাগত জানায়)

bool isEven(unsigned int x)
{
  unsigned int half1 = 0, half2 = 0;
  while (x)
  {
     if (x) { half1++; x--; }
     if (x) { half2++; x--; }

  }
  return half1 == half2;
}

না, আপনি যে ধরণের সন্তানের মতো আমি গণনা করেছি আপনি
নন

আমি এটি upvote করতে যাচ্ছি, কিন্তু এটি নেতিবাচক সংখ্যার উপর কিছুটা ধীর। :)
ক্রিস ইয়ং

3
সমস্ত সংখ্যা উজ্জ্বল এবং ধনাত্মক। নাকি কারও বিরুদ্ধে আপনি কুসংস্কার করছেন? :))
ইউজেনস্ক

3
কম্পিউটারে, সমস্ত সংখ্যা একবার নেতিবাচক হয়ে গেলে শেষ পর্যন্ত ধনাত্মক হয়ে যায়। আমরা এটিকে সুখের রোলওভার বলি (বিগনুমস, ওয়াইএমএমওয়াইয়ের জন্য প্রযোজ্য নয়, সমস্ত রাজ্যে বৈধ নয়)।
উইল হার্টং

@ উইল হার্টং "সুখের রোলওভার" দুর্দান্ত! : ডি
thejh

6

আমি পূর্ণসংখ্যার পার্টির একটি টেবিল (0 এমনকি যদি বিজোড় হলেও 1) তৈরি করব (সুতরাং কেউ একটি অনুসন্ধান করতে পারে: ডি), তবে জিসিসি আমাকে এই আকারের অ্যারে করতে দেয় না:

typedef unsigned int uint;

char parity_uint [UINT_MAX];
char parity_sint_shifted [((uint) INT_MAX) + ((uint) abs (INT_MIN))];
char* parity_sint = parity_sint_shifted - INT_MIN;

void build_parity_tables () {
    char parity = 0;
    unsigned int ui;
    for (ui = 1; ui <= UINT_MAX; ++ui) {
        parity_uint [ui - 1] = parity;
        parity = !parity;
    }
    parity = 0;
    int si;
    for (si = 1; si <= INT_MAX; ++si) {
        parity_sint [si - 1] = parity;
        parity = !parity;
    }
    parity = 1;
    for (si = -1; si >= INT_MIN; --si) {
        parity_sint [si] = parity;
        parity = !parity;
    }
}

char uparity (unsigned int n) {
    if (n == 0) {
        return 0;
    }
    return parity_uint [n - 1];
}

char sparity (int n) {
    if (n == 0) {
        return 0;
    }
    if (n < 0) {
        ++n;
    }
    return parity_sint [n - 1];
}

সুতরাং এর পরিবর্তে এর পরিবর্তে সমান এবং বিজোড় এর গাণিতিক সংজ্ঞাটি অবলম্বন করি।

একটি পূর্ণসংখ্যা n এর মধ্যে একটি পূর্ণসংখ্যা k উপস্থিত থাকলেও এন = 2 কে থাকে।

একটি পূর্ণসংখ্যা n এর মধ্যে বিজোড় হয় যদি এমন একটি পূর্ণসংখ্যা k থাকে যেমন এন = 2 কে + 1।

এটির জন্য কোডটি এখানে:

char even (int n) {
    int k;
    for (k = INT_MIN; k <= INT_MAX; ++k) {
        if (n == 2 * k) {
            return 1;
        }
    }
    return 0;
}

char odd (int n) {
    int k;
    for (k = INT_MIN; k <= INT_MAX; ++k) {
        if (n == 2 * k + 1) {
            return 1;
        }
    }
    return 0;
}

সি-পূর্ণসংখ্যা intপ্রদত্ত সি সংকলনের সম্ভাব্য মানগুলি চিহ্নিত করতে দিন । (দ্রষ্টব্য যে সি-পূর্ণসংখ্যাগুলি পূর্ণসংখ্যার একটি উপসেট।)

এখন কেউ চিন্তিত হতে পারে যে সি-ইন্টিজারে প্রদত্ত এন এর জন্য সি-ইন্টিজারের মধ্যে সংশ্লিষ্ট পূর্ণসংখ্যার কে উপস্থিত থাকতে পারে না। তবে একটি সামান্য প্রমাণের সাহায্যে এটি দেখানো যেতে পারে যে সমস্ত পূর্ণসংখ্যার জন্য এন, | এন | <= | 2 এন | (*), যেখানে | এন | "n যদি এন ইতিবাচক এবং অন্যথায় -n হয়" হয়। অন্য কথায়, পূর্ণসংখ্যায় সমস্ত এন এর জন্য নিম্নলিখিতগুলির মধ্যে কমপক্ষে একটি হোল্ড করে (ঠিক হয় কেস (1 এবং 2) বা কেস (3 এবং 4) বাস্তবে তবে আমি এটি এখানে প্রমাণ করব না):

কেস 1: এন <= 2 এন।

কেস 2: -ন <= -2 এন।

কেস 3: -ন <= 2 এন।

কেস 4: এন <= -2 এন।

এখন 2 কে = এন নিন। (N এর সমান থাকলে এরকম আক অস্তিত্ব রাখে তবে আমি এখানে এটি প্রমাণ করব না n n যদি তা না হয় তবে লুপটি যে evenকোনও উপায়ে তাড়াতাড়ি ফিরে আসতে ব্যর্থ হয়, তাই এটি কিছু যায় আসে না)) তবে এটি বোঝায় কে <এন যদি এন 0 দ্বারা (*) এবং এটি সত্য নয় (এখানে আবার প্রমাণিত হয় না) যে সমস্ত মিটারের জন্য, 2 মি = z ইঙ্গিতগুলিতে এম দেওয়া এম এর সমান নয় z 0 বোঝায় না। ক্ষেত্রে এন 0, 2 * 0 = 0 সুতরাং 0 টি এমনকি আমাদের হয়ে গেছে (যদি n = 0 হয় তবে 0 সি-ইন্টিজারে থাকে কারণ এন ফাংশনে সি-ইন্টিজারে থাকে even, তাই কে = 0 সি-ইন্টিজারে থাকে)। সুতরাং সি-পূর্ণসংখ্যার এ জাতীয় আকৃতি সি-ইন্টিজারে n এর জন্য উপস্থিত থাকে n

একটি অনুরূপ যুক্তি দেখায় যে n টি বিজোড় হলে সি-ইন্টিজারে আক থাকে যেমন এন = 2 কে + 1।

সুতরাং এখানে উপস্থাপিত evenএবং oddউপস্থাপিত সমস্ত সি-পূর্ণসংখ্যার জন্য সঠিকভাবে কাজ করবে।


1
আমি অপরাধ বলতে চাইছি না, তবে এই উত্তরের মূল বক্তব্য কী? i % 2এটি অনেক ছোট এবং সম্ভবত আরও দক্ষ।
GManNGG

2
@ জিএমান: তবে এটাই আরও নির্বিচারবাদী! এটি সমস্ত প্রান্তের কেস সনাক্ত করতে সঠিকভাবে কাজ করবে।
পি বাবা

1
... এবং (!!!) এটি সঠিক !!!
থমাস এডিং

আপনি মজা করছেন কি না তা আমি বলতে পারছি না। : এক্স %2সমস্ত পূর্ণসংখ্যার জন্য কাজ করে।
GManNickG

1
+1: আমি "ভাল উত্তর" বলতে চাইছিলাম তবে আমি মনে করি "আকর্ষণীয় উত্তর" আরও উপযুক্ত।
জেমস ওয়েবস্টার

5
// C#
bool isEven = ((i % 2) == 0);

2
কি? এটি সি # নয়! এটা খাঁটি সি! :
পি

8
খাঁটি সি তৈরি করার জন্য আমি তার চারপাশে একটি উইনফর্ম নিক্ষেপ করব ...
মাইকেল পেট্রোটা

@mateusza: সাধারণত যখন আপনি কিছু ক্যাপিটালাইজেশন বা C অন্যান্য মধ্যে "bool," দেখুন, এটি একটি এর typedefবা #defineবা কিছু।
ডেভিড থর্নলি

2
@mateusza @David Thornley সালে C99 bool, একটি প্রমিত বৈশিষ্ট্য (হয় en.wikipedia.org/wiki/Stdbool.h )
ফোরট্রান

1
বিশালভাবে অপ্রয়োজনীয় প্রথম বন্ধনী সম্পর্কে কথা বলুন ...
থমাস এডিং

4

জাভাতে এখানে একটি উত্তর দেওয়া হয়েছে:

public static boolean isEven (Integer Number) {
    Pattern number = Pattern.compile("^.*?(?:[02]|8|(?:6|4))$");
    String num = Number.toString(Number);
    Boolean numbr = new Boolean(number.matcher(num).matches());
    return numbr.booleanValue();
}

4

এটা চেষ্টা কর: return (((a>>1)<<1) == a)

উদাহরণ:

a     =  10101011
-----------------
a>>1 --> 01010101
a<<1 --> 10101010

b     =  10011100
-----------------
b>>1 --> 01001110
b<<1 --> 10011100

আপনি কি এই ব্যাখ্যা করতে পারেন? আমি বিটওয়াইজ অপারেটরদের সাথে খুব অপরিচিত
আব্দুল

ডান এবং তারপরে বামে স্থানান্তর করা আপনার শেষ বিটটি (সবচেয়ে ডানদিকে) শূন্য করবে। যদি নতুন সংখ্যাটি মূল হিসাবে একই হয় তবে এর অর্থ হ'ল মূল সংখ্যাটির শেষ বিট 0 ছিল So তাই এটি সমান। আমার আপডেট হওয়া উত্তরটি একবার দেখুন।
কিরিল আলেকসান্দ্রভ

ধন্যবাদ, আমি এখনই এটি পেয়েছি
আব্দুল

আমি নিশ্চিত না কোন পদ্ধতির দ্রুত হয়। আমি তাদের মানদণ্ড করার চেষ্টা করি নি।
কিরিল আলেকসান্দ্রভ

এটিও আপনার সবচেয়ে গুরুত্বপূর্ণ বিটটি শূন্য করে না? বেশিরভাগ ভাষায় স্বাক্ষরবিহীন
ইনট

4

বরং এই বিনোদনমূলক আলোচনাটি পড়ে আমার মনে পড়ে যে আমার একটি বাস্তব-বিশ্ব, সময় সংবেদনশীল ফাংশন ছিল যা মূল লুপের মধ্যে বিজোড় এবং এমনকি সংখ্যার জন্য পরীক্ষা করে। এটি একটি পূর্ণসংখ্যা শক্তি ফাংশন, স্ট্যাক ওভারফ্লোতে অন্য কোথাও পোস্ট করা হয়েছে। মানদণ্ডগুলি বেশ অবাক করে দিয়েছিল। কমপক্ষে এই আসল-ওয়ার্ল্ড ফাংশনে, মডুলো ধীর এবং উল্লেখযোগ্যভাবে তাই। বিজয়ী, একটি বিস্তৃত মার্জিন দ্বারা, mod 67% মডুলোর সময় প্রয়োজন, এটি বা (|) পদ্ধতির হয় এবং এই পৃষ্ঠায় অন্য কোথাও খুঁজে পাওয়া যায় না।

static dbl  IntPow(dbl st0, int x)  {
    UINT OrMask = UINT_MAX -1;
    dbl  st1=1.0;
    if(0==x) return (dbl)1.0;

    while(1 != x)   {
        if (UINT_MAX == (x|OrMask)) {     //  if LSB is 1...    
        //if(x & 1) {
        //if(x % 2) {
            st1 *= st0;
        }    
        x = x >> 1;  // shift x right 1 bit...  
        st0 *= st0;
    }
    return st1 * st0;
}

300 মিলিয়ন লুপের জন্য, মাপের সময়টি নিম্নরূপ।

3.962 the | এবং মুখোশ পদ্ধতির

4.851 & পদ্ধতির

5.850% পদ্ধতির

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


1
বাস্তবায়ন-সংজ্ঞায়িত আচরণ unsigned xহিসাবে হিসাবে ব্যবহার করা ভাল । অস্পষ্ট কেন এবং বিভিন্ন ধরণের। একটি পরীক্ষা ব্যবহার করে পুনরায় লেখার পক্ষে যথেষ্ট সহজ । x = x >> 1;x < 0xOrMaskwhile(x)
chux - মনিকা

2
আমি বিস্মিত হয়েছি যে আপনি কোন সংকলকটি এটি বেঞ্চমার্ক করতে ব্যবহার করেছেন, যেহেতু বেশিরভাগ সংকলক % 2বিটওয়াইজ ব্যবহার করে কেসটি সঙ্কলন করতে যথেষ্ট স্মার্ট হওয়া উচিত &। আমি কেবল এটি পরীক্ষা করেছি এবং ফলাফলগুলি সম্পূর্ণরূপে একই (ভিএস ২০১৫, এক্স x86 এবং x64 উভয়ই সমস্ত অপ্টিমাইজেশনের সাথে প্রকাশ করে)। গৃহীত উত্তরটি জিসিসির পক্ষে এটিও জানিয়েছে (২০০৮ সালে লিখিত)।
লু

2
এই পোস্টে সমস্যাটি হ'ল যে ভিত্তিটি যে কোনও প্ল্যাটফর্ম / সংকলকটিতে এর orচেয়ে andকিছুটা দ্রুততর হবে তার সম্ভাবনা খুব কমই। এমন কোনও অদ্ভুত প্ল্যাটফর্ম / সংকলক কম্বো থাকলেও (এবং আপনি যেটি বা বেনমার্ক সঞ্চালনের জন্য ব্যবহৃত কোডটি পোস্ট করেননি), অন্য সংকলকগুলির সাথে একই আচরণ করার উপর নির্ভর করে এটি একটি দুর্বল অপ্টিমাইজেশন বাজি হবে। সুতরাং, আমি যেমন লিখেছি, আমি আশ্চর্য হয়েছি যে এটি কোন প্ল্যাটফর্ম / সংকলকটিতে পরীক্ষা করা হয়েছিল , কারণ আমি প্রায় নিশ্চিত যে এটি সঠিকভাবে পরিমাপ করা হয়নি।
লু

2
আপনাকে মিথ্যাবাদী বলছে না, কেবল উচ্চ নির্ভুলতার সাথে দাবি করে যে আপনি সঠিকভাবে পরিমাপ করেননি। একটি ট্রাক চালক এখনো, আমাকে ফোন করার কোন প্রয়োজন নেই পড়া আমার মূল মন্তব্যে আমি করেনি একটি বেঞ্চমার্ক করতে, এবং ফলাফল, প্রত্যাশিত ছিল, সব তিনটি ক্ষেত্রে সম্পূর্ণভাবে একই (~ 3 সিগমা নিশ্চয়তা যেমন 500.000 জন্য প্রতিটি পরীক্ষা 10 বার চলমান পরে .000 পুনরাবৃত্তি)। আপনার যদি সত্যিই দীর্ঘ প্রশংসনীয় কেরিয়ার থাকে, তবে আপনার পদক্ষেপটি যদি কোনও বোধগম্য হয় তবে কিছুটা পিছনে ফিরে যান এবং ভাবেন, তবে বেঞ্চমার্কটি করার জন্য ব্যবহৃত আসল কোডটি পোস্ট করুন। অন্যথায়, পোস্টটি যা আমি এটি বিশ্বাস করি তা পরিমাপের ক্ষেত্রে কেবল একটি ভুল।
লু


4

এটি তার উত্তর সম্পর্কে @ রকেটরোয়ের সাথে আলোচনার ফলোআপ , তবে যারা এই ফলাফলগুলি তুলনা করতে চান তাদের পক্ষে এটি কার্যকর হতে পারে।

tl; dr আমি যা দেখেছি, তার থেকে রায়ের দৃষ্টিভঙ্গি ( (0xFFFFFFFF == (x | 0xFFFFFFFE)) পদ্ধতির x & 1হিসাবে সম্পূর্ণরূপে অনুকূল নয় mod, তবে অনুশীলনের ক্ষেত্রে চলমান সময়গুলি সকল ক্ষেত্রে সমান হয়ে উঠতে হবে।

সুতরাং, প্রথমে আমি কম্পাইলার এক্সপ্লোরার ব্যবহার করে সংকলিত আউটপুট তুলনা করেছি :

কার্যাদি পরীক্ষা করা:

int isOdd_mod(unsigned x) {
    return (x % 2);
}

int isOdd_and(unsigned x) {
    return (x & 1);
}

int isOdd_or(unsigned x) {
    return (0xFFFFFFFF == (x | 0xFFFFFFFE));
}   

-ও 3 সহ ক্লাং 3.9.0:

isOdd_mod(unsigned int):                          # @isOdd_mod(unsigned int)
        and     edi, 1
        mov     eax, edi
        ret

isOdd_and(unsigned int):                          # @isOdd_and(unsigned int)
        and     edi, 1
        mov     eax, edi
        ret

isOdd_or(unsigned int):                           # @isOdd_or(unsigned int)
        and     edi, 1
        mov     eax, edi
        ret

ওসি 3 সহ জিসিসি 6.2:

isOdd_mod(unsigned int):
        mov     eax, edi
        and     eax, 1
        ret

isOdd_and(unsigned int):
        mov     eax, edi
        and     eax, 1
        ret

isOdd_or(unsigned int):
        or      edi, -2
        xor     eax, eax
        cmp     edi, -1
        sete    al
        ret

ক্লাং-এর কাছে হ্যাটস, এটি বুঝতে পেরেছিল যে তিনটি ক্ষেত্রেই কার্যত সমান। যাইহোক, রায়ের দৃষ্টিভঙ্গি জিসিসিতে অনুকূলিত হয়নি, তাই ওয়াইএমএমভি।

ভিজ্যুয়াল স্টুডিওর সাথে এটি একই রকম; এই তিনটি ফাংশনের জন্য বিচ্ছিন্নতা প্রকাশ x64 (VS2015) পরিদর্শন করে আমি দেখতে পেলাম যে তুলনার অংশটি "মোড" এবং "এবং" কেসের জন্য সমান এবং রায়ের "বা" কেসের জন্য কিছুটা বড়:

// x % 2
test bl,1  
je (some address) 

// x & 1
test bl,1  
je (some address) 

// Roy's bitwise or
mov eax,ebx  
or eax,0FFFFFFFEh  
cmp eax,0FFFFFFFFh  
jne (some address)

যাইহোক, এই তিনটি অপশনের তুলনায় প্রকৃত মানদণ্ড চালানোর পরে (প্লেইন মোড, বিটওয়াইস বা, বিটওয়াইস এবং) ফলাফলগুলি সম্পূর্ণ সমান (আবার, ভিজ্যুয়াল স্টুডিও 2005 x86 / x64, রিলিজ বিল্ড, কোনও ডিবাগার সংযুক্ত নেই)।

রিলিজ অ্যাসেম্বলিটি testনির্দেশ andএবং modমামলাগুলির জন্য নির্দেশনা ব্যবহার করে , যখন রায়ের cmp eax,0FFFFFFFFhকেসটি পদ্ধতির ব্যবহার করে তবে এটি ভারীভাবে নিবন্ধিত এবং অনুকূলিত হয় যাতে অনুশীলনে কোনও পার্থক্য নেই।

20 টি রান করার পরে আমার ফলাফল (i7 3610QM, উইন্ডোজ 10 পাওয়ার প্ল্যান হাই পারফরম্যান্সে সেট হয়েছে):

[পরীক্ষা: সমতল মড 2] গড় সময়: 689.29 এমএস (আপেক্ষিক পার্থক্য: + 0.000%)
[পরীক্ষা: বিটওয়াইস বা] গড় সময়: 689.63 এমএস (আপেক্ষিক পার্থক্য: + 0.048%)
[পরীক্ষা: বিটওয়াইস এবং] গড় সময়: 687.80 এমএস (আপেক্ষিক পার্থক্য: -0.217%)

এই বিকল্পগুলির মধ্যে পার্থক্য 0.3% এর চেয়ে কম, সুতরাং এটি স্পষ্টভাবে স্পষ্ট যে সমস্ত ক্ষেত্রে সমাবেশ সমান।

যদি কেউ চেষ্টা করতে চান তবে কোডটি এখানে রয়েছে, আমি কেবল উইন্ডোজে এটি পরীক্ষা করেছিলাম ( সংজ্ঞার #if LINUXশর্তসাপেক্ষে পরীক্ষা করুন get_timeএবং প্রয়োজনে এটি প্রয়োগ করুন, এই উত্তর থেকে নেওয়া )।

#include <stdio.h>

#if LINUX
#include <sys/time.h>
#include <sys/resource.h>
double get_time()
{
    struct timeval t;
    struct timezone tzp;
    gettimeofday(&t, &tzp);
    return t.tv_sec + t.tv_usec*1e-6;
}
#else
#include <windows.h>
double get_time()
{
    LARGE_INTEGER t, f;
    QueryPerformanceCounter(&t);
    QueryPerformanceFrequency(&f);
    return (double)t.QuadPart / (double)f.QuadPart * 1000.0;
}
#endif

#define NUM_ITERATIONS (1000 * 1000 * 1000)

// using a macro to avoid function call overhead
#define Benchmark(accumulator, name, operation) { \
    double startTime = get_time(); \
    double dummySum = 0.0, elapsed; \
    int x; \
    for (x = 0; x < NUM_ITERATIONS; x++) { \
        if (operation) dummySum += x; \
    } \
    elapsed = get_time() - startTime; \
    accumulator += elapsed; \
    if (dummySum > 2000) \
        printf("[Test: %-12s] %0.2f ms\r\n", name, elapsed); \
}

void DumpAverage(char *test, double totalTime, double reference)
{
    printf("[Test: %-12s] AVERAGE TIME: %0.2f ms (Relative diff.: %+6.3f%%)\r\n",
        test, totalTime, (totalTime - reference) / reference * 100.0);
}

int main(void)
{
    int repeats = 20;
    double runningTimes[3] = { 0 };
    int k;

    for (k = 0; k < repeats; k++) {
        printf("Run %d of %d...\r\n", k + 1, repeats);
        Benchmark(runningTimes[0], "Plain mod 2", (x % 2));
        Benchmark(runningTimes[1], "Bitwise or", (0xFFFFFFFF == (x | 0xFFFFFFFE)));
        Benchmark(runningTimes[2], "Bitwise and", (x & 1));
    }

    {
        double reference = runningTimes[0] / repeats;
        printf("\r\n");
        DumpAverage("Plain mod 2", runningTimes[0] / repeats, reference);
        DumpAverage("Bitwise or", runningTimes[1] / repeats, reference);
        DumpAverage("Bitwise and", runningTimes[2] / repeats, reference);
    }

    getchar();

    return 0;
}

আমি বিশ্বাস করি আপনি বেঞ্চমার্কিংয়ের মূল পাপকে প্রতিশ্রুতিবদ্ধ করেছেন; এমন একটি নির্দিষ্ট তৈরি করা এটি বাস্তব-বিশ্বের পরিবেশের প্রতিনিধিত্ব করে না। আপনার সমাবেশের ভাষাটি দেখুন এবং লক্ষ্য করুন যে আপনি কতগুলি নিবন্ধ ব্যবহার করছেন। প্রচেষ্টার জন্য উচ্চ চিহ্ন, কিন্তু এই ফলাফলগুলি বাস্তব-বিশ্ব প্রক্রিয়াকরণে ধরে রাখে না।

টুইটার তবে আবার এই জাতীয় প্রোগ্রাম / পরিবেশ তৈরি এবং পোস্ট করতে দ্বিধা বোধ করুন যা সংকলককে বিভ্রান্ত করবে যে কোনও একটি ক্ষেত্রে আরও অনুকূলিত সংসদ তৈরি করতে পারে, অন্য সমস্ত জিনিস সমান।
লু

আমি সবসময় মোরগ প্রোগ্রামার পছন্দ করি। প্রোগ্রামারের জন্য এটি একটি ভাল বৈশিষ্ট্য, তবে আরও জটিল, বাস্তব-জগত প্রোগ্রামে, আমার পদ্ধতিটি আপনার চেয়ে ভাল সম্পাদন করবে কারণ সংকলকটির সমস্যার সমাধানের আরও অনেক উপায় রয়েছে যাতে নির্দেশাবলী ওভারল্যাপ হয় (ইন্টেল আর্কিটেকচারে) আরও ভাল ফলাফল দেয় । ভাল বেঞ্চমার্কিং অভিজ্ঞতার সাথে খুব কম অভিজ্ঞ জন প্রোগ্রামার আপনার মানদণ্ডকে অগ্রাধিকার দেবে, তবে ভাল কাজ চালিয়ে যাবে এবং যখন নতুন চিপ প্রকাশ প্রকাশিত হবে তখন আপনার মানদণ্ডগুলি পুনরায় চালু করতে ভুলবেন না। সময়ের সাথে সাথে বিষয়গুলি পরিবর্তিত হয়।

3

আমি জানি এটি কেবল সিনট্যাকটিক চিনি এবং এটি কেবল নেট এ প্রযোজ্য তবে এক্সটেনশন পদ্ধতির কী ...

public static class RudiGroblerExtensions
{
    public static bool IsOdd(this int i)
    {
        return ((i % 2) != 0);
    }
}

এখন আপনি নিম্নলিখিত করতে পারেন

int i = 5;
if (i.IsOdd())
{
    // Do something...
}

1
চমৎকার কোড। দুঃখিত যে এটি দাবি করবে যে 2 টি বিজোড় এবং 3 টি নয় 3
অ্যান্টনি 11

ওফস, দুঃখিত ... আমার যুক্তিটি ভুল উপায়ে ...
rudigrobler

3

আমি "সৃজনশীল তবে বিভ্রান্তিকর বিভাগ" এ অফার করছি:

int isOdd(int n) { return n ^ n * n ? isOdd(n * n) : n; }

মাইক্রোসফ্ট সি ++ এর সাথে নির্দিষ্ট এই থিমের একটি বৈকল্পিক:

__declspec(naked) bool __fastcall isOdd(const int x)
{
    __asm
    {
        mov eax,ecx
        mul eax
        mul eax
        mul eax
        mul eax
        mul eax
        mul eax
        ret
    }
}

2

বিটওয়াস পদ্ধতিটি পূর্ণসংখ্যার অভ্যন্তরীণ উপস্থাপনার উপর নির্ভর করে। একটি মডুলো অপারেটর আছে যেখানেই Modulo কাজ করবে। উদাহরণস্বরূপ, কিছু সিস্টেম প্রকৃতপক্ষে ট্যাগিংয়ের জন্য নিম্ন স্তরের বিটগুলি ব্যবহার করে (ডায়নামিক ভাষাগুলি), তাই কাঁচা এক্স এবং 1 আসলে সেই ক্ষেত্রে কাজ করবে না।


2

আইওডড (ইন্ট এক্স) {সত্য প্রত্যাবর্তন; }

যথার্থতার প্রমাণ - সমস্ত ধনাত্মক পূর্ণসংখ্যার সেট বিবেচনা করুন এবং ধরুন যে খালি খালি পূর্ণসংখ্যার সেটটি বিজোড় নয়। ধনাত্মক পূর্ণসংখ্যাগুলি সুশৃঙ্খলভাবে তৈরি হওয়ার কারণে, একটি স্বল্পতম নয় বিজোড় সংখ্যা হবে, যা নিজেই বেশ বিজোড়, সুতরাং স্পষ্টভাবে যে সংখ্যাটি সেটে থাকতে পারে না। অতএব এই সেটটি খালি নয় be সবচেয়ে বেশি সংখ্যক নয় বিজোড় সংখ্যাটি বাদে negativeণাত্মক পূর্ণসংখ্যার জন্য পুনরাবৃত্তি করুন।


2

সুবহ:

i % 2 ? odd : even;

Unportable:

i & 1 ? odd : even;

i << (BITS_PER_INT - 1) ? odd : even;

2

কিছু লোক যেমন পোস্ট করেছে, এটি করার বিভিন্ন উপায় রয়েছে। এই ওয়েবসাইট অনুসারে , দ্রুততম উপায় হল মডুলাস অপারেটর:

if (x % 2 == 0)
               total += 1; //even number
        else
               total -= 1; //odd number

তবে, এখানে আরও কিছু কোড রয়েছে যা বেঞ্চটি লেখক দ্বারা চিহ্নিত ছিল যা উপরের সাধারণ মডুলাস অপারেশনের চেয়ে ধীর গতিতে চলেছিল:

if ((x & 1) == 0)
               total += 1; //even number
        else
               total -= 1; //odd number

System.Math.DivRem((long)x, (long)2, out outvalue);
        if ( outvalue == 0)
               total += 1; //even number
        else
               total -= 1; //odd number

if (((x / 2) * 2) == x)
               total += 1; //even number
        else
               total -= 1; //odd number

if (((x >> 1) << 1) == x)
               total += 1; //even number
        else
               total -= 1; //odd number

        while (index > 1)
               index -= 2;
        if (index == 0)
               total += 1; //even number
        else
               total -= 1; //odd number

tempstr = x.ToString();
        index = tempstr.Length - 1;
        //this assumes base 10
        if (tempstr[index] == '0' || tempstr[index] == '2' || tempstr[index] == '4' || tempstr[index] == '6' || tempstr[index] == '8')
               total += 1; //even number
        else
               total -= 1; //odd number

এমনকি কতজন লোক এমনকি ম্যাথ.সিস্টেম.ডাইভ্রাম পদ্ধতি সম্পর্কে জানত বা তারা কেন এটি ব্যবহার করবে ??



1

আমাদের মধ্যে যারা আমাদের অধ্যয়নের সময় খুব বেশি বুলিয়ান বীজগণিত করেননি তাদের জন্য বিটওয়াইজ অপারেটর পদ্ধতির উপর আরও বিশদ দেওয়ার জন্য, এখানে একটি ব্যাখ্যা দেওয়া হল। সম্ভবত ওপি তে খুব বেশি কাজে লাগেনি, তবে কেন আমি NUMBER ও 1 কাজ করে তা পরিষ্কার করার মতো মনে হয়েছিল।

দয়া করে নোট করুন যে কেউ যেমন উপরে জবাব দিয়েছেন, negativeণাত্মক সংখ্যাগুলি যেভাবে উপস্থাপন করা হয়েছে তা এই পদ্ধতিটিকে কাজ করা বন্ধ করতে পারে। প্রকৃতপক্ষে এটি এমনকি মডুলো অপারেটর পদ্ধতিটিও ভেঙে ফেলতে পারে যেহেতু প্রতিটি ভাষা কীভাবে এটি নেতিবাচক অপারেশনগুলির সাথে আচরণ করে তার মধ্যে পৃথক হতে পারে।

তবে আপনি যদি জানেন যে NUMBER সর্বদা সদর্থক হয় তবে এটি ভালভাবে কাজ করে।

টুনি উপরোক্ত বিষয়টি যেহেতু বাইনারি (এবং ড্যানারি) এ কেবল শেষ সংখ্যাটি গুরুত্বপূর্ণ।

একটি বুলিয়ান যুক্তি এবং গেট নির্দেশ দেয় যে উভয় ইনপুটগুলি 1 ফেরত দেওয়ার জন্য 1 (বা উচ্চ ভোল্টেজ) হতে হবে।

1 এবং 0 = 0।

0 এবং 1 = 0।

0 এবং 0 = 0।

1 এবং 1 = 1।

আপনি যদি বাইনারি হিসাবে কোনও সংখ্যা উপস্থাপন করেন (আমি এখানে একটি 8 বিট উপস্থাপনা ব্যবহার করেছি), বিজোড় সংখ্যাগুলির শেষে 1 থাকে, এমনকি সংখ্যায় 0 থাকে 0

উদাহরণ স্বরূপ:

1 = 00000001

2 = 00000010

3 = 00000011

4 = 00000100

আপনি যদি কোনও নম্বর নেন এবং বিটওয়াইড এ্যান্ড ব্যবহার করেন (এবং জাভাতে) এটি 1 দ্বারা এটি হয় 00000001, = 1 অর্থাত্ সংখ্যাটি বিজোড়। বা 00000000 = 0, মানে সংখ্যাটি সমান।

যেমন

অদ্ভুত?

1 এবং 1 =

00000001 এবং

00000001 =

00000001 <- বিজোড়

2 এবং 1 =

00000010 এবং

00000001 =

00000000 <- এমনকি

54 এবং 1 =

00000001 এবং

00110110 =

00000000 <- এমনকি

এই কারণেই এটি কাজ করে:

if(number & 1){

   //Number is odd

} else {

   //Number is even
}

দুঃখিত যদি এটি অপ্রয়োজনীয় হয়।


1

সংখ্যা শূন্য সমতা | শূন্য http://tinyurl.com/oexhr3k

পাইথন কোড ক্রম।

# defining function for number parity check
def parity(number):
    """Parity check function"""
    # if number is 0 (zero) return 'Zero neither ODD nor EVEN',
    # otherwise number&1, checking last bit, if 0, then EVEN, 
    # if 1, then ODD.
    return (number == 0 and 'Zero neither ODD nor EVEN') \
            or (number&1 and 'ODD' or 'EVEN')

# cycle trough numbers from 0 to 13 
for number in range(0, 14):
    print "{0:>4} : {0:08b} : {1:}".format(number, parity(number))

আউটপুট:

   0 : 00000000 : Zero neither ODD nor EVEN
   1 : 00000001 : ODD
   2 : 00000010 : EVEN
   3 : 00000011 : ODD
   4 : 00000100 : EVEN
   5 : 00000101 : ODD
   6 : 00000110 : EVEN
   7 : 00000111 : ODD
   8 : 00001000 : EVEN
   9 : 00001001 : ODD
  10 : 00001010 : EVEN
  11 : 00001011 : ODD
  12 : 00001100 : EVEN
  13 : 00001101 : ODD

@ এল.পেস্ক্যাডো, আপনাকে ধন্যবাদ। জিরো যদি সমান হয় তবে এর জুটি কত?

@ এল.প্যাসক্যাডো, ঠিক আছে, আমি আপনার সাথে একমত তারপরে, যদি একটু চিন্তা করেন, তবে কেন আমরা 2 (দুটি) এ ভাগ করব? আমরা কী জানতে চাই, যখন আমরা দুটি ভাগ করব? 3, বা, 5 ইত্যাদি বিভক্ত হবে না কেন?

@ el.pescado এই উইকিপিডিয়া নিবন্ধটি জিরোর সমতা ভুল। এই নিবন্ধটি দ্বারা প্রচুর লোককে বোকা বানানো হয়েছে। উইঙ্কের আগে ভাবুন।

1
তুমি ঠিক বলছো. এখন যেহেতু আমি অন্যান্য উত্তরগুলি পড়েছি সেগুলি আমি আপনাকে সর্বাধিক বিস্তৃত মনে করেছি :)
el.pescado

@ el.pescado। ধন্যবাদ. :) এখন আপনি জিরোর সেরা বন্ধু। (আলিঙ্গন)

1
I execute this code for ODD & EVEN:

#include <stdio.h>
int main()
{
    int number;
    printf("Enter an integer: ");
    scanf("%d", &number);

    if(number % 2 == 0)
        printf("%d is even.", number);
    else
        printf("%d is odd.", number);
}

0

আলোচনার খাতিরে ...

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

void tellMeIfItIsAnOddNumberPlease(int iToTest){
  int iLastDigit;
  iLastDigit = iToTest - (iToTest / 10 * 10);
  if (iLastDigit % 2 == 0){
    printf("The number %d is even!\n", iToTest);
  } else {
    printf("The number %d is odd!\n", iToTest);
  }
}

এখানে কীটি কোডের তৃতীয় লাইনে রয়েছে, বিভাগ অপারেটর একটি পূর্ণসংখ্যা বিভাগ সম্পাদন করে, ফলে ফলাফলটি ফলাফলের ভগ্নাংশটি অনুপস্থিত। সুতরাং উদাহরণস্বরূপ 222/10 ফলাফল হিসাবে 22 দেবে। তারপরে এটি 10 ​​এর সাথে আবার গুন করুন এবং আপনার কাছে 220 রয়েছে that এটি মূল 222 থেকে বিয়োগ করুন এবং আপনি 2 দিয়ে শেষ করবেন যা যাদু দ্বারা মূল সংখ্যার শেষ সংখ্যা হিসাবে একই সংখ্যা। ;-) গণনাটি ক্রমটি করা হচ্ছে তার ক্রমটি আমাদের স্মরণ করিয়ে দেওয়ার জন্য প্রথম বন্ধনী রয়েছে First আমরা এগুলি ছেড়ে দিতে পারলাম, যেহেতু অগ্রাধিকারটি বিয়োগ ও গুণনের ক্ষেত্রে বিয়োগের চেয়ে বেশি, তবে এটি আমাদের "আরও পঠনযোগ্য" কোড দেয়।

আমরা চাইলে এগুলি পুরোপুরি অপঠনযোগ্য করে তুলতে পারি। আধুনিক সংকলকটির জন্য এতে কোনও পার্থক্য হবে না: -

printf("%d%s\n",iToTest,0==(iToTest-iToTest/10*10)%2?" is even":" is odd");

তবে ভবিষ্যতে কোডটি বজায় রাখা আরও শক্ত করে তুলবে। কেবল কল্পনা করুন যে আপনি বিজোড় সংখ্যার জন্য পাঠ্যটি "এমনকি নয়" তে পরিবর্তন করতে চান। তারপরে পরে অন্য কেউ আপনি কী পরিবর্তন করেছেন এবং একটি এসএনএন ডিফ বা অনুরূপ সম্পাদন করতে চান ...

আপনি যদি পোর্টেবিলিটি সম্পর্কে চিন্তিত না হন তবে গতি সম্পর্কে আরও বেশি চিন্তিত হন তবে আপনার কমপক্ষে উল্লেখযোগ্য কিছুটা দেখুন। যদি বিটটি 1 তে সেট করা থাকে তবে এটি একটি বিজোড় সংখ্যা, যদি এটি 0 হয় তবে এটি একটি সমান সংখ্যা। সামান্য এডিয়ান সিস্টেমে যেমন ইন্টেলের x86 আর্কিটেকচারটি এটির মতো হবে: -

if (iToTest & 1) {
  // Even
} else {
  // Odd
}

শুধু আইটিওস্টেস্ট% 2 == 0 যাবার সাথে ঠিক কী হয়েছে? আপনি শেষ অঙ্কটি বের করার একটি বিভাগ নষ্ট করছেন, তাই আপনার এটি হওয়া দরকারের চেয়ে দ্বিগুণ is
freespace

@ ফ্রাইস্পেস: আমি এর চেয়ে বেশি অপচয় করি, তাই না? :-) একটি গুণ এবং একটি বিয়োগ তবে দুটি সমাধানের মধ্যে কী সবচেয়ে দক্ষ তা আমি বলতে সাহস পাই না। এটি কখনও দ্রুত সমাধান হিসাবে দাবি করেননি, আপনি যদি আমার পোস্টের প্রথম লাইনটি আবার পড়েন তবে একেবারে বিপরীত।
টুনি

@ টুনি, আহ, আমার হাস্যরস টুপিটি পড়ে গেল। এটি এখনই ফিরে এসেছে: ডি তার সম্পর্কে দুঃখিত:
ফ্রিস্পেস

0

আপনি যদি দক্ষ হতে চান তবে বিটওয়াইড অপারেটরগুলি ( x & 1) ব্যবহার করুন তবে আপনি যদি পঠনযোগ্য হতে চান তবে মডুলো 2 ( x % 2) ব্যবহার করুন


-1: আপনি যদি দক্ষ হতে চান তবে যে কোনও একটি ব্যবহার করুন। আপনি যদি এটি পোর্টেবল হতে চান তবে ব্যবহার করুন %। আপনি যদি এটি পঠনযোগ্য হতে চান তবে ব্যবহার করুন %। হুঁ, আমি এখানে একটি প্যাটার্ন দেখতে পাচ্ছি।
টমাস এডিং

@ ত্রিনিথিস, কোনও প্যাটার্ন নেই এবং এই সমাধানটি আপনার চেয়ে অনেক ভাল।
সাব

0

এমনকি বা বিজোড় পরীক্ষা করা একটি সহজ কাজ।

আমরা জানি যে 2 দ্বারা ঠিক বিভাজ্য যে কোনও সংখ্যা অন্য সংখ্যক বিজোড়।

আমাদের কেবল কোনও সংখ্যার বিভাজ্যতা পরীক্ষা করতে হবে এবং বিভাজ্যতা যাচাই করার জন্য আমরা %অপারেটরটি ব্যবহার করি

অন্যথায় ব্যবহার করে এমনকি বিজোড় পরীক্ষা করা

if(num%2 ==0)  
{
    printf("Even");
}
else
{
    printf("Odd");
}

সি প্রোগ্রাম বা অন্য কোনটি ব্যবহার করে বিজোড় পরীক্ষা করতে

শর্তসাপেক্ষ / তার্নারি অপারেটর ব্যবহার করে

(num%2 ==0) printf("Even") : printf("Odd");

শর্তসাপেক্ষ অপারেটরটি ব্যবহার করে সম বা বিজোড় পরীক্ষা করার জন্য সি প্রোগ্রাম

বিটওয়াইস অপারেটর ব্যবহার করে

if(num & 1)  
{
    printf("Odd");
}
else 
{
    printf("Even");
}

এবং টেরিনারি অপারেটরটি ঠিক কোথায়?
4

0

+ 66% দ্রুত>!(i%2) / i%2 == 0

int isOdd(int n)
{
    return n & 1;
}

কোড পূর্ণসংখ্যা শেষ প্রান্তে পরীক্ষা যদি এটা 1 বাইনারি মধ্যে

ব্যাখ্যা

Binary  :   Decimal
-------------------
0000    =   0
0001    =   1
0010    =   2
0011    =   3
0100    =   4
0101    =   5
0110    =   6
0111    =   7
1000    =   8
1001    =   9
and so on...

লক্ষ্য করুন যে বিজোড় সংখ্যার জন্য ডানদিকের বিটটি সর্বদা 1 হয় ।

& , bitwise ও অপারেটর চেক আমাদের ডানদিকের বিট রিটার্ন লাইন যদি এটা 1

এটিকে সত্য এবং মিথ্যা হিসাবে ভাবেন

যখন আমরা n কে 1 এর সাথে 0001বাইনারি বলতে বোঝায় (শূন্যের সংখ্যা কিছু যায় আসে না)।
তাহলে আসুন কেবল কল্পনা করুন যে আমাদের কাছে 1 বাইট আকারের পূর্ণসংখ্যা n রয়েছে।

এটি 8-বিট / 8-বাইনারি সংখ্যা দ্বারা প্রতিনিধিত্ব করা চাই।

যদি এনটি এন হয় 7 এবং আমরা এটি 1 এর সাথে তুলনা করি , এটি ভালো

7 (1-byte int)|    0  0  0  0    0  1  1  1
       &
1 (1-byte int)|    0  0  0  0    0  0  0  1
********************************************
Result        |    F  F  F  F    F  F  F  T

কোন এফ মিথ্যা এবং টি সত্য হিসাবে দাঁড়ায় ।

যদি তারা উভয়ই সত্য হয় তবে এটি কেবলমাত্র সবচেয়ে উপযুক্ত বিটের সাথে তুলনা করে। সুতরাং, স্বয়ংক্রিয়ভাবেই আপনার 7 & 1হয় টি Rue।

আমি যদি ডানদিকের আগে কিছুটা পরীক্ষা করতে চাই?

কেবলমাত্র পরিবর্তন n & 1করতে n & 2যা 2 প্রতিনিধিত্ব করে 0010বাইনারি এবং তাই।

আমি হেক্সাডেসিমেল স্বরলিপি ব্যবহার করা হয় তবে আপনি অপারেশন bitwise করার জন্য একটি শিক্ষানবিস করছি সুপারিশ
return n & 1;>> return n & 0x01;

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.