নির্বিচারে নির্ভুলতা বিভাগ প্রয়োগ করুন


15

একটি ফাংশন কার্যকর করুন divide(int a, int b, int c)যা বেস 10 এর মান মুদ্রণ করে a/b। কোনও ভাসমান পয়েন্ট গণিত বা BigInteger/ BigDecimalঅথবা সমমানের লাইব্রেরি ব্যবহার না করেই । cসেটের মধ্যে অন্তত সঠিক অক্ষরগুলি 0123456789.অবশ্যই নীচে be পয়েন্টে (সম্ভাব্য) ব্যতিক্রম ব্যতীত অবশ্যই মুদ্রিত করতে হবে।

  1. aএবং bকোনও 32 বিট পূর্ণসংখ্যার হতে পারে। আপডেট: যদি, গল্ফিংয়ের উদ্দেশ্যে, আপনি চাইলে ইনপুটটি bit৪ বিট আদিম হতে হবে যা ঠিক আছে, তবে আপনাকে পুরো bit৪ বিট পরিসরের ডেটা সমর্থন করার দরকার নেই।
  2. আপনার যদি cএটি ইতিবাচক হয় তা পরীক্ষা করার দরকার নেই (যদিও আশা করি আপনার প্রোগ্রামটি ক্রাশ না হয়ে) যদি তা না হয়।
  3. ন্যূনতম উপরের জন্য আবদ্ধ সমর্থিত cহয় 500। আপনার প্রোগ্রামটি যদি cউপরের মানগুলি সমর্থন না করে 500তবে এটি ঠিক আছে, তবে এটি যদি ঠিক থাকে তবে তা ঠিক okay
  4. যে সংখ্যাগুলি সমানভাবে বিভক্ত হয়, তাদের জন্য অতিরিক্ত জিরো (মানটির ভিত্তিতে c) প্রিন্ট করা উচিত বা কিছুই নয় তা আপনার পছন্দ ।
  5. ভাগফলের সাথে আরও কোনও কাজ করার জন্য আপনাকে ফাংশনটি ব্যবহার করতে সক্ষম হতে হবে না, একমাত্র লক্ষ্য মুদ্রণ।
  6. -1এবং এর মধ্যে সংখ্যার জন্য 1, শীর্ষস্থানীয় মুদ্রণ করা উচিত কিনা তা আপনার পছন্দ 0। তবে এটিই একমাত্র দৃশ্যে যেখানে শীর্ষস্থানীয় শূন্যটি মুদ্রণযোগ্য তা গ্রহণযোগ্য এবং আপনি কেবল এমন একটি শূন্য মুদ্রণ করতে পারেন।
  7. আপনি সর্বশেষ দশমিক জায়গার জন্য পছন্দমত যে কোনও রাউন্ডিং / ফ্লোর / সিল যুক্তি ব্যবহার করতে পারেন।
  8. নেতিবাচক উত্তরের জন্য, আপনাকে অবশ্যই একটি শীর্ষস্থানীয় মুদ্রণ করতে হবে -। এই দিকে গণনা হয় না c। যাইহোক, এটা আপনার পছন্দের যদি আপনি মুদ্রণ করতে চান হয় , +অথবা একটি ইতিবাচক উত্তরের জন্য কিছুই নেই।
  9. পূর্ণসংখ্যা বিভাগ এবং পূর্ণসংখ্যা মডুলাস উভয়ই অনুমোদিত। তবে, মনে রাখবেন আপনি আদিমদের মধ্যে সীমাবদ্ধ, যদি না আপনি নিজের কোড BigInteger/ BigDecimalদৈর্ঘ্যের বিপরীতে গণনা করা নিজের / লাইব্রেরি প্রয়োগ করতে চান ।
  10. আপনার bসত্তা হ্যান্ডেল করার দরকার নেই 0, যদিও আপনি চাইলে করতে পারেন। আপনার প্রোগ্রামটি যদি একটি অসীম লুপ বা ক্র্যাশ প্রবেশ করতে পারে তবে b=0তা আপনাকে দণ্ডিত করা হবে না।
  11. মন্তব্য প্রতি সামান্য নিয়ম পরিবর্তন। খেলার ক্ষেত্রটি স্তরপূর্ণ aএবং b32 বিট পূর্ণসংখ্যার গ্যারান্টিযুক্ত রয়েছে তা নিশ্চিত করার জন্য, আপনি 64 বিট দীর্ঘ পূর্ণসংখ্যার ব্যবহার করতে পারেন। যদি আপনার নির্বাচিত ভাষাটি আদিম হিসাবে bit৪ বিটের পূর্ণসংখ্যার অতিক্রম করে, আপনি কোনও সময় সেই কার্যকারিতাটি ব্যবহার করতে পারবেন না (ভান করে এটি 64৪ বিটের উপরে আবদ্ধ করা হয়েছে)।
  12. অস্পষ্ট আরেকটি বিষয় (এটি বর্তমান বৈধ উত্তরগুলির কোনওটি পরিবর্তন করা উচিত নয়) cতবে দশমিকের পরে মুদ্রিত অক্ষরের সংখ্যা বা স্পেসের সংখ্যা হিসাবে ব্যাখ্যা করা যেতে পারে, আপনার প্রোগ্রামটি অবশ্যই cকোনওভাবে প্রাসঙ্গিকভাবে ব্যবহার করতে হবে কত অক্ষর মুদ্রণ করতে হবে তা স্থির করতে। অন্য কথায়, divide(2,3,2)তুলনায় অনেক কম আউটপুট হওয়া উচিত divide(2,3,500); বিবেচনা না করে 500 অক্ষর মুদ্রণ করা ঠিক নয় c
  13. আমি আসলে ফাংশনটির নামটি যত্ন করি না। dগল্ফিং উদ্দেশ্যে ঠিক আছে।

ইনপুট

ফাংশন কল এবং পাঠ্য উভয়ই stdinগ্রহণযোগ্য। আপনি যদি পড়ে stdinথাকেন তবে সেটে কোনও অক্ষরই [-0123456789]আর্গুমেন্ট ডিলিমিটার হিসাবে বিবেচিত হবে।

আউটপুট

stdoutউপরে বর্ণিত হিসাবে অক্ষর

উদাহরণ

কারণ divide(2,3,5), নিম্নলিখিত সমস্ত গ্রহণযোগ্য আউটপুট:

0.666
0.667
.6666
.6667
 0.666
 0.667
 .6666
 .6667
+0.666
+0.667
+.6666
+.6667

অন্য একটি উদাহরণ: divide(371,3,5)নিম্নলিখিতগুলির জন্য সমস্ত গ্রহণযোগ্য আউটপুট রয়েছে:

123.6
123.7
 123.6
 123.7
+123.6
+123.7
123.66666
123.66667
 123.66666
 123.66667
+123.66666
+123.66667

এবং divide(371,-3,5)নিম্নলিখিতগুলির জন্য সমস্ত গ্রহণযোগ্য:

-123.6
-123.7
-123.66666
-123.66667

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


1
আপনি কিভাবে সঠিক সংখ্যা গণনা করবেন ? আপনার উদাহরণে আমি তিন বা চারটি দেখতে পাচ্ছি কিন্তু শেষ যুক্তির সূত্র হিসাবে পাঁচটি নয়।
হাওয়ার্ড

@ হওয়ার্ড, যদি আপনি 92,3,5উত্তরটি করেন তবে উদাহরণস্বরূপ30.67
durron597

1
বিটিডব্লিউ 370/3 = 123.333 লোল
ইজাবেরের

উত্তর:


5

জাভা, 92/128

void d(long a,int b,int c){if(a<0^b<0){a=-a;p('-');}for(p(a/b+".");c>0;c--)p((a=a%b*10)/b);}<T>void p(T x){System.out.print(x);}

আমাকে ইম্প্রোভাইজ করতে হয়েছিল যাতে aবা b-2147483648 হতে পারে পজিটিভ 32-বিট ইন্টিজারগুলি কেবল 2147483647 এর দিকে গুনে, তাই সে কারণ aহয়ে উঠেছে long। সেখানে নেতিবাচক ফলাফল হ্যান্ডলিং একটি ভাল উপায় হতে পারে, কিন্তু আমি জানি কেউ নেই ( doubleগুলি সম্ভবত পাবে এই কাজ করার জন্য abs(a) < abs(b)তারা আছে যেমন -0কিন্তু শুধুমাত্র বেশী 'সম্পূরক স্পষ্টতা রাখা হবে)।

দুটি বাইট নম্বর কেন? আমার গণনার জন্য 92 বাইট এবং প্রিন্ট- System.out.printহেল্পারের 36 টি দরকার ছিল ( সাকস; সাধারণত জাভা তেমন গল্ফ নয়)।

public class Div {

    void d(long a, int b, int c) {
        if (a < 0 ^ b < 0) {
            a = -a;
            p('-');
        }
        for (p(a / b + "."); c > 0; c--) {
            p((a = a % b * 10) / b);
        }
    }

    <T> void p(T x) {
        System.out.print(x);
    }

    public static void main(String[] args) {
        final Div div = new Div();
        div.d(12345, 234, 20);
        div.p('\n');
        div.d(-12345, 234, 20);
        div.p('\n');
        div.d(234, 234, 20);
        div.p('\n');
        div.d(-234, 234, 20);
        div.p('\n');
        div.d(234, 12345, 20);
        div.p('\n');
        div.d(234, -12345, 20);
        div.p('\n');
        div.d(-234, 12345, 20);
        div.p('\n');
        div.d(-234, -12345, 20);
        div.p('\n');
        div.d(-2147483648, 2147483647, 20);
        div.p('\n');
        div.d(2147483647, -2147483648, 20);
        div.p('\n');
    }
}

পদ্ধতিটি মূলত আমাদের বেশিরভাগ স্কুলে যা শিখেছে তা অনুরোধযুক্ত দশমিক সংখ্যা তৈরি করতে অনুশীলন করে।


সরকারী রায়: আমি বলব যে উপেক্ষা Integer.MIN_VALUEকরা ঠিক নয় তবে longইনপুট ঠিক আছে বলে ।
durron597

এটি অনেক খাটো। সুন্দরভাবে সম্পন্ন.
durron597

@ durron597 আপনাকে ধন্যবাদ তবুও কঠোর টাইপিং এবং System.outজাভাটিকে বিশাল মনে হচ্ছে ;-) এখনও একটি ভাল অনুভূতি, যে ইতিমধ্যে আরও উত্তর পোস্ট করা হয়েছে।
দ্য কনস্ট্রাক্টর

1
@ durron597 আপনি বিশেষ করে কোনও ফাংশন চেয়েছিলেন তাই আমি চেষ্টা করেছি এটি গণনা করা হবে না। আমি যদি সম্ভবত হ্যাঁ আমদানি ব্যবহার করতে হয়।
দ্য কনস্ট্রাক্টর

1
কমপক্ষে প্রতিটি ভেরিয়েবলের জন্য কোনও $ নেই ;-)
দ্য কনস্ট্রাক্টর

9

সি, 98 95 89

d(a,b,c){if(a>0^b>0)a=-a,printf("-");for(printf("%d.",a/b);c--;putchar(a/b+48))a=a%b*10;}

এর cপরে অঙ্কগুলি মুদ্রণ করে.

উদাহরণ আউটপুট:

d(2,3,5);
0.66666

d(-2,3,5);
-0.66666

d(24352345,31412,500);
775.25611231376543995925124156373360499172290844263338851394371577740990704189481726728638736788488475741754743410161721635043932255189099707118298739335285878008404431427479943970457150133706863618999108620909206672609193938622182605373742518782630841716541449127721889723672481854068508850120972876607665860180822615560932127849229593785814338469374761237743537501591748376416656055010823888959633261174073602444925506175983700496625493441996689163377053355405577486310963962816757926906914554947153953

d(-77,12346463,500);
-0.00000623660395693892250760399962321192717298873369644407471192356871761572524859953818352673150196943043525906974329409159530142357369879940514137530724386409289850866600418273638369142644334656816288195250736992448768525852302801215214430238036593962173620088603513411087855687900251270343579371679160258286118056645048869461642577311412993340683886551152342172814999729072204727783171585254821563066280601982932277851559592411203111368818745903178910429650985873444078680671541315111866451144752954

-2147483647 <= a <= 2147483647, খ এর জন্য একই কাজ করা উচিত। হ্যান্ডলিং -একটি ব্যথা ছিল।

অনলাইন সংস্করণ: আদর্শ


এটি কি -2147483648 সত্তার জন্য কাজ করে? সি সংকলকগুলিকে আপনার প্যারামিটারগুলিতে কোন পূর্ণসংখ্যার ধরণ নির্ধারণ করা হয়েছে তা জানার জন্য যথেষ্ট পরিমাণে জানেন না।
দ্য কনস্ট্রাক্টর

এটা ইশারা জন্য ধন্যবাদ. এটি -2147483647 <= a <= 2147483647, খ এর জন্য একইভাবে কাজ করে। যখন একটি = -2147483648 এবং বি এর কারণে ইতিবাচক হয় তখন একটি সমস্যা হয় a=-a
ইজাবেরের

আমি চেষ্টা করেছি কিন্তু শেষ পর্যন্ত আপনার মত একই সমাধান পেয়েছি। আপনি printf("-")1 টি প্রত্যাবর্তন বুঝতে পেরে একটি চরিত্র সংরক্ষণ করতে পারেন
থমাস

4

পিএইচপি, 108

function d($a,$b,$c){$a*$b<0&&$a*=-print'-';for($p='.';$c--;$a.=0,print$i.$p,$p='')$a-=$b*$i=($a-$a%$b)/$b;}

এটি কেবলমাত্র ভাগফলের আউটপুট করে কাজ করে ab লুপের / এর সময়কালেরc পদক্ষেপগুলির , aপ্রতিটি পুনরাবৃত্তিতে 10 দ্বারা বাকি গুণিত হয়।

ডেমো


কোনও বা বি নেতিবাচক হলে অদ্ভুত ফলাফল
উত্পন্ন করে

আমি নেগেটিভ সংখ্যার জন্য বাগ ঠিক করেছি। ধন্যবাদ!
রাজওয়ান

শুধু তোমার কোডের একটি 112 সংস্করণ পাওয়া যায়নি: function d($a,$b,$c){if($a*$b<0)$a*=-print'-';for($p='.';$c--;$a*=10,$p=''){$a-=$b*$i=($a-$a%$b)/$b;echo$i.$p;}}দেখুন ফেরত মান
TheConstructor

ধন্যবাদ। এমনকি আমি আপনার সংস্করণ আপডেট করেছি এবং অতিরিক্ত 1 বাইট জিততে সক্ষম হয়েছি
রাজওয়ান

2

পাইথন 111

f=lambda a,b,c:'-'[a*b>=0:]+'%s'%reduce(lambda(d,r),c:(d%c*10,r+`d/c`+'.'[r!='':],),[abs(b)]*c,(abs(a),''))[-1]

এই সমাধানটি বর্ণিত কোনও বিধি লঙ্ঘন করে না।


2

সি: 72 টি অক্ষর

d(a,b,c){for(printf("%d.",a/b);c--;putchar((a=abs(a)%b*10)/abs(b)+48));}

এটি প্রায় সম্পূর্ণরূপে এটি করার কথা বলে। তবে এটি এখানে অন্যান্য উত্তরগুলির মতো যেমন জঘন্য মান দেয় বা ব্যর্থ হয় d(-2147483648,b,c)এবং d(a,-2147483648,c)যেহেতু -2147483648 এর নিখুঁত মান 32-বিট শব্দের সীমা ছাড়িয়ে যায়।


2

পার্ল, কোনও গাণিতিক নয়, 274 বাইট

এটি ইউক্লিডিয়ান দীর্ঘ বিভাগ, সম্ভবত অস্বাভাবিক পরিমাণে স্মৃতি গ্রাস করতে পারে। ভাসমান-পয়েন্ট সংখ্যাগুলিতে এটি গণিতের নিকটতমতম অংশটি তাদের পার্স করতে বিট ক্রিয়াকলাপ ব্যবহার করে।

sub di{($v,$i,$d,$e)=(0,@_);($s,$c,$j)=$i=~s/-//g;$s^=$d=~s/-//g;
$i=~s/\.(\d+)/$j=$1,""/e;$d=~s/\.(\d+)/$c=$1,""/e;
$z=0.x+length($c|$j);$i.=$j|$z;$d.=$c|$z;
($e,$m,$z,$t)=(1.x$e,0.x$i,0.x$d,"-"x($s&1));
for(;$e;$t.="."x!$v,$v=chop$e){$t.=$m=~s/$z//g||0;$m="$m"x10}
print"$t\n"}

উদাহরণ:

di(-355,113,238);
di(1.13,355,239);
di(27942,19175,239);
di(1,-90.09,238);
di("--10.0","----9.801",239);
di(".01",".200",239);

আউটপুট:

-3.141592920353982300884955752212389380530973451327433628318
584070796460176991150442477876106194690265486725663716814159
292035398230088495575221238938053097345132743362831858407079
646017699115044247787610619469026548672566371681415929203539

0.0031830985915492957746478873239436619718309859154929577464
788732394366197183098591549295774647887323943661971830985915
492957746478873239436619718309859154929577464788732394366197
183098591549295774647887323943661971830985915492957746478873

1.4572099087353324641460234680573663624511082138200782268578
878748370273794002607561929595827900912646675358539765319426
336375488917861799217731421121251629726205997392438070404172
099087353324641460234680573663624511082138200782268578878748

-0.011100011100011100011100011100011100011100011100011100011
100011100011100011100011100011100011100011100011100011100011
100011100011100011100011100011100011100011100011100011100011
100011100011100011100011100011100011100011100011100011100011

1.0203040506070809101112131415161718192021222324252627282930
313233343536373839404142434445464748495051525354555657585960
616263646566676869707172737475767778798081828384858687888990
919293949596979900010203040506070809101112131415161718192021

0.0500000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000

1

রুবি, 178

def d(a,b,c)
    n=(a<0)^(b<0)
    a=-a if n
    m=a/b-b/a
    l=m.to_s.size-1
    g=(a*10**(10+c)/b).to_s
    f=m<0?"."+"0"*(l-1)+g[0..c-l-1] : g[0..l]+"."+g[l+1..c-2]
    p n ? "-"+f : f
end

পরীক্ষার জন্য অনলাইন সংস্করণ

কৌশলটি হ'ল একটি সুন্দর উচ্চ সংখ্যার সাথে গুণিত করা , সুতরাং ফলটি কেবলমাত্র ভাসমান পয়েন্ট অপারেশনের একটি সংখ্যার একাধিক। তারপরে বিন্দু এবং শূন্যগুলি ফলস্বরূপ স্ট্রিংয়ে সঠিক জায়গায় sertedোকাতে হবে।


এই 350 এর চেয়ে বড় গ এর জন্য কাজ করে?
durron597

আমি এটি সি = 1000 দিয়ে পরীক্ষা করেছি - কোডটি আমাকে উত্তর দিয়েছে, সম্ভবত আমার আসল ফলাফলটি চেক করা উচিত ...
ডেভিড হারম্যান

2
gবড় জন্য 64 বিট অতিক্রম করতে হবে c? সম্পাদনা: আমি মনে করি আপনি BigIntegerএখানে
স্পষ্টভাবে

এরর, gএকটি স্ট্রিং, তবে আপনি কল করার আগে আপনি to_sমেমরিতে এমন একটি সংখ্যা তৈরি করেছেন যা আকারে
b৪ বিটেরও

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

1

পাইথন 92 বাইট:

def d(a,b,c):c-=len(str(a/b))+1;e=10**c;a*=e;a/=b;a=str(a);x=len(a)-c;return a[:x]+'.'+a[x:]

আমার মনে হয় আরও কিছু গল্ফ করা সম্ভব .....


2
eবড় গ এর জন্য 64 বিট অতিক্রম করতে হবে? সম্পাদনা: আমার মনে হয় আপনি এখানে নিখুঁতভাবে ব্যবহার করছেন BigInteger
durron597

1
@ durron597 আমি অত্যন্ত সন্দেহ করি doubt এটি বিগআইন্টে যায় (পাইথ ইন লাইট ইন) তবে 2 ** 45 টি 48 বিট। এটাই কি যথেষ্ট অনুমান ?? এছাড়াও, অজগরের কোনও আদিম
পদার্থ নেই

যদি a=5এবং c=400তারপরে e=10**c, হেক্সে, সংখ্যাটি 333 ডিজিট দীর্ঘ। এটি শুরু হয় এটি 8889e7dd7f43fc2f7900bc2eac756d1c4927a5b8e56bbcfc97d39bac6936e648180f47d1396bc905a47cc481617c7...64 বিটেরও বেশি।
durron597

@ durron597 400 ... আমার কি এটি দরকার
মালটিসেন

1
হ্যাঁ নিয়ম 3 বলছে আপনাকে কমপক্ষে 500 টি পর্যন্ত সমর্থন করা দরকার ... আমি এই (ইমো তুচ্ছ) সমাধানটি রোধ করার চেষ্টা করছিলাম।
durron597

1

সি 83

d(a,b,c){printf("%d.",a/b);for(a=abs(a),b=abs(b);c--&&(a=a%b*10);)putchar(a/b+48);}

আমার অজগর বাস্তবায়নে আমি একই আইডিয়া ব্যবহার করেছি


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