আমি কীভাবে এটি নিশ্চিত করতে পারি যে সবসময় পূর্ণসংখ্যার বিভাজনটি বৃত্তাকার হয়?


242

আমি এটি নিশ্চিত করতে চাই যে প্রয়োজনের ক্ষেত্রে পূর্ণসংখ্যার একটি বিভাজন সর্বদা গোল করা হয়। এর চেয়ে ভাল উপায় আর কি আছে? প্রচুর ingালাই চলছে। :-)

(int)Math.Ceiling((double)myInt1 / myInt2)

48
আপনি কী "আরও ভাল" বিবেচনা করছেন তা আপনি আরও পরিষ্কারভাবে ব্যাখ্যা করতে পারেন? দ্রুত? অপেক্ষাকৃত ছোট? আরও সঠিক? আরও শক্তপোক্ত? আরও স্পষ্টতই সঠিক?
এরিক লিপার্ট

6
আপনার কাছে সবসময় সি # তে গণিতের সাথে প্রচুর কাস্টিং থাকে - এই কারণেই এটি এই ধরণের জিনিসটির জন্য দুর্দান্ত ভাষা নয়। আপনি কি মানগুলি শূন্যের চেয়ে বড় বা দূরে রাখতে চান - -৩.১ হওয়া উচিত -৩ (আপ) বা -4 (শূন্য থেকে দূরে)
কিথ

9
এরিক: "আরও নির্ভুল? আরও শক্তিশালী? আরও স্পষ্টতই সঠিক?" বলতে আপনার অর্থ কী? আসলে আমি যা বোঝাতে চেয়েছি তা কেবল "ভাল" ছিলাম, আমি পাঠককে আরও ভালভাবে বোঝাতে দেব। সুতরাং কারও কাছে যদি কোডের সংক্ষিপ্ত অংশ থাকে তবে দুর্দান্ত, অন্য কারও কাছে যদি দ্রুত হয়, তবে দুর্দান্ত :-) আপনার সম্পর্কে কী কোনও পরামর্শ আছে?
কার্স্টেন

1
আমিই কেবল সেই ব্যক্তি, যিনি শিরোনামটি পড়ে, "ওহ, এটি সি # এর কোনও ধরণের রাউন্ডআপ?"
ম্যাট বল

6
সত্যিই আশ্চর্যজনক যে এই প্রশ্নটি কতটা সূক্ষ্মভাবে কঠিন হয়ে উঠল, এবং আলোচনাটি কতটা শিক্ষামূলক।
জাস্টিন মরগান

উত্তর:


669

আপডেট: এই প্রশ্নটি জানুয়ারী 2013 এ আমার ব্লগের বিষয় ছিল । মহান প্রশ্নের জন্য ধন্যবাদ!


পূর্ণসংখ্যার গাণিতিক সঠিক হওয়া শক্ত। যেমনটি এতদূর পর্যন্ত প্রদর্শিত হয়েছে, আপনি যে কোনও "চালাক" কৌশলটি করার চেষ্টা করবেন, প্রতিক্রিয়াগুলি ভাল যে আপনি একটি ভুল করেছেন। এবং যখন কোনও ত্রুটি পাওয়া যায়, ত্রুটিটি ঠিক করার জন্য কোড পরিবর্তন করা ঠিক করে অন্য কোনও কিছু ভেঙে যায় কিনা তা বিবেচনা না করেই সমস্যা সমাধানের কোনও ভাল কৌশল নয়। এখনও অবধি আমাদের মনে হয়েছে যে এটি সম্পূর্ণরূপে নয়-বিশেষত-কঠিন সমস্যার পোস্টের জন্য পাঁচটি ভিন্ন ভুল পূর্ণসংখ্যার গাণিতিক সমাধান solutions

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

আপনি যেটি প্রতিস্থাপনের চেষ্টা করছেন তার স্পেসিফিকেশন পড়ে শুরু করুন। পূর্ণসংখ্যা বিভাগের স্পেসিফিকেশন স্পষ্টভাবে বলে:

  1. বিভাগটি শূন্যের দিকে ফলাফলকে বৃত্তাকারে করে

  2. ফল দুটি শূন্য বা ধনাত্মক হয় যখন দুটি অপারেন্ডের একই চিহ্ন থাকে এবং শূন্য বা নেতিবাচক থাকে যখন দুটি অপারেটের বিপরীত চিহ্ন থাকে

  3. যদি বাম অপারেন্ডটি ক্ষুদ্রতম উপস্থাপনযোগ্য int হয় এবং ডান অপরেন্ডটি opera1 হয় তবে একটি ওভারফ্লো ঘটে। [...] এটি [বাস্তবায়িত-সংজ্ঞায়িত] [একটি অ্যারিমেটিকেক্সেপশন] নিক্ষেপ করা হয়েছে বা ওভারফ্লোটি বাম অপারেণ্ডের ফলস্বরূপ মানটির সাথে মিলিত হয়নি।

  4. যদি ডান অপরেন্ডের মান শূন্য হয় তবে একটি সিস্টেম.ডাইভাইডবাইজারো এক্সপশন নিক্ষেপ করা হবে।

আমরা যা চাই তা হ'ল একটি পূর্ণসংখ্যা বিভাগ ফাংশন যা ভাগফলকে গণনা করে তবে ফলাফলটি সর্বদা শূন্যের দিকে না দিয়ে সর্বদা উপরের দিকে ঘোরায়

সুতরাং যে ফাংশন জন্য একটি স্পেসিফিকেশন লিখুন। আমাদের ফাংশনটি int DivRoundUp(int dividend, int divisor)প্রতিটি সম্ভাব্য ইনপুট জন্য আচরণ সংজ্ঞায়িত করা আবশ্যক। সেই অপরিবর্তিত আচরণটি গভীর উদ্বেগজনক, সুতরাং আসুন আমরা এটিকে নির্মূল করি। আমরা বলব যে আমাদের অপারেশনের এই স্পেসিফিকেশন রয়েছে:

  1. বিভাজক শূন্য হলে অপারেশন নিক্ষেপ করে

  2. লভ্যাংশ যদি আন্তঃমিনাল এবং বিভাজক -1 হয় তবে অপারেশন নিক্ষেপ করে

  3. যদি কোনও অবশিষ্ট না থাকে - বিভাগটি 'সম' হয় - তবে ফেরতের মানটি অবিচ্ছেদ্য ভাগফল হয় quot

  4. অন্যথায় এটি ক্ষুদ্রতম পূর্ণসংখ্যার সাথে ভাগ করে যা ভাগফলের চেয়ে বড় হয়, এটি সর্বদা গোল হয়।

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

সুতরাং আমরা কি গণনা করা আবশ্যক? স্পষ্টতই, কেবলমাত্র পূর্ণসংখ্যার গাণিতিক অবস্থায় থাকা অবস্থায় আমাদের অনুমানগুলি পূরণ করতে আমাদের তিনটি তথ্য জানতে হবে facts প্রথমত, পূর্ণসংখ্যাফলটি কী ছিল? দ্বিতীয়ত, বিভাগ কি বাকী মুক্ত ছিল? এবং তৃতীয়, যদি না হয়, পূর্ণসংখ্যা ভাগটি বৃত্তাকার বা নীচে দ্বারা গুণিত হয়েছিল?

এখন যে আমাদের একটি স্পেসিফিকেশন এবং একটি নকশা আছে, আমরা কোড লেখা শুরু করতে পারি।

public static int DivRoundUp(int dividend, int divisor)
{
  if (divisor == 0 ) throw ...
  if (divisor == -1 && dividend == Int32.MinValue) throw ...
  int roundedTowardsZeroQuotient = dividend / divisor;
  bool dividedEvenly = (dividend % divisor) == 0;
  if (dividedEvenly) 
    return roundedTowardsZeroQuotient;

  // At this point we know that divisor was not zero 
  // (because we would have thrown) and we know that 
  // dividend was not zero (because there would have been no remainder)
  // Therefore both are non-zero.  Either they are of the same sign, 
  // or opposite signs. If they're of opposite sign then we rounded 
  // UP towards zero so we're done. If they're of the same sign then 
  // we rounded DOWN towards zero, so we need to add one.

  bool wasRoundedDown = ((divisor > 0) == (dividend > 0));
  if (wasRoundedDown) 
    return roundedTowardsZeroQuotient + 1;
  else
    return roundedTowardsZeroQuotient;
}

এই চালাক কি? না? সুন্দর? সংক্ষেপে? স্পেসিফিকেশন অনুযায়ী সঠিক? আমি এটি বিশ্বাস করি, তবে আমি এটি পুরোপুরি পরীক্ষা করে দেখিনি। যদিও দেখতে বেশ সুন্দর লাগছে।

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


44
দুর্দান্ত অনুকরণীয় উত্তর
গ্যাভিন মিলার

61
আমি যা যত্ন করি তা আচরণ নয়; উভয় আচরণই ন্যায়সঙ্গত বলে মনে হয়। আমি যা যত্ন করি তা হ'ল এটি নির্দিষ্ট করা হয়নি , যার অর্থ এটি সহজে পরীক্ষা করা যায় না। এই ক্ষেত্রে, আমরা আমাদের নিজস্ব অপারেটরটি সংজ্ঞায়িত করছি, তাই আমরা আমাদের যে আচরণটি পছন্দ করতে পারি তা নির্দিষ্ট করে দিতে পারি। সেই আচরণটি "নিক্ষেপ" বা "নিক্ষেপ করবেন না" সে বিষয়ে আমি খেয়াল করি না, তবে আমি এটি যত্নবান বলেছি।
এরিক লিপার্ট

68
এটিকে ঘৃণা করুন, প্যাডেন্ট্রি ব্যর্থ :(
জন স্কিটি

32
মানুষ - আপনি কি এটিতে একটি বই লিখতে পারেন, দয়া করে?
xtofl

76
@ ফিনউ: আমি এটি পরীক্ষা করেছি কিনা তা অপ্রাসঙ্গিক। এই পূর্ণসংখ্যার পাটিগণিত সমস্যা সমাধান করা আমার ব্যবসায়ের সমস্যা নয়; যদি এটি হয় তবে আমি এটি পরীক্ষা করে যাচ্ছি। যদি কেউ তাদের ব্যবসায়ের সমস্যা সমাধানের জন্য ইন্টারনেট থেকে অপরিচিত লোকদের কাছ থেকে কোড নিতে চান তবে তা পুঙ্খানুপুঙ্খভাবে পরীক্ষা করার জন্য এঁদের উপর কাজ রয়েছে ।
এরিক লিপার্ট

49

এখানে এখনও পর্যন্ত সমস্ত উত্তর বরং জটিল বলে মনে হচ্ছে।

সি # এবং জাভাতে ধনাত্মক লভ্যাংশ এবং বিভাজকের জন্য আপনার কেবলমাত্র এটি করা দরকার:

( dividend + divisor - 1 ) / divisor 

উত্স: নম্বর রূপান্তর, রোল্যান্ড ব্যাকহাউস, 2001


অসাধারণ. যদিও, অস্পষ্টতাগুলি অপসারণ করার জন্য আপনার প্রথম বন্ধনী যুক্ত করা উচিত ছিল it এর প্রমাণটি কিছুটা দীর্ঘ ছিল তবে আপনি এটি অন্ত্রে অনুভব করতে পারেন, ঠিক এটি দেখে কেবল এটি সঠিক।
জর্জেন সিগওয়ার্ডসন

1
হুমমম ... ডিভিডেন্ড = 4, ডিভাইডার = (- 2) কী হবে ??? 4 / (-2) = (-2) = (-2) গোল করার পরে। তবে আপনি প্রদত্ত অ্যালগরিদম (4 + (-2) - 1) / (-2) = 1 / (-2) = (-0.5) = 0 গোল করার পরে।
স্কট

1
@ স্কট - দুঃখিত, আমি এই উল্লেখটি বাদ দিয়েছিলাম যে এই সমাধানটি কেবল ইতিবাচক লভ্যাংশ এবং বিভাজকের জন্য রয়েছে। আমি স্পষ্ট করে উল্লেখ করতে আমার উত্তর আপডেট করেছি।
ইয়ান নেলসন

1
আমি এটি পছন্দ করি অবশ্যই এই পদ্ধতির উপ-উত্পাদন হিসাবে আপনি অঙ্কগুলিতে কিছুটা কৃত্রিম উপচে পড়তে পারেন ...
টিসিসি

2
@ পিন্ট্যাগ: ধারণাটি ভাল তবে মডুলোর ব্যবহার ভুল। 13 এবং 3 নিন প্রত্যাশিত ফলাফল 5, তবে ((13-1)%3)+1)ফলাফল হিসাবে 1 দেয়। সঠিক ধরণের বিভাগ গ্রহণ, 1+(dividend - 1)/divisorইতিবাচক লভ্যাংশ এবং বিভাজকের জন্য উত্তর হিসাবে একই ফলাফল দেয়। এছাড়াও, কোনও ওভারফ্লো সমস্যা নয়, তবে কৃত্রিম সেগুলি হতে পারে।
লুৎজ লেহমান

48

চূড়ান্ত অন্তর্নিহিত উত্তর

স্বাক্ষরিত পূর্ণসংখ্যার জন্য:

int div = a / b;
if (((a ^ b) >= 0) && (a % b != 0))
    div++;

স্বাক্ষরবিহীন পূর্ণসংখ্যার জন্য:

int div = a / b;
if (a % b != 0)
    div++;

এই উত্তরের যুক্তি

পূর্ণসংখ্যা বিভাগ ' /' শূন্যের (গোলের 7..7.২) দিকে গোলকে সংজ্ঞায়িত করা হয়েছে, তবে আমরা গোল করতে চাই। এর অর্থ negativeণাত্মক উত্তরগুলি ইতিমধ্যে সঠিকভাবে গোল করা হয়েছে তবে ইতিবাচক উত্তরগুলি সামঞ্জস্য করা দরকার।

অ-শূন্য ইতিবাচক উত্তরগুলি সনাক্ত করা সহজ, তবে উত্তর শূন্যটি একটি সামান্য কৌশলযুক্ত, কারণ এটি হয় নেতিবাচক মানের গোলাকার বা একটি ধনাত্মক উত্তরকে গোল করে দেওয়া হতে পারে।

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

কেবলমাত্র চেকগুলি তখনই কোনও রাউন্ডিং হয়েছে কিনা, যার জন্য a % b != 0কাজটি করবে।

পাঠ শিখেছি

পাটিগণিত (পূর্ণসংখ্যা বা অন্যথায়) এটি যতটা সহজ লাগে তেমন সহজ নয়। চিন্তাভাবনা সব সময় প্রয়োজন।

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

ফ্লোটিং পয়েন্ট উত্তর সম্পর্কে নিশ্চিতভাবে একই অনুভূতি পেতে, আমি আরো কিনা কোন অবস্থার যার অধীনে ফ্লোটিং পয়েন্ট স্পষ্টতা ভাবে পেতে পারে চিন্তা করতে (এবং সম্ভবত আরো জটিল) থাকতে চাই, এবং কিনা Math.Ceilingসম্ভবত আছে 'ঠিক ডান' ইনপুটগুলিতে অনাকাঙ্ক্ষিত কিছু।

পথ ভ্রমণ

প্রতিস্থাপন করুন (নোট আমি এর myInt1সাথে দ্বিতীয়টি প্রতিস্থাপন করেছি myInt2, ধরে নিলাম এটিই আপনি বোঝাতে চেয়েছিলেন):

(int)Math.Ceiling((double)myInt1 / myInt2)

সঙ্গে:

(myInt1 - 1 + myInt2) / myInt2

একমাত্র সতর্কতা হ'ল myInt1 - 1 + myInt2আপনি যদি ব্যবহার করছেন পূর্ণসংখ্যার ধরণের প্রবহমান হয় তবে আপনি যা প্রত্যাশা করেছিলেন তা পেতে পারেন না।

কারণ এটি ভুল : -1000000 এবং 3999 -250 দেওয়া উচিত, এটি -249 দেয়

সম্পাদনা:
নেতিবাচক myInt1মানগুলির জন্য অন্যান্য সংখ্যার সমাধানের মতো একই ত্রুটিটি বিবেচনা করে এর মতো কিছু করা সহজ হতে পারে:

int rem;
int div = Math.DivRem(myInt1, myInt2, out rem);
if (rem > 0)
  div++;

এটি divকেবলমাত্র পূর্ণসংখ্যার ক্রিয়াকলাপগুলিতে সঠিক ফলাফল দেয় ।

কারণ এটি ভুল : -1 এবং -5 এর 1 দেওয়া উচিত, এটি 0 দেয়

সম্পাদনা (আরও একবার, অনুভূতি সহ):
বিভাগ অপারেটরটি শূন্যের দিকে ঘুরবে; নেতিবাচক ফলাফলের জন্য এটি ঠিক সঠিক, সুতরাং কেবল অ-নেতিবাচক ফলাফলগুলির সমন্বয় প্রয়োজন। যাইহোক যেভাবে যাইহোক এবং DivRemকেবল একটি করে তা বিবেচনা করে , আসুন কলটি এড়িয়ে চলুন (এবং যখন প্রয়োজন হয় না তখন মডুলো গণনা এড়াতে সহজ তুলনা দিয়ে শুরু করুন):/%

int div = myInt1 / myInt2;
if ((div >= 0) && (myInt1 % myInt2 != 0))
    div++;

কারণ এটি ভুল : -1 এবং 5 এর 0 দেওয়া উচিত, এটি 1 দেয়

(আমার নিজের সর্বশেষ প্রয়াসের প্রতিরক্ষায় আমি কখনই যুক্তিযুক্ত উত্তর চেষ্টা করা উচিত হয়নি যখন আমার মন আমাকে বলছিল যে আমি ঘুমের জন্য ২ ঘন্টা দেরি করেছি)


19

একটি এক্সটেনশন পদ্ধতি ব্যবহার করার উপযুক্ত সুযোগ:

public static class Int32Methods
{
    public static int DivideByAndRoundUp(this int number, int divideBy)
    {                        
        return (int)Math.Ceiling((float)number / (float)divideBy);
    }
}

এটি আপনার কোডকে উবারও পাঠযোগ্য করে তোলে:

int result = myInt.DivideByAndRoundUp(4);

1
আর্ম, কি? আপনার কোডটিকে myInt.DivideByAndRoundUp () বলা হবে এবং 0 এর ইনপুট বাদ দিয়ে সর্বদা 1 এ ফিরে আসত যা একটি ব্যতিক্রম ঘটায় ...
কনফিগার

5
বিরাট ব্যর্থতা. (-2) .ডভাইডবি বাইআরন্ডআউন্ড (2) ০.
টিমউই

3
আমি পার্টিতে সত্যিই দেরি করেছি, তবে এই কোডটি কি সংকলন করে? আমার গণিত শ্রেণিতে একটি সিলিং পদ্ধতি নেই যা দুটি যুক্তি গ্রহণ করে।
আর মার্টিনহো ফার্নান্দেস

17

আপনি একটি সহায়ক লিখতে পারে।

static int DivideRoundUp(int p1, int p2) {
  return (int)Math.Ceiling((double)p1 / p2);
}

1
এখনও একই পরিমাণে
ingালাই

29
@ ওটলাও, আপনি যা চান তা অনুমান করুন। তবে আমার জন্য যদি তারা এটিকে প্রশ্নে না ফেলে তবে আমি সাধারণত ধরে নিই যে তারা এটি বিবেচনা করে নি।
জারেডপাড়

1
হেল্পার লেখার কাজটি অযথাই হয় less পরিবর্তে, একটি বিস্তৃত পরীক্ষা স্যুট সহ একটি সহায়ক লিখুন।
ডলমেন

3
@dolmen আপনি ধারণা সঙ্গে পরিচিত কোড পুনঃব্যবহারের ? ও
রাশিও

4

আপনি নিম্নলিখিত মত কিছু ব্যবহার করতে পারে।

a / b + ((Math.Sign(a) * Math.Sign(b) > 0) && (a % b != 0)) ? 1 : 0)

12
এই কোডটি দুটি উপায়ে স্পষ্টতই ভুল। প্রথমত, বাক্য গঠনতে একটি ছোট্ট ত্রুটি রয়েছে; আপনার আরও বন্ধনী প্রয়োজন। তবে আরও গুরুত্বপূর্ণ বিষয় এটি পছন্দসই ফলাফল গণনা করে না। উদাহরণস্বরূপ, একটি = -1000000 এবং খ = 3999 দিয়ে পরীক্ষা করার চেষ্টা করুন The নিয়মিত পূর্ণসংখ্যা বিভাগের ফলাফল -250। দ্বিগুণ বিভাগটি -250.0625 ... কাঙ্ক্ষিত আচরণটি বৃত্তাকারটি হয়। স্পষ্টতই -250.0625 থেকে সঠিক রাউন্ডিংটি -250 অবধি রয়েছে, তবে আপনার কোডটি -249 পর্যন্ত রয়েছে।
এরিক লিপার্ট

36
আমি এ কথাটি বলতে থাকায় দুঃখিত তবে আপনার কোডটি এখনও ভ্রান্ত ড্যানিয়েল। 1/2 এর উপরে 1-এর বৃত্তাকার হওয়া উচিত, তবে আপনার কোডটি এটি নীচে 0 থেকে শুরু করে। আমার পরামর্শ: তা করা বন্ধ করুন। যখন কেউ আপনার কোডটিতে একটি ত্রুটি খুঁজে পেয়েছে, তখন বাগ কী কারণে প্রথম স্থানে চলেছে তা স্পষ্টভাবে চিন্তা না করে কেবল একত্রে চড় মারবেন না। ইঞ্জিনিয়ারিংয়ের ভাল অনুশীলনগুলি ব্যবহার করুন; অ্যালগরিদমের ত্রুটিটি খুঁজে এটি ঠিক করুন fix আপনার অ্যালগরিদমের তিনটি ভুল সংস্করণের ত্রুটিটি হ'ল আপনি যখন গোলটি "ডাউন" ছিলেন তখন সঠিকভাবে নির্ধারণ করছেন না।
এরিক লিপার্ট

8
এই ছোট্ট কোডের কোডে কতগুলি বাগ থাকতে পারে তা অবিশ্বাস্য। আমার এটি নিয়ে ভাবার খুব বেশি সময় হয়নি - ফলাফলটি মন্তব্যে প্রকাশ পায়। (1) a * b> 0 এটি ওভারফ্লো না হলে সঠিক হবে। A এবং b এর চিহ্নের জন্য এখানে 9 টি সংমিশ্রণ রয়েছে - [-1, 0, +1] এক্স [-1, 0, +1]। [কে -১, ০, +১] এক্স [-1, +1] রেখে আমরা খ == 0 কেস উপেক্ষা করতে পারি। a / b গোলাকার শূন্যের দিকে, এটি নেতিবাচক ফলাফলগুলির জন্য বৃত্তাকার এবং পজিটিভ ফলাফলগুলির জন্য বৃত্তাকার হয়। সুতরাং ক এবং বি এর একই চিহ্ন থাকলে এবং উভয়ই শূন্য না হলে সমন্বয়টি সম্পাদন করতে হবে।
ড্যানিয়েল ব্রুকনার

5
এই উত্তরটি সম্ভবত এসওতে আমি সবচেয়ে খারাপ লিখেছি ... এবং এটি এখন এরিকের ব্লগের সাথে যুক্ত হয়েছে ... ঠিক আছে, আমার উদ্দেশ্য একটি পাঠযোগ্য সমাধান দেওয়ার নয়; আমি একটি সংক্ষিপ্ত এবং দ্রুত হ্যাক জন্য সত্যিই লক ছিল। এবং আমার সমাধানটি আবারও রক্ষা করতে, আমি প্রথমবারের মতো ধারণাটি পেয়েছিলাম, কিন্তু অতিরিক্ত প্রবাহ সম্পর্কে ভাবি নি। কোডটি ভিজুয়ালস্টুডিওতে না লিখে পরীক্ষা না করে পোস্ট করা অবশ্যই আমার ভুল ছিল। "ফিক্সগুলি" আরও খারাপ - আমি বুঝতে পারি নি যে এটি একটি ওভারফ্লো সমস্যা এবং ভেবেছিলাম আমি একটি যৌক্তিক ভুল করেছি। ফলস্বরূপ প্রথম "ফিক্স" কোনও পরিবর্তন করেনি; আমি সবেমাত্র
উল্টিয়েছি

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

-2

উপরের উত্তরগুলির কয়েকটি ফ্লোট ব্যবহার করে, এটি অদক্ষ এবং সত্যই প্রয়োজনীয় নয়। স্বাক্ষরবিহীন ints জন্য এটি int1 / int2 জন্য একটি কার্যকর উত্তর:

(int1 == 0) ? 0 : (int1 - 1) / int2 + 1;

স্বাক্ষরিত ইনটগুলির জন্য এটি সঠিক হবে না


ওপি প্রথম স্থানে যা বলেছিল তা নয়, অন্য উত্তরগুলিতে সত্যই যুক্ত হয় না।
santmanno

-4

এখানে সমস্ত সমাধানগুলির সাথে সমস্যাটি হ'ল তাদের একটি castালাই প্রয়োজন বা তাদের একটি সংখ্যাসূচক সমস্যা রয়েছে। ভাসা বা ডাবল কাস্ট করা সর্বদা একটি বিকল্প, তবে আমরা আরও ভাল করতে পারি।

আপনি যখন @ জেরিজেভিএল থেকে উত্তরের কোডটি ব্যবহার করবেন

int div = myInt1 / myInt2;
if ((div >= 0) && (myInt1 % myInt2 != 0))
    div++;

একটি রাউন্ডিং ত্রুটি আছে। 1/5 টি গোল হয়ে যাবে, কারণ 1% 5! = 0. তবে এটি ভুল, কারণ রাউন্ডিং কেবল তখনই ঘটবে যদি আপনি 1 টি 3 এর সাথে প্রতিস্থাপন করেন, সুতরাং ফলাফলটি 0.6 হয়। আমাদের যখন গণনাটি 0.5 এর চেয়ে বড় বা তার সমান মান দেয় তখন রাউন্ড আপ করার জন্য আমাদের একটি উপায় অনুসন্ধান করতে হবে। উপরের উদাহরণের মডুলো অপারেটরের ফলাফলটির পরিধি 0 থেকে myInt2-1 পর্যন্ত রয়েছে। রাউন্ডিং কেবল তখনই ঘটতে পারে যখন বাকী অংশটি বিভাজকের 50% এর বেশি হয়। সুতরাং অ্যাডজাস্টেড কোডটি এর মতো দেখাচ্ছে:

int div = myInt1 / myInt2;
if (myInt1 % myInt2 >= myInt2 / 2)
    div++;

অবশ্যই আমাদেরও আইএনটি 2/2 এ গোলাকার সমস্যা রয়েছে, তবে এই ফলাফলটি আপনাকে এই সাইটের অন্যান্যগুলির চেয়ে আরও ভাল গোলাকার সমাধান দেবে।


"আমাদের যখন গণনাটি 0.5 এর চেয়ে বড় বা তার সমান মান দেয় তখন আমাদের রাউন্ড আপ করার একটি উপায় খুঁজে বের করতে হবে" - আপনি এই প্রশ্নের বিন্দুটি মিস করেছেন - বা সর্বদা গোল হয়ে যান অর্থাৎ ওপি 0.001 থেকে 1 এর মধ্যে গোল করতে চায়।
গ্রাহ্ম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.