সি # তে পূর্ণসংখ্যার জন্য আমি কীভাবে বিভাজন এবং মডুলো গণনা করতে পারি?


87

C # তে পূর্ণসংখ্যার সংখ্যার জন্য আমি বিভাগ এবং মডুলো কীভাবে গণনা করতে পারি?


16
এটি খুব বেসিক হতে পারে তবে এটি একটি আসল প্রশ্ন ...

4
অপারেটার কেন সি # তে মডুলাস অপারেটর নয় সে সম্পর্কিত একটি সম্পর্কিত পোস্ট এবং অবশ্যই একটি ব্লগ পড়তে হবে । %
আরবিটি

উত্তর:


124

এই জাতীয় প্রশ্ন জিজ্ঞাসা করার আগে, দয়া করে এমএসডিএন ডকুমেন্টেশন পরীক্ষা করুন ।

আপনি যখন দুটি পূর্ণসংখ্যা ভাগ করেন, ফলাফল সর্বদা পূর্ণসংখ্যার হয়। উদাহরণস্বরূপ, 7/3 এর ফলাফল 2 7/3 এর অবশিষ্টটি নির্ধারণ করতে, অবশিষ্ট অপারেটর ( % ) ব্যবহার করুন ।

int a = 5;
int b = 3;

int div = a / b; //quotient is 1
int mod = a % b; //remainder is 2

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

4
সত্য, আমি এই জাতীয় পোস্টগুলি পড়েছি এবং আমার অ্যাপ্লিকেশনটিতে আমার সমস্যা হয়েছিল :)
অ্যাপোক্যালাইস

4
... ঘোষণার ঠিক কী আছে aএবং bআপনি যদি সেগুলি ব্যবহার না করে থাকেন? : ডি
লিভিয়াথনবাদার

4
সম্ভবত ব্যবহারকারীর একটি ডিভাইরাম ফাংশনটির জন্য (আমার মতো) অনুসন্ধান করা হয়েছিল, সুতরাং প্রশ্নটি প্রথম নজরে মনে হয় এমন তুচ্ছ হতে পারে না। ধন্যবাদ @danodonovan
ত্রানকাদির

4
উত্তরগুলি এই উত্তর দাবির মতো সহজ নয়, যেমন অন্যরাও উল্লেখ করেছে এবং হার্ড-টু-ডিবাগ ভুল হতে পারে। Https://stackoverflow.com/questions/10065080/mod-explanation
সানসুইট

90

এছাড়াও আছে Math.DivRem

quotient = Math.DivRem(dividend, divisor, out remainder);

4
এটি আমার মতে সঠিক উত্তর হওয়া উচিত, কারণ এটি একটি ফাংশনে ভাগফল এবং বাকী অংশ সরবরাহ করে। আমি নিশ্চিত নই যে কোন পদ্ধতিটি ভালভাবে সম্পাদন করে (ভাগফল পেতে "a / b" এবং তারপরে "a% b" ব্যবহার করে অবশিষ্ট বা ম্যাথ.ডাইভ্র্যাম পাওয়ার জন্য) তবে এই পন্থাটি অবশ্যই পড়তে হবে খুব ভাল (আমার ক্ষেত্রে আমার প্রয়োজন ভাগফল এবং বাকি উভয়ই জানতে) - আপনাকে ধন্যবাদ!
ইগর

4
@ ইগর ধন্যবাদ, যখন মূল প্রশ্নের উত্তর দেওয়া হয়েছিল তখন এই ফাংশনটি উপস্থিত ছিল না! যাইহোক, ফাংশনটির অস্তিত্ব ডকুমেন্টেশন চেক করার বিষয়ে সি-সি-র মন্তব্যকে কিছুটা নির্বোধ
দেখায়

6
কেবল বিভ্রান্তি এড়াতে, একটি Math.DivRemক্রিয়ায় ডিভ এবং মোড গণনা করে না। এটি শুধু একটি সাহায্যকারী ফাংশন এবং তার সোর্স কোড ঠিক হল: public static int DivRem(int a, int b, out int result) { result = a%b; return a/b; }
নাইটএলফিক

9
@ নাইটএলফিক ভবিষ্যতে বাস্তবায়ন পরিবর্তিত হতে পারে এবং রানটাইমের পক্ষে বিচ্ছিন্নতা divremনির্দেশাবলীর চেয়ে অনুকূলকরণের জন্য একটি পদ্ধতি কল সনাক্ত করা সহজ
kbolino

6
@kbolino এটা একটি বড় ভবিষ্যদ্বাণী আছে, যেহেতু এটা হয়েছে পরিবর্তিত , অন্তত .NET কোর মধ্যে, ভাগ, ও বিয়োগ করতে হবে। এবং সেখানে, RyuJIT পরিকল্পনা একটি একক এক্স 86 DIV আছে নির্দেশ ব্যবহার করতে আরও optimisations যদিও বোঝা যাচ্ছে যে নেতারা জে আই টি JIT পরিবর্তন সনাক্ত করা উচিত %এবং /অপারেটরদের যদি স্বতন্ত্রভাবে ব্যবহার করা হয়েছে।
বব

15

মজার ব্যাপার!

'মডুলাস' অপারেশনটি এই হিসাবে সংজ্ঞায়িত করা হয়েছে:

a % n ==> a - (a/n) * n

রেফ: মডুলার গাণিতিক

সুতরাং আপনি নিজের রোল করতে পারেন , যদিও এটি% অপারেটরে অন্তর্নির্মিত তুলনায় আরও কম ধীর হবে:

public static int Mod(int a, int n)
{
    return a - (int)((double)a / n) * n;
}

সম্পাদনা: বাহ, ভুলভাবে এখানে ভুলভাবে কথা বলা হয়েছে মূলত, আমাকে ধরার জন্য @ জোরেেনকে ধন্যবাদ

এখন আমি এখানে নির্ভর করছি যে সি # তে বিভাগ + কাস্ট-টু-ইন্ট সমান Math.Floor(যেমন এটি ভগ্নাংশকে হ্রাস করে), তবে "সত্য" বাস্তবায়ন এর পরিবর্তে এমন কিছু হবে:

public static int Mod(int a, int n)
{
    return a - (int)Math.Floor((double)a / n) * n;
}

আসলে, আপনি নিম্নলিখিতগুলির সাথে% এবং "সত্যিকারের মডুলাস" এর মধ্যে পার্থক্যগুলি দেখতে পাচ্ছেন:

var modTest =
    from a in Enumerable.Range(-3, 6)
    from b in Enumerable.Range(-3, 6)
    where b != 0
    let op = (a % b)
    let mod = Mod(a,b)
    let areSame = op == mod
    select new 
    { 
        A = a,
        B = b,
        Operator = op, 
        Mod = mod, 
        Same = areSame
    };
Console.WriteLine("A      B     A%B   Mod(A,B)   Equal?");
Console.WriteLine("-----------------------------------");
foreach (var result in modTest)
{
    Console.WriteLine(
        "{0,-3} | {1,-3} | {2,-5} | {3,-10} | {4,-6}", 
        result.A,
        result.B,
        result.Operator, 
        result.Mod, 
        result.Same);
}

ফলাফল:

A      B     A%B   Mod(A,B)   Equal?
-----------------------------------
-3  | -3  | 0     | 0          | True  
-3  | -2  | -1    | -1         | True  
-3  | -1  | 0     | 0          | True  
-3  | 1   | 0     | 0          | True  
-3  | 2   | -1    | 1          | False 
-2  | -3  | -2    | -2         | True  
-2  | -2  | 0     | 0          | True  
-2  | -1  | 0     | 0          | True  
-2  | 1   | 0     | 0          | True  
-2  | 2   | 0     | 0          | True  
-1  | -3  | -1    | -1         | True  
-1  | -2  | -1    | -1         | True  
-1  | -1  | 0     | 0          | True  
-1  | 1   | 0     | 0          | True  
-1  | 2   | -1    | 1          | False 
0   | -3  | 0     | 0          | True  
0   | -2  | 0     | 0          | True  
0   | -1  | 0     | 0          | True  
0   | 1   | 0     | 0          | True  
0   | 2   | 0     | 0          | True  
1   | -3  | 1     | -2         | False 
1   | -2  | 1     | -1         | False 
1   | -1  | 0     | 0          | True  
1   | 1   | 0     | 0          | True  
1   | 2   | 1     | 1          | True  
2   | -3  | 2     | -1         | False 
2   | -2  | 0     | 0          | True  
2   | -1  | 0     | 0          | True  
2   | 1   | 0     | 0          | True  
2   | 2   | 0     | 0          | True  

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

@ জোরেন দুঃখিত, তবে না - এটি চালানোর চেষ্টা করুন: Enumerable.Range(0, 10).Select(x => (double)x / 10.0).Select(x => (int)x).ToList().ForEach(x => Console.WriteLine(x));- সমস্ত 0 এর
জেরকিমবল

4
প্রথমে, আমি পূর্ণসংখ্যা বিভাগ সম্পর্কে কথা বলছি । আপনি যদি ভাসমান-পয়েন্ট বিভাগ করেন এবং তারপরে পূর্ণসংখ্যায় ফেলে দেওয়া হয় তবে তা ঘটবে না (যদিও এটি একই ফলাফল দেয়)। দ্বিতীয়ত, আমি নিশ্চিত নই কেন আপনি 0 এবং 9 এর মধ্যে পূর্ণসংখ্যা 10 এর সাথে ভাগ করে এবং পূর্ণসংখ্যার অংশকে ছেদ করার পরে 0 ব্যতীত অন্য কিছু দেওয়ার জন্য কেন আশা করবেন? যদি এর ফলে 1 হয় যা শূন্য থেকে দূরে বা ইতিবাচক অনন্তের দিকে চলে যাবে । তৃতীয়, ধনাত্মক সংখ্যার জন্য শূন্যের দিকে গোল করা এবং নেতিবাচক অসীমের দিকে গোল করার মধ্যে কোনও পার্থক্য নেই , সুতরাং আপনি এমনকি এই সমস্যার সমাধান করছেন না।
জোরেেন

Math.Floor(-10.0 / 3.0)এবং -10 / 3হয় না একই জিনিস।
জোরেন

@ জোরেেন আহ, আমি এখানে সংযোগ বিচ্ছিন্ন দেখতে পাচ্ছি - না, আমি পূর্ণসংখ্যা বিভাগ করছি না , আমি দ্বিগুণ বিভাগ করছি, তারপরে ফলাফলটি পূর্ণসংখ্যায় ফেলেছি - খুব আলাদা।
জেরকিম্বল

14

/অপারেটরটি ব্যবহার করে বিভাগ সঞ্চালিত হয় :

result = a / b;

%অপারেটরটি ব্যবহার করে মডুলো বিভাগ করা হয় :

result = a % b;

4
+1: সুবিধামত প্রকারটি ছেড়ে দেওয়া এটির আরও ভাল উত্তর দেয় :-) আমি বিশ্বাস করি এটি 4.0.-তেও সিস্টেম.সংখ্যক.বিগইন্টিজারের সাথে কাজ করে।

4
% -> হিসাবে Cor_Blimey বলেছেন, এটি মডিউলাস না করেই বাকী অংশ দেয়। উদাহরণস্বরূপ: (-5% 3) == -2 [সি #], -5 মোড 3 = 1 [ওল্ফ্রামালফা ডটকম]।
রহস্যোদ্ঘাটন

4
দ্রষ্টব্য: মডুলো মডুলাসের মতো নয়। Modulo বাকি, Modulus পরম মান।
রায়ান

-4

ব্যবহারকারীর কাছ থেকে দুটি পূর্ণসংখ্যা পড়ুন। তারপরে বাকী অংশ এবং ভাগফল গণনা / প্রদর্শন করুন,

// When the larger integer is divided by the smaller integer
Console.WriteLine("Enter integer 1 please :");
double a5 = double.Parse(Console.ReadLine());
Console.WriteLine("Enter integer 2 please :");
double b5 = double.Parse(Console.ReadLine());

double div = a5 / b5;
Console.WriteLine(div);

double mod = a5 % b5;
Console.WriteLine(mod);

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