ইউক্লিডিয়ান অ্যালগরিদম (সর্বাধিক সাধারণ বিভাজক সন্ধানের জন্য)


22

চ্যালেঞ্জ

এমন একটি প্রোগ্রাম বা ফাংশন লিখুন যা দুটি ইনপুট পূর্ণসংখ্যার গ্রহণ করে iএবং jএবং তাদের সর্বশ্রেষ্ঠ সাধারণ বিভাজককে আউটপুট করে; ইউক্লিডিয়ান অ্যালগরিদম ব্যবহার করে গণনা করা (নীচে দেখুন)।


ইনপুট

ইনপুটটি একটি স্পেস-সীমাবদ্ধ স্ট্রিং প্রতিনিধিত্ব হিসাবে iএবং jবা দুটি পৃথক পূর্ণসংখ্যার হিসাবে নেওয়া যেতে পারে । আপনি ধরে নিতে পারেন যে পূর্ণসংখ্যা 10,000 এর চেয়ে কম বা তার সমান হবে। আপনি ধরেও নিতে পারেন যে ইনপুট পূর্ণসংখ্যা একে অপরের কাছে প্রধান হতে পারে না।


ইউক্লিডিয়ান ব্রেকডাউন

মধ্যে বড় সংখ্যা iএবং jসম্ভব হিসাবে অনেক বার হিসাবে ছোট দ্বারা ভাগ করা হয়। তারপরে, অবশিষ্টটি যুক্ত করা হয়। এই প্রক্রিয়াটি বাকী এবং পূর্ববর্তী সংখ্যার সাথে পুনরাবৃত্তি হয়, যতক্ষণ না বাকী হয়ে যায় 0

উদাহরণস্বরূপ, যদি ইনপুটটি ছিল 1599 650:

1599 = (650 * 2) + 299
 650 = (299 * 2) +  52
 299 =  (52 * 5) +  39
  52 =  (39 * 1) +  13
  39 =  (13 * 3) +   0

চূড়ান্ত সংখ্যা,, 13দুটি ইনপুট পূর্ণসংখ্যার বৃহত্তম সাধারণ বিভাজক। এটি এর মতো ভিজ্যুয়ালাইজ করা যায়:


আউটপুট

আপনার আউটপুট অবশ্যই উপরের ফর্মের ব্রেকডাউন হতে হবে, তার পরে একটি নতুন লাইন এবং জিসিডি হবে। এটি যে কোনও মাধ্যমের মাধ্যমে আউটপুট হতে পারে।


উদাহরণ

ইনপুট

18 27
50 20
447 501
9894 2628

আউটপুট

27 = (18 * 1) + 9
18 =  (9 * 2) + 0
9

50 = (20 * 2) + 10
20 = (10 * 2) +  0
10

501 = (447 * 1) + 54
447 =  (54 * 8) + 15
 54 =  (15 * 3) +  9
 15 =   (9 * 1) +  6
  9 =   (6 * 1) +  3
  6 =   (3 * 2) +  0
3

9894 = (2628 *  3) + 2010
2628 = (2010 *  1) +  618
2010 =  (618 *  3) +  156
 618 =  (156 *  3) +  150
 156 =  (150 *  1) +    6
 150 =    (6 * 25) +    0
6

দ্রষ্টব্য: আউটপুটগুলি উপরে থাকায় স্পেস করতে হবে না। ব্যবধানটি কেবল স্বচ্ছতার জন্য। প্যারেন্টেসিস প্রয়োজন।


বোনাস

যদি আপনার আউটপুট উপরে বর্ণিত হয় তবে আপনি আপনার স্কোর -10% বোনাস যুক্ত করতে পারেন।


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

ঠিক আছে আমি দেখতে পাচ্ছি কিছু উদাহরণের মধ্যে সর্বাধিক সংখ্যা রয়েছে
স্তর নদী সেন্ট

আপনার আসল শিরোনামটি ঠিক ছিল, আমি মেটা কোডেগল্ফ.স্ট্যাকেক্সেঞ্জিং / কিউ / 7043/15599 এ যা ঘটেছিল তাতে মন্তব্য করেছি । "বৃহত্তম সাধারণ ডিনোমিনেটর" শব্দটি ভুল ছিল। "ডিনোমিনেটর" ভগ্নাংশের সাথে সম্পর্কিত। "সর্বশ্রেষ্ঠ সাধারণ ডিনোমিনেটর" গুগলিং কেবল "সর্বশ্রেষ্ঠ সাধারণ বিভাজক / গুণক" এর জন্য ফলাফল দেয়।
স্তর নদী St

আমি ভেবেছিলাম শিরোনামটি ঠিক আছে, তবে কাউকে অসন্তুষ্ট না করার জন্য আমি এটিকে "দ্য" হিসাবে পরিবর্তন করেছি। "বিভাজক", বিটিডাব্লুতে সম্পাদনার জন্য ধন্যবাদ @ স্টেভেভারিল
জ্যাচ গেটস

উত্তর:


4

পাইথ, 33 বাইট

ASQWGs[H\=\(G\*/HG\)\+K%HG)A,KG)H

এটি অনলাইনে ব্যবহার করে দেখুন: বিক্ষোভ বা পরীক্ষা স্যুট

ব্যাখ্যা:

ASQWGs[H\=\(G\*/HG\)\+K%HG)A,KG)H
  Q                                read the two numbers from input
 S                                 sort them
A                                  and assign them to G and H
   WG                              while G != 0:
                      K%HG           assign H mod G to K
     s[H\=\(G\*/HG\)\+K   )          join the following list items and print:
                                        H=(G*(H/G))+K
                           A,KG      assign K, G to G, H
                               )   end while
                                H  print H

7

সিজেম, 46 43 39 বাইট

q~]$3*~\{N5$"=("3$:G'*3$Gmd")+"\}h]7>NG

সিজেএম ইন্টারপ্রেটারে এটি অনলাইনে চেষ্টা করুন ।

কিভাবে এটা কাজ করে

q~]    e# Read all input, evaluate it and wrap the results in an array.
$3*    e# Sort the array and repeat it thrice.
~\     e# Dump the array and swap its last two elements.
{      e# Do:
  N    e#   Push a linefeed.
  5$   e#   Copy the sixth topmost element from the stack.
  "=(" e#   Push that string.
  3$:G e#   Copy the fourth topmost element from the stack. Save it in G.
  '*   e#   Push that character.
  3$   e#   Copy the fourth topmost element from the stack.
  Gmd  e#   Push quotient and remainder of its division by G.
  ")+" e#   Push that string.
  \    e#   Swap the string with the remainder.
}h     e#   If the remainder is positive, repeat the loop.
]7>    e# Wrap the stack in an array and discard its first seven elements.
NG     e# Push a linefeed and G.

6

পাইথন 2, 70

f=lambda a,b:b and'%d=(%d*%d)+%d\n'%(a,b,a/b,a%b)*(a>=b)+f(b,a%b)or`a`

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

বিন্যাসটি স্ট্রিং প্রতিস্থাপনের মাধ্যমে সম্পন্ন করা হয়, গুণকটি পেতে পূর্ণসংখ্যা বিভাগ ব্যবহার করে।

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


5

awk, 78 77

x=$1{for(x<$2?x+=$2-(y=x):y=$2;t=y;x=t)print x"=("y"*"int(x/y)")+",y=x%y}$0=x

আকার অনুসারে ইনপুটটি বাছাই করতে প্রচুর বাইট লাগে: /
এটি এখানে নেমে আসে:

x=$1;
if(x<$2) x+=$2-(y=x); # add $2 subtract $1 and set y to $1
else y=$2;            # set y to $2

আউটপুট

650 1599 (ইনপুট)
1599 = (650 * 2) + 299
650 = (299 * 2) + 52
299 = (52 * 5) + 39
52 = (39 * 1) + 13
39 = (13 * 3) + 0
13

কেবল এটির মজাদার জন্য আমি একটি যথাযথভাবে ব্যবধানযুক্ত সংস্করণও তৈরি করেছিলাম, আমাকে 233 * 0.9 == 209.7 বাইটের স্কোর দিয়েছি।

আপডেট আমি এটিকে 285 বাইট থেকে সংক্ষিপ্ত করতে সক্ষম হয়েছি এবং এখন gawk4 অপশনটির সাথে কল করলে এটি নির্বিচারে দীর্ঘ সংখ্যার জন্য কাজ করে -M

x=$1{x<$2?x+=$2-(y=x):y=$2;a=length(x);b=length(y);for(d=length(x%y);t=y;x=t){$++i=x;$++i=y;if(c<l=length($++i=int(x/y)))c=l;$++i=y=x%y}while(j<NF)printf "%"a"d = %"b-length($(j+2))"s(%d * %"c"d) + %"d"d\n",$++j,_,$++j,$++j,$++j}$0=x

তবে আমি তখনও অনুভূতি পেয়েছিলাম যে আমি কোথাও কোথাও কোনও মানসিক ব্লকের মধ্যে ছুঁড়েছি ...

আউটপুট (gawk4 এর সাথে কল করা awk -M -f code.awk)

6837125332653632513763 18237983363879361 (ইনপুট)
6837125332653632513763 = (18237983363879361 * 374883) + 15415252446024000
     18237983363879361 = (15415252446024000 * 1) + 2822730917855361
     15415252446024000 = (2822730917855361 * 5) + 1301597856747195
      2822730917855361 = (1301597856747195 * 2) + 219535204360971
      1301597856747195 = (219535204360971 * 5) + 203921834942340
       219535204360971 = (203921834942340 * 1) + 15613369418631
       203921834942340 = (15613369418631 * 13) + 948032500137
        15613369418631 = (948032500137 * 16) + 444849416439
          948032500137 = (444849416439 * 2) + 58333667259
          444849416439 = (58333667259 * 7) + 36513745626
           58333667259 = (36513745626 * 1) + 21819921633
           36513745626 = (21819921633 * 1) + 14693823993
           21819921633 = (14693823993 * 1) + 7126097640
           14693823993 = (7126097640 * 2) + 441628713
            7126097640 = (441628713 * 16) + 60038232
             441628713 = (60038232 * 7) + 21361089
              60038232 = (21361089 * 2) + 17316054
              21361089 = (17316054 * 1) + 4045035
              17316054 = (4045035 * 4) + 1135914
               4045035 = (1135914 * 3) + 637293
               1135914 = (637293 * 1) + 498621
                637293 = (498621 * 1) + 138672
                498621 = (138672 * 3) + 82605
                138672 = (82605 * 1) + 56067
                 82605 = (56067 * 1) + 26538
                 56067 = (26538 * 2) + 2991
                 26538 = (2991 * 8) + 2610
                  2991 = (2610 * 1) + 381
                  2610 = (381 * 6) + 324
                   381 = (324 * 1) + 57
                   324 = (57 * 5) + 39
                    57 = (39 * 1) + 18
                    39 = (18 * 2) + 3
                    18 = (3 * 6) + 0
3

কিছু নতুনলাইন এবং ট্যাব যুক্ত হয়েছে

x=$1{
    x<$2?x+=$2-(y=x):y=$2;
    a=length(x);
    b=length(y);
    for(d=length(x%y);t=y;x=t)
    {
        $++i=x;
        $++i=y;
        if(c<l=length($++i=int(x/y)))c=l;
        $++i=y=x%y
    }
    while(j<NF)
        printf "%"a"d = %"b-length($(j+2))"s(%d * %"c"d) + %"d"d\n",
                                               $++j,_,$++j,$++j,$++j
}$0=x

আমি শুরুতে x, y এবং x% y এর প্রাথমিক মানগুলির দৈর্ঘ্যগুলি সংরক্ষণ করতে পারি, কারণ তারা প্রতিটি পদক্ষেপে কেবল ছোট হতে পারে। তবে ফ্যাক্টরের জন্য আমাকে যে কোনও কিছু মুদ্রণের আগে সর্বাধিক দৈর্ঘ্য নির্ধারণ করতে হবে, কারণ এর দৈর্ঘ্য পৃথক হতে পারে। আমি $iএখানে অ্যারে হিসাবে ব্যবহার করি কারণ এটি প্রতিবার [i] ব্যবহারের তুলনায় দুটি অক্ষর সংরক্ষণ করে।


4

সি ++, জিসিসি সংকলক, 171 বাইট (-10%, সুতরাং 154 বাইট)

ঠিক আছে তাই আমার প্রথম চেষ্টা ..

#include<iostream>
using namespace std;
int main()
{
    int a,b,c;
    cin>>a>>b;
    if(a<b)
    swap(a,b);
    while(b>0)
    {
        c=a;
        cout<<a<<" = ("<<b<<" * "<<a/b<<") + "<<a%b<<endl;
        a=b;
        b=c%b;
    }
    cout<<a;
}

কোড গল্ফ টিপস প্রশংসা।

পিএস কি সি ++ ব্যবহার করার সময় মানক শিরোনাম ফাইলগুলির বাইট এবং ইন্ট মেইন গণনা করা দরকার? এটি বাদ দিলে 50 বাইট হ্রাস হয়


দ্রষ্টব্য: কোডটি সুন্দর করার জন্য ব্যবহৃত সাদা স্থানটি বাদ দিয়েছি।
দেবাং জয়চন্দ্রন

3

টি-এসকিউএল (2012+), 268 বাইট

একটি ইনরাইন টেবিল ফাংশন হিসাবে প্রয়োগ করা হয়েছে যা একটি পুনরাবৃত্ত সিটিই কার্যকর করে। 10% বোনাসের জন্য ফর্ম্যাট করার চেষ্টা করা সার্থক হতে পারে, তবে এটির জন্য অপেক্ষা করতে হবে।

CREATE FUNCTION E(@ INT,@B INT)RETURNS TABLE RETURN WITH M AS(SELECT IIF(@<@B,@B,@)A,IIF(@>@B,@B,@)B),R AS(SELECT A,B,A/B D,A%B R FROM M UNION ALL SELECT B,R,B/R,B%R FROM R WHERE 0<>R)SELECT CONCAT(A,'=(',B,'*',D,')+',R)R FROM R UNION ALL SELECT STR(B)FROM R WHERE R=0

ব্যাখ্যা এবং ব্যবহার:

--Create the function
CREATE FUNCTION E(@ INT,@B INT)RETURNS TABLE RETURN
WITH
    --Order the input correctly
    M AS (
          SELECT IIF(@<@B,@B,@)A,
                 IIF(@>@B,@B,@)B
          )
    --Recursive selection
    ,R AS (
          SELECT A,B,A/B D,A%B R FROM M -- Anchor query
          UNION ALL
          SELECT B,R,B/R,B%R FROM R     -- Recurse until R = 0
          WHERE 0<>R
          )
SELECT CONCAT(A,'=(',B,'*',D,')+',R)R   -- Concat results into output string
FROM R 
UNION ALL                               -- ALL required to maintain order
SELECT STR(B)                           -- Add final number
FROM R WHERE R=0

--Function Usage
SELECT * FROM E(447,501)

R
-----------------------------------------------------
501=(447*1)+54
447=(54*8)+15
54=(15*3)+9
15=(9*1)+6
9=(6*1)+3
6=(3*2)+0
3

2

রেভ 1: রুবি, 86

রুরসিভ অ্যালগরিদম, ডুরকনব থেকে পরামর্শ দেওয়ার জন্য ধন্যবাদ।

f=->i,j{j>i&&(i,j=j,i)
0<j ?(print i," = (#{j} * #{i/j}) + #{i%j}
";f[j,i%j]):puts(i)}

রেভ 0: রুবি, 93

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

->i,j{j>i&&(i,j=j,i)
while j>0
print(i," = (#{j} * #{i/j}) + #{i%j}\n")
i,j=j,i%j
end
puts i}

এটিকে কল করুন:

f=->i,j{j>i&&(i,j=j,i)
while j>0
print(i," = (#{j} * #{i/j}) + #{i%j}\n")
i,j=j,i%j
end
puts i}

I=gets.to_i
J=gets.to_i

f.call(I,J)

আপনি a=->i,j{...}কল এবং কল মাধ্যমে পুনরাবৃত্তি ব্যবহার করতে পারেনa মাধ্যমে a[1,2]-not নিশ্চিত যদি এ আপনি অক্ষর সংরক্ষণ হবে, যদিও।
ডোরকনবব

@ ডুরকনব টিপটির জন্য ধন্যবাদ, ল্যাম্বদা ফাংশনগুলি কল করার জন্য আমি এই বাক্য গঠন সম্পর্কে অবগত ছিলাম না (আমার ব্যবহারটি দেখুন f.call) এটি আসলে কিছুটা খাটো, তবে পাইথন থেকে অনেক দূরে এখনও।
স্তর নদী সেন্ট

2

পাওয়ারশেল, 84

একটি পুনরাবৃত্তির কোড ব্লক, একটি ভেরিয়েবলে সঞ্চিত। এটি দিয়ে ডাকা & $e num1 num2যেমন:

$e={$s,$b=$args|Sort;if(!$s){$b}else{$r=$b%$s;"$b=($s*$(($b-$r)/$s))+$r";&$e $s $r}}

PS D:\> & $e 9894 2628
9894=(2628*3)+2010
2628=(2010*1)+618
2010=(618*3)+156
618=(156*3)+150
156=(150*1)+6
150=(6*25)+0
6

আরও পঠনযোগ্য আকারে এটি নিম্নলিখিতগুলি করে (পরিষ্কার কোডের জন্য এনবি।, আমি পুরো কমান্ডলেটের নাম, স্ট্রিংয়ে আরও স্পেস রেখেছি এবং পাইপলাইন আউটপুট কমান্ডগুলি স্পষ্ট করে দিয়েছি):

function Euclid {
    $small, $big = $args|Sort-Object   #Sort argument list, assign to two vars.

    if (!$small) {                     #Recursion end, emit the last
        Write-Output $big              #number alone, for the last line.

    } else {                           #main recursive code

        $remainder = $big % $small
        Write-Output "$big = ( $small* $(($big-$remainder)/$small)) + $remainder"
        Euclid $small $remainder
    }
}

কোডগল্ফ দৃষ্টিকোণ থেকে একটি বিরক্তি; PoSh এর কোনও পূর্ণসংখ্যা বিভাগ নেই, 10/3 একটি দ্বিগুণ দেয়, তবে ফলাফলটি পূর্ণসংখ্যায় ফেলে দেয় এবং এটি সর্বদা গোল হয় না, এটি N.5 এর কাছাকাছি সমান সংখ্যায় - উপরে বা নীচে গোল করে। তাই [int](99/2) == 50

এটি দুটি বিশ্রী পছন্দ ছেড়ে দেয়:

$remainder = $x % $y
$quotient = [Math]::Floor($x/$y)

# or, worse

$remainder=$null
$quotient = [Math]::DivRem($x, $y, [ref]$remainder)

যে কারণে আমাকে কিছু চরিত্রগুলি পোড়াতে হবে:

$remainder = $big % $small
($big - $remainder)/$small

তা ছাড়া এটির সংখ্যা

এবং টার্নারি অপারেটরের অভাব যা সত্যই ব্যাথা করে।

আমার কাছে একটি পুনরাবৃত্ত সংস্করণ রয়েছে যা খুব সুন্দরভাবে, এছাড়াও 84 টি অক্ষর:

{$r=1;while($r){$s,$b=$args|Sort;$r=$b%$s;"$b=($s*$(($b-$r)/$s))+$r";$args=$s,$r}$s}

সম্পূর্ণ বেনামে কোডব্লক, তাই এটি দিয়ে চালান run

& {*codeblock*} 1599 650

2

পিএইচপি, 118 বাইট

for(list(,$n,$m)=$argv,$g=max($n,$m),$l=min($n,$m);$g;$g=$l,$l=$m)
echo$g,$l?"=($l*".($g/$l^0).")+".($m=$g%$l)."
":"";

এটি অনলাইন চেষ্টা করুন!

পিএইচপি, 131 বাইট

for(list(,$n,$m)=$argv,$r=[max($n,$m),min($n,$m)];$r[+$i];)echo$g=$r[+$i],($l=$r[++$i])?"=($l*".($g/$l^0).")+".($r[]=$g%$l)."
":"";

এটি অনলাইন চেষ্টা করুন!

-4 বাইটগুলি প্রয়োজনের list(,$n,$m)=$argvসাথে প্রতিস্থাপন করুন [,$n,$m]=$argvPHP> = 7.1



2

জাভাস্ক্রিপ্ট (ES6), 74 50 62 61 55 বাইট

f=(x,y)=>y?y>x?y:x+`=(${y}*${x/y|0})+${x%=y}
`+f(y,x):x
  • সবচেয়ে বড় প্রথমটির চেয়ে 12 বাইটকে পূর্বাভাসটিকে কোনও ক্রমে পাস করার অনুমতি দেয়।

এটি চেষ্টা করুন

f=(x,y)=>y?y>x?y:x+`=(${y}*${x/y|0})+${x%=y}
`+f(y,x):x
o.innerText=f(i.value=683712533265363251376,j.value=18237983363879361)
i.oninput=j.oninput=_=>o.innerText=f(+i.value,+j.value)
<input id=i type=number><input id=j type=number><pre id=o>


ব্যাখ্যা

f=          :Assign the function to variable f ...
(x,y)=>     :And take the two integer inputs as arguments via parameters x and y.
y?          :If y is greater than 0 then
y>x?        :    If y is greater than x then
f(y,x)      :        Call f again, with the order of the integers reversed.
            :        (This can only happen the first time the function is called.)
:           :    Else
x           :        Start building the string, beginning with the value of x.
+`=(        :        Append "=(".
${y}        :          The value of y.
*           :          "*"
${x/y|0}    :          The floored value of x divided by y
)+          :          ")+"
${x%=y}     :          The remainder of x divided by y, which is assigned to x
            :          (x%=y is the same as x=x%y.)
\n          :          A newline (a literal newline is used in the solution).
`+f(y,x)    :        Append the value f returns when y and the new value of x
            :        are passed as arguments.
:           :Else
x           :    Return the current value of x,
            :    which will be the greatest common divisor of the original two integers.

1

জেএস, 151

a=prompt("g","");b=prompt("l","");c=0;l=[a,b];for(var i=0;i<=1;i++){t=c;o=c+1;r=c+2;n=l[t]%l[o];if(n!==0){l[r]=n;c=c+1;i=0;}else{p=l[o];alert(p);i=2;}}

1

সি, 83 বাইট

g(x,y,z){y&&(printf("%u=(%u*%u)+%u\n",x,y,x/y,z=x%y),z)?g(y,z,0):printf("%u\n",y);}

পরীক্ষা এবং ফলাফল

int main()
{g(18,27,0);
 g(50,20,0);
 g(447,501,0);
 g(9894,2628,0);
}

18=(27*0)+18
27=(18*1)+9
18=(9*2)+0
9
50=(20*2)+10
20=(10*2)+0
10
447=(501*0)+447
501=(447*1)+54
447=(54*8)+15
54=(15*3)+9
15=(9*1)+6
9=(6*1)+3
6=(3*2)+0
3
9894=(2628*3)+2010
2628=(2010*1)+618
2010=(618*3)+156
618=(156*3)+150
156=(150*1)+6
150=(6*25)+0
6

0

জাভা 133

public void z(int i,int j){for(int d=1;d!=0;i=j,j=d){d=i%j;System.out.println(i+"=("+j+"*"+((i-d)/j)+")+"+d);}System.out.println(i);}

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

public void z(int i, int j)
{
    for(int d=1;d!=0;i=j,j=d)
    {
        d=i%j;
        System.out.println(i+"=("+j+"*"+((i-d)/j)+")+"+d);
    }
    System.out.println(i);
}

আমি জানি এটা 1.5 বছরের পর বছর ধরে হয়েছে, কিন্তু আপনি অপসারণ করতে পারেন public , দ্বিতীয় পরিবর্তন printlnকরতে print, এবং পরিবর্তন d!=0করার d>0। এছাড়াও, এটি বর্তমানে প্রথম সারির জন্য একটি ভুল আউটপুট দিচ্ছে। এটি if(d!=i)সামনে যুক্ত করে ঠিক করা যেতে পারে System.out.println(i+"=("+j+"*"+((i-d)/j)+")+"+d);। সুতরাং মোট: void z(int i,int j){for(int d=1;d>0;i=j,j=d){d=i%j;if(d!=i)System.out.println(i+"=("+j+"*"+((i-d)/j)+")+"+d);}System.out.print(i);}( ১৩১ বাইটস এবং বাগ-ফিক্সড)
কেভিন ক্রুইজসেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.