การหารของตัวเลขไม่น้อย


15

เขียนโปรแกรมหรือฟังก์ชั่นที่ใช้ในจำนวนเต็มบวกa, bและc, และพิมพ์หรือผลตอบแทนa/bเพื่อcตำแหน่งทศนิยมโดยใช้การดำเนินงาน + - * /% [บวกลบคูณหารปรับ] ในจำนวนเต็มบวก: คุณสามารถใช้ทุกสิ่งที่ ภาษาของคุณอนุญาต แต่ไม่สามารถใช้กับเลขทศนิยมได้ ช่วง a, b, c จะเป็นช่วงที่อนุญาตสำหรับจำนวนเต็มที่ไม่ได้ลงนามในภาษาของคุณ ผลลัพธ์หมายเลขจะถูกปัดเศษเป็นหลักสุดท้ายเพื่อพิมพ์ (ไม่ใช่round)

ซึ่งหมายความว่าหากภาษาของคุณไม่มีประเภทจำนวนเต็ม (ลอยเท่านั้น) คุณสามารถเข้าร่วมโดยใช้หมายเลขทศนิยมเหล่านี้เป็นจำนวนเต็มบวกเท่านั้น ปมของการออกกำลังกายนี้มันจะเป็นการเขียนฟังก์ชั่นที่ค้นหาตัวเลขในส่วนจุดลอยโดยใช้เพียงการดำเนินงาน + - * /% ในจำนวนเต็ม [ไม่ได้ลงนาม]

ตัวอย่าง

  • print(1,2,1) จะพิมพ์ 0.5
  • print(1,2,2) จะพิมพ์ 0.50
  • print(13,7,27) จะพิมพ์ 1.857142857142857142857142857
  • print(2,3,1) จะพิมพ์ 0.6
  • print(4,5,7) จะพิมพ์ 0.8000000
  • print(4,5,1) จะพิมพ์ 0.8
  • print(9999,23,1) จะพิมพ์ 434.7
  • print(12345613,2321,89) จะพิมพ์ถ้าภาษาของคุณไม่มีการลงนาม 32 บิต 5319.09220163722533390779836277466609220163722533390779836277466609220163722533390779836277466

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ ฉันขอโทษถ้าสิ่งนี้ไม่ชัดเจน ... ฉันก็ไม่รู้จักภาษาเหมือนกันจำคำศัพท์ไม่ได้ ... มันจะดีกว่าถ้ามีลิงก์หนึ่งเชื่อมโยงไปยัง Ideone.com หรือที่อื่น ๆ เพื่อลองตอบได้อย่างง่ายดายโดยเฉพาะ ทดสอบอินพุตที่แตกต่างจากที่เสนอ


1
ช่วงของจำนวนเต็ม a, b, c คืออะไร?
Ton Hospel

@Ton Hospel ช่วง a, b, c เป็นช่วงที่อนุญาตให้มีจำนวนเต็มที่ไม่ได้ลงนามในภาษาของคุณ: ตัวอย่างเช่นถ้ามันเป็น 32 บิตที่ไม่ได้ลงชื่อก็จะเป็น 0..0xFFFFFFFF แต่ถ้า c> = 0xFFFFFFF ช้าหน่อย ...
RosLuP

2
มันเป็นฟังก์ชั่นการปัดเศษ - หรือแม่นยำยิ่งขึ้นมันจะต้องมีฟังก์ชั่นการปัดเศษเพื่อระบุอย่างถูกต้อง ในปัจจุบันยังไม่ชัดเจนว่าคำตอบที่ถูกต้องคือ(1,2,0)อะไร ดูmeta.codegolf.stackexchange.com/a/5608/194
ปีเตอร์เทย์เลอร์

1
ขออภัยที่เปิดคำถามนี้อีกครั้ง ฉันคิดว่าเกือบพร้อมแล้วที่จะเปิดใหม่ยกเว้นปัญหาที่ Peter Taylor ชี้ให้เห็น ผลลัพธ์สำหรับ(1,2,0)อะไร
ETHproductions

2
ที่จริง(1,2,0)ควรไม่เกี่ยวข้องเนื่องจาก0ไม่ใช่จำนวนเต็มบวก และฉันจะชอบมันถ้าคยังคงเป็นเช่นนั้นเนื่องจากฉันไม่ต้องการคิดที่จะเพิ่ม.หรือไม่
Ton Hospel

คำตอบ:


5

05AB1E , 17 13 11 19 14 ไบต์

b, a, cการป้อนข้อมูลในรูปแบบ
ที่บันทึกไว้ 5 ไบต์ขอบคุณที่สกปรก

‰`¹+I°*¹÷¦'.sJ

ลองออนไลน์!


ฉันเพิ่งลองออนไลน์ด้วยอินพุต 13,7,27 และคำตอบไม่ถูกต้อง
Mathieu J.

@shigazaru: มันกลับเดียวกันผลเช่นการทดสอบตัวกรณี คุณสังเกตเห็นลำดับของอินพุตb,a,cหรือไม่
Emigna

ฉันลองใช้ปุ่ม "ลองออนไลน์" ที่มีส่วนนี้: 12345613/2321 มี 89 หลัก แต่ผลลัพธ์มีบางอย่างที่เป็น 5319.922 ... แทนที่จะเป็น 5319.0922 ...
RosLuP

1
15:‰`I°*¹÷I°+¦'.sJ
Grimmy

2
14:‰`¹+I°*¹÷¦'.sJ
Grimmy

4

Haskell, 87 ไบต์

(a#b)c|s<-show$div(a*10^c)b,l<-length s-c,(h,t)<-splitAt l s=['0'|l<1]++h++['.'|c>0]++t

ตัวอย่างการใช้งาน: ->(13#7)27"1.857142857142857142857142857"

23 ไบต์ที่จะจัดการกับกรณีและการใช้ศูนย์นำแทนสิ่งที่ชอบc==0.5

มันทำงานอย่างไร: คูณaด้วย10^c, หารด้วยb, กลายเป็นสตริง, แยกส่วนที่.ต้องใส่, รวมทั้งสองส่วนเข้าด้วย.กันระหว่างและแก้ไขตัวเรือนขอบ


4

Perl 6 ,  58 57 55  48 ไบต์

{(($^a.FatRat/$^b*10**$^c).Int.FatRat/10**$c).base(10,$c)}
{(Int($^a.FatRat/$^b*10**$^c).FatRat/10**$c).base(10,$c)}
{base Int($^a.FatRat/$^b*10**$^c).FatRat/10**$c: 10,$c}
{base ($^a*10**$^c div$^b).FatRat/10**$c: 10,$c}

สิ่งที่ค่อนข้างน่ารำคาญคือมันสามารถย่อให้เล็กลงได้{($^a.FatRat/$^b).base(10,$^c)}หากอนุญาตให้ปัดเศษเป็นค่าที่ใกล้ที่สุด

คำอธิบาย:

# bare block lambda with 3 placeholder parameters 「$^a」, 「$^b」 and 「$^c」
{
  (
    (

      # create an Int containing all of the digits we care about
      $^a * 10 ** $^c div $^b

    ).FatRat / 10**$c  # turn it into a Rational

  ).base( 10, $c )     # force it to display 「$c」 digits after the decimal point
}

ฉันไม่คุ้นเคยกับ perl6 แต่ไม่(...).FatRat / 10**$xแบ่ง Rational หรือไม่? คุณได้รับอนุญาตให้แบ่งจำนวนเต็มเท่านั้น
nimi

@nimi Rationalเป็นชั้นที่มีสองInts
Brad Gilbert b2gills

ตัวดำเนินการทางคณิตศาสตร์ได้รับอนุญาตสำหรับประเภทจำนวนเต็มเท่านั้นและไม่สามารถใช้ได้กับประเภทตัวเลขอื่น ๆ ข้อความอ้างอิง: "เบาะแสของแบบฝึกหัดนี้ ... เพื่อเขียนฟังก์ชัน ... โดยใช้การดำเนินการ + - * /% กับจำนวนเต็ม [ไม่ได้ลงนาม]"
nimi

@nimi ดังนั้นหากฉันเขียนการปรับใช้ Rational ใหม่และไม่เพิ่มdoes Realหรือdoes Numericจะอนุญาตหรือไม่ จะทำอย่างไรถ้าฉันเพิ่ม (แผ่นแปะลิง) คลาสที่มีอยู่เพื่อลบบทบาทเหล่านั้นจะได้รับอนุญาตหรือไม่
Brad Gilbert b2gills

ไม่ทราบ ฉันอ่านสเป็คตามที่กล่าวไว้ก่อนหน้านี้: +-*/%เฉพาะกับประเภทจำนวนเต็มธรรมดาเท่านั้น "จำนวนเต็มธรรมดา" ในแง่ของการทำงาน (ก่อนอื่น: การหารจำนวนเต็ม) ไม่ใช่การแทนค่าภายใน คุณคิดว่ามันได้รับอนุญาตให้ใช้ไลบรารี่พอยท์ไลเซนส์ของซอฟแวร์ซึ่ง (แม้จะมีชื่อ) ก็ใช้จำนวนเต็มสำหรับการแสดงภายในเท่านั้น
nimi

3

Perl, 55 ไบต์

รวมถึง +3 สำหรับ -p

ให้ a และ b บนหนึ่งบรรทัดบน STDIN และ c ในบรรทัดถัดไป

division.pl
1 26
38
^D

division.pl:

#!/usr/bin/perl -p
eval'$\.=($_/$&|0)."."x!$\;$_=$_%$&.0;'x(/ .*/+<>)}{

$_/$&เป็นที่ถกเถียงบิต ฉันต้องการหารจำนวนเต็มที่นั่นจริง แต่ Perl ไม่มีนั้นโดยไม่ต้องโหลดโมดูลพิเศษ ดังนั้นมันจึงไม่ใช่จำนวนเต็มชั่วคราวซึ่งฉันก็ตัดทอนทันที (โดยใช้|0) ดังนั้นฉันจึงจบลงด้วยจำนวนเต็มที่การแบ่งจำนวนเต็มจะให้ มันอาจจะถูกเขียนใหม่($_-$_%$&)/$&เพื่อไม่ให้มีค่าไม่ใช่จำนวนเต็มชั่วคราว (มันจะยังคงลอยอยู่ภายใน)


คุณสามารถใช้$-เพื่อทำให้มัน int เท่านั้น? (ฉันคิดว่ามีข้อ จำกัด ที่เข้มงวดเกี่ยวกับการผสมผสาน / สูงสุดของมันและฉันแน่ใจว่าคุณจะได้พิจารณาแล้ว แต่ถึงแม้ว่ามันจะคุ้มค่าการตรวจสอบ!)
Dom Hastings

@ DomHastings มันจะยังคงถูกตัดทอนหลังจากทำการแบ่งจุดลอยตัว Perl เพียง แต่ไม่ได้มีการหารจำนวนเต็มโดยไม่มีuse integer
Ton Hospel

อามันเป็นเพียงหน้ากาก$-ที่ดีที่จะรู้ ขอบคุณ!
Dom Hastings

3

JavaScript (ES6), 55 50 ไบต์

f=(a,b,c,d=".")=>~c?(a/b|0)+d+f(a%b*10,b,c-1,""):d

(a/b|0)ดำเนินการแบ่งลอย แต่มันได้ปลดเปลื้องเป็นจำนวนเต็มทันที โปรดแจ้งให้เราทราบหากไม่ได้รับอนุญาต


3

PHP, 187 ไบต์

ทำงานร่วมกับสตริงสำหรับตัวเศษซึ่งสามารถเป็นค่า int มากกว่านั้น PHP_INT_MAX

list(,$n,$d,$c)=$argv;$a=str_split($n);while($a){$n.=array_shift($a);if($n>=$d||$r)$n-=$d*$r[]=$n/$d^0;}if(!$r)$r[]=0;if($c)$r[]=".";while($c--){$n*=10;$n-=$d*$r[]=$n/$d^0;}echo join($r);

ฉันไม่มีโอกาสอื่นแล้ว 13/7 จะลดลงเหลือ 1.8571428571429 และฉันไปถึงดังนั้นจึงไม่ใช่กรณีทดสอบที่มีทศนิยม 27 ตำแหน่ง

วิธีนี้ไม่อนุญาตให้ใช้ 36 ไบต์

<?=bcdiv(($z=$argv)[1],$z[2],$z[3]);

ไม่อนุญาตการแบ่งส่วนลอยตาม OP
Maltysen

@Maltysen ขออภัยฉันทำการย้อนกลับฉันกลัวมากที่จะหาวิธีแก้ปัญหาที่สั้นกว่าซึ่งฉันไม่รู้จักว่าขัดกับ specifation
JörgHülsermann

2

Pyth - 21 19 18 16 14 ไบต์

จะมองไปที่รูปแบบการป้อนข้อมูลที่สามารถบันทึกพวง

j\.c`/*E^TQE]_

Test Suite (PS คนที่ 27 ไม่ออนไลน์ดังนั้นฉันจึงได้ 10 แทน)


@Emigna Nor ไม่จำเป็นต้องมีเนื่องจาก0ไม่ใช่จำนวนเต็มบวก (แม้ว่า op จะเพิ่มตัวอย่างด้วยc=0)
Ton Hospel

@TonHospel: อ่าแน่นอน ฉันกำลังดูตัวอย่าง ฉันสามารถย่นคำตอบของฉันได้แล้ว :)
Emigna

ไม่ทำงานกับตัวเลขที่มี 0 นำหน้าหลังจุดทศนิยมเช่น 2/21 ถึง 10 ทศนิยม
Emigna

2/21 ที่มี 10 หลักพิมพ์เพียง 9 หลักหลังจากจุด
RosLuP

2/21 มี 10 หลักตามที่ Emigna พูดแทน 0.09 ... พิมพ์ 0.9 ...
RosLuP

2

JavaScript (ES6),  64  62 59 ไบต์

บันทึก 2 ไบต์ด้วย ETHproductions

การหารที่รวมอยู่จะส่งผลให้เป็นจำนวนเต็มเสมอ

f=(a,b,n,s)=>~n?f((q=(a-a%b)/b,a%b*10),b,n-1,s?s+q:q+'.'):s

console.log(f(13,7,27))


การข้ามmไปโดยสิ้นเชิงยังคงใช้ได้ไหม f=(a,b,n,s)=>n+1?f((q=(a-a%b)/b,a%b*10),b,n-1,s?s+q:q+'.'):sคือ 60 ไบต์
ETHproductions

@ETHproductions - แน่นอน ขอบคุณ!
Arnauld

2

Java 7, 105 ไบต์

import java.math.*;String c(int...a){return new BigDecimal(a[0]).divide(new BigDecimal(a[1]),a[2],3)+"";}

Ungolfed & รหัสการทดสอบ:

ลองที่นี่

import java.math.*;
class M{
  static String c(int... a){
    return new BigDecimal(a[0]).divide(new BigDecimal(a[1]), a[2], 3)+"";
  }

  public static void main(String[] a){
    System.out.println(c(1, 2, 1));
    System.out.println(c(1, 2, 2));
    System.out.println(c(13, 7, 27));
    System.out.println(c(2, 3, 1));
    System.out.println(c(4, 5, 7));
    System.out.println(c(4, 5, 0));
    System.out.println(c(9999, 23, 0));
    System.out.println(c(12345613, 2321, 89));
  }
}

เอาท์พุท:

0.5
0.50
1.857142857142857142857142857
0.6
0.8000000
0
434
5319.09220163722533390779836277466609220163722533390779836277466609220163722533390779836277466

ผมไม่คิดว่านี่เป็นที่ถูกต้องเพราะมันเป็นหลักลอยจุดส่วนแม้ว่ามันจะเรียกว่าไม่divide /
corvus_192

@ corvus_192 อีกคำตอบที่ถูกลบ Java ที่โพสต์ช้ากว่าฉันมีเหตุผลที่ฉันจะคัดลอกวางที่นี่ (เครดิตสำหรับคำอธิบายนี้ไปที่@SocialPhoenix ): " วิธีการทำงาน: Java BigDecimals ถูกนำมาใช้เป็น BigIntegers นี่เป็นจุดลอยตัวทางเทคนิค แต่วัตถุ BigInteger และ BigDecimal ใช้เฉพาะintชนิดเพื่อเก็บค่าตัวเลข (นั่นไม่เจ๋งหรือไม่ BigInteger เป็นint[]ตัวเลขหลักเช่น {1,2,5} ในฐาน 10 คือ 125 ฉัน ไม่แน่ใจว่ามีฐานหลักของ BigInteger อยู่จริง แต่ฉันเดาว่ามันมากกว่า 10 "
Kevin Cruijssen

2

Ruby, 67 ไบต์

->(a,b,c){('0'+(a*10**c/b).to_s).gsub(/^0*(.+)(.{#{c}})$/,'\1.\2')}

ถ้าฉันทำให้มันเป็นฟังก์ชั่นในการดำเนินการกรณีทดสอบด้านบน

def print(a,b,c); ('0'+(a*10**c/b).to_s).gsub(/^0*(.+)(.{#{c}})$/, '\1.\2'); end
 => :print 
print(1,2,1)   # would print 0.5
 => "0.5" 
print(1,2,2)   # would print 0.50
 => "0.50" 
print(13,7,27) # would print 1.857142857142857142857142857
 => "1.857142857142857142857142857" 
print(2,3,1)   # would print 0.6
 => "0.6" 
print(4,5,7)   # would print 0.8000000
 => "0.8000000" 
print(4,5,1)   # would print 0.8
 => "0.8" 
print(9999,23,1) # would print 434.7
 => "434.7" 
print(12345613,2321,89) # would print if your Language has 32 bit unsigned 5319.09220163722533390779836277466609220163722533390779836277466609220163722533390779836277466
 => "5319.09220163722533390779836277466609220163722533390779836277466609220163722533390779836277466" 
"('0'+(a*10**c/b).to_s).gsub(/^0*(.+)(.{#{c}})$/, '\1.\2')".length
 => 52 

ยินดีต้อนรับสู่โค้ดกอล์ฟ! สำหรับภาษาส่วนใหญ่เมื่อคุณกำหนดฟังก์ชั่นคุณจะต้องกำหนดทุกอย่างและคุณไม่สามารถเชื่อได้ว่ามีตัวแปรที่กำหนดไว้ล่วงหน้าเช่นนั้น ใน Ruby วิธีที่สั้นที่สุดในการกำหนดแลมบ์ดาคือการ->a,b,c{...}ที่คุณแทนที่เครื่องหมายจุดด้วยรหัสของคุณ (การกำหนดตัวแปรที่แท้จริงนั้นไม่จำเป็นโดยฉันทามติ)
Value Ink

ขอบคุณฉันอยู่ภายใต้ความรู้สึกผิดที่คนอื่นทิ้งส่วนนั้น ... แต่คุณพูดถูก ฉันเพิ่งเพิ่มมัน
Mathieu J.

2

แร็กเก็ต 203 ไบต์

(let*((s(~r(/ a b)#:precision c))(sl(string-split s "."))(s2(list-ref sl 1))(n(string-length s2)))
(if(< n c)(begin(for((i(- c n)))(set! s2(string-append s2 "0")))(string-append(list-ref sl 0)"."s2))s))

Ungolfed:

(define (f a b c)
  (let* ((s (~r(/ a b)#:precision c))
         (sl (string-split s "."))
         (s2 (list-ref sl 1))
         (n (string-length s2)))
    (if (< n c)
        (begin 
          (for ((i (- c n)))
            (set! s2 (string-append s2 "0")))
          (string-append (list-ref sl 0) "." s2))
        s )))

การใช้งาน:

(f 7 5 3)
(f 1 2 1) 
(f 1 2 2) 
(f 13 7 27)

เอาท์พุท:

"1.400"
"0.5"
"0.50"
"1.857142857142857142857142857"

วิธีอื่น ๆ (ไม่ใช่คำตอบที่ถูกต้องที่นี่):

(real->decimal-string(/ a b)c)

ฉันเกรงว่าสิ่งนี้จะไม่ถูกต้องเพราะreal->decimal-stringคาดว่าrealค่าเป็นอาร์กิวเมนต์แรกดังนั้นจึง/เป็นการหารจุดลอยตัวซึ่งไม่ได้รับอนุญาตในงานนี้ นอกจากนี้: real->decimal-stringปัดเศษ ( (f 1 6 7)-> 0.1666667) แทนที่จะตัดทอน
nimi

ขอบคุณสำหรับข้อสังเกต ฉันจะแก้ไขรหัสในไม่ช้า
rnso


1

สนิม 114 ไบต์

fn print(mut a:u32,b:u32,c:u32){let mut p=||{print!("{}",a/b);a=a%b*10};p();if c>0{print!(".")}for _ in 0..c{p()}}

รหัสทดสอบ:

fn main() {
    print(1, 2, 1);    println!(""); // should print 0.5
    print(1, 2, 2);    println!(""); // should print 0.50
    print(13, 7, 27);  println!(""); // should print 1.857142857142857142857142857
    print(2, 3, 1);    println!(""); // should print 0.6
    print(4, 5, 7);    println!(""); // should print 0.8000000
    print(4, 5, 0);    println!(""); // should print 0
    print(9999, 23, 0);println!(""); // should print 434
    print(12345613,2321,89); println!("\n");  // 5319.09220163722533390779836277466609220163722533390779836277466609220163722533390779836277466
}

1

PHP, 89 ไบต์

list(,$a,$b,$c)=$argv;for($o=intdiv($a,$b).'.';$c--;)$o.=intdiv($a=10*($a%$b),$b);echo$o;

intdiv () ถูกนำมาใช้ใน PHP 7 ดังนั้นจึงจำเป็นต้องใช้ php 7.1 จะอนุญาตให้ฉันเปลี่ยนรายการ () เป็น [] และจะช่วยประหยัด 4 ไบต์

ใช้เช่น:

php -r "list(,$a,$b,$c)=$argv;for($o=intdiv($a,$b).'.';$c--;)$o.=intdiv($a=10*($a%$b),$b);echo$o;" 1 2 1

แทนที่$o.=intdiv($a=10*($a%$b),$b);ด้วย$o.=($a=10*($a%$b))/$b^0;จะประหยัด 4 ไบต์
JörgHülsermann

เริ่มแรกฉันจะทำตามคำแนะนำนั้น (ฉันแก้ไขคำตอบและทุกอย่าง) แต่ในวินาทีที่คิดว่ามันคือการหารจุดลอยตัวและจากนั้นก็ส่งไปยัง int เพื่อเพิ่มความยาว <10% ฉันควรติดอยู่ในรายละเอียด คำถาม.
user59178

1

C #, 126 ไบต์

(a,b,c)=>{var v=a*BigInteger.Parse("1"+new string('0',c))/b+"";return v.PadLeft(c+1,'0').Insert(Math.Max(1,v.Length-c),".");};

โปรแกรมเต็มรูปแบบพร้อมกรณีทดสอบ:

using System;
using System.Numerics;

namespace DivisionOfNotSoLittleNumbers
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<BigInteger,BigInteger,int,string>f= (a,b,c)=>{var v=a*BigInteger.Parse("1"+new string('0',c))/b+"";return v.PadLeft(c+1,'0').Insert(Math.Max(1,v.Length-c),".");};

            //test cases:
            Console.WriteLine(f(1,2,1));    //0.5
            Console.WriteLine(f(1,2,2));    //0.50
            Console.WriteLine(f(13,7,27));  //1.857142857142857142857142857
            Console.WriteLine(f(2,3,1));    //0.6
            Console.WriteLine(f(4,5,7));    //0.8000000
            Console.WriteLine(f(4,5,1));    //0.8
            Console.WriteLine(f(9999,23,1));    //434.7
            Console.WriteLine(f(12345613,2321,89)); //5319.09220163722533390779836277466609220163722533390779836277466609220163722533390779836277466
            Console.WriteLine(f(2,3,1));    //0.6
            Console.WriteLine(f(4,5,2));    //0.80
        }
    }
}

มีการแบ่งส่วนจำนวนเต็ม สามารถใช้ตัวเลขได้ทุกขนาดเนื่องจากBigIntegerชนิดข้อมูล ( System.Numericsจำเป็นต้องนำเข้า) พารามิเตอร์การนับตัวเลขcถูก จำกัด ไว้ที่ 2 ^ 31-1 อย่างไรก็ตามควรมีตัวเลขมากกว่าจำนวนที่เพียงพอ


1

Groovy ( 78 77 42 ไบต์)

{a,b,n->Eval.me(a+'.0g').divide(b, n, 1)}​

คำอธิบาย

Eval.me(a+'.0g');- แปลงจากอินพุตจำนวนเต็มเป็นอินพุต BigDecimal ในรูปแบบ Groovy BigDecimal เป็นสัญกรณ์คู่กับ G หรือ g ที่ต่อท้าย ฉันสามารถใช้นวกรรมิกได้เช่นกันnew BigDecimal(it)แต่นี่ช่วยบันทึกไบต์
.divide(b, n, 1)- หารด้วย b ด้วยความแม่นยำ n โหมดการปัดครึ่งครึ่ง

ลองที่นี่: https://groovyconsole.appspot.com/script/5177545091710976


แต่ BigDecimal สนับสนุนการดำเนินการจุดลอยตัวซึ่งถ้าฉันเข้าใจผิดฉันเชื่อว่าถูกระบุว่าเป็นสิ่งต้องห้ามสำหรับการออกกำลังกายนี้
Mathieu J.


1

Mathematica ขนาด 50 ไบต์

StringInsert[ToString@Floor[10^# #2/#3],".",-#-1]&

ฟังก์ชั่นที่ไม่มีชื่อในสามของการขัดแย้ง (ซึ่งมีการสั่งซื้อc, a, bบันทึกที่ไหนสักแห่งไบต์) ซึ่งจะส่งกลับสตริง มันคูณa/bด้วย10^cใช้ฟังก์ชั่นจำนวนเต็มที่ยิ่งใหญ่ที่สุดจากนั้นแปลงเป็นสตริงและแทรกจุดทศนิยมที่จุดที่เหมาะสม น่าเสียดายที่ชื่อฟังก์ชั่นไม่สั้น


1

Python 3, 62 ไบต์

a,b,c=map(int,input().split());print("{:.{1}f}".format(a/b,c))

ลองที่นี่

* หมายเหตุ : repl.itใช้ ver เวอร์ชั่นเก่าของPython 3ซึ่งต้องการให้ระบุดัชนีฟิลด์ทั้งหมดความหมาย"{:.{1}f}"จะถูก"{0:.{1}f}"ใช้แทนทำให้63 ไบต์ในrepl.it

วิธีใช้

ป้อนค่าทั้งสามพร้อมช่องว่างระหว่างทาง ie การป้อนข้อมูลของ1 2 1จะให้ผลลัพธ์ของ0.5

คำอธิบาย

input().split(): รับอินพุตของผู้ใช้และแยกออกเป็นรายการที่มีตัวคั่น (ช่องว่าง)

a,b,c = map(int,XX): แผนที่ตัวแปรเป็นค่าที่ระบุโดยผู้ใช้ที่มีประเภท int

"{:.{1}f}".format(a/b,c): จัดรูปแบบสตริงเพื่อแสดงผลลัพธ์การหารและการแทนที่{1}ด้วยcเพื่อตั้งค่าทศนิยมของสตริงที่แสดง

print(XX): พิมพ์สตริงที่จัดมาให้


1

Python 3 , 58 ไบต์

lambda a,b,c:(lambda s:s[:-c]+"."+s[-c:])(str(a*10**c//b))

ลองออนไลน์!

นี่เป็นจำนวนทศนิยมที่ระบุอย่างแม่นยำตราบใดที่a * 10 ** cไม่ใหญ่เกินไป

ฉันลอง Python 2 เพื่อย่อให้สั้นลง str(...)ไป`...`แต่งูหลาม 2 แทรกLที่สิ้นสุดถ้ามันมีขนาดใหญ่เกินไปดังนั้นการตรวจสอบสำหรับการที่จะใช้วิธีการอื่น ๆ อีกมากมายกว่าไบต์มันคุ้มค่า


1

สแตกซ์ , 13ไบต์

ä·oαì█↕▬AS¥é▼

เรียกใช้และแก้ไขข้อบกพร่อง

อาร์กิวเมนต์ได้รับการยอมรับc a bตามลำดับ


ปัญหาจะเป็นกรณี "พิมพ์ (9999,23,1)" ผลการพิมพ์ในโพสต์คือ "434.7" ในขณะที่ผลลัพธ์ของคุณดูเหมือนว่า "4.7" กรณีเดียวกันกับที่ผ่านมา: 5319.092201etc แทน 9.092201etc
RosLuP

ฉันไม่เห็นด้วย ... ฉันติดตามเมื่อเช้านี้ลิงก์ของคุณและผลลัพธ์สำหรับกรณี "print (9999,23,1)" ในลำดับการทำงานของคุณคือ 4.7 และไม่ใช่ 434.7
RosLuP

@RosLuP: ฉันเปลี่ยนวิธีการ ผลลัพธ์ตอนนี้ถูกต้องคือ '434.7' ฉันยังลดขนาดไบต์ในกระบวนการ
เรียกซ้ำ

0

C, 67 ไบต์

h(a,b,i){int j=!i;for(;printf(j++?"%u":"%u.",a/b),i--;a=10*(a%b));}

ลองออนไลน์!

ฉันคิดว่ารุ่นก่อนหน้านี้มีข้อผิดพลาดในการอ่านหน่วยความจำที่ไม่ได้รับมอบหมายให้กับโปรแกรม ... ขอบคุณสำหรับแมวเพดานและสำหรับทั้งหมด ...


@ceilingcat ตกลงขอบคุณ
RosLuP

ฉันชอบอันสุดท้าย 69 ไบต์
RosLuP


@ceilingcat ตกลงขอบคุณ
RosLuP
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.