Giảm số chia


21

Một ước của số n là bất kỳ số nào chia đều cho n , bao gồm cả 1 và n . Số lượng ước số d (n) là có bao nhiêu số chia. Đây là d (n) cho cặp đôi đầu tiên n:

n    divisors    d(n)
1    1           1
2    1, 2        2
3    1, 3        2
4    1, 2, 4     3
5    1, 5        2
6    1, 2, 3, 6  4

Chúng ta có thể trừ đi số lần chia của một số. Ví dụ:

16                  = 16
16 - d(16) = 16 - 5 = 11
11 - d(11) = 11 - 2 = 9
 9 - d( 9) =  9 - 3 = 6
 6 - d( 6) =  6 - 4 = 2
 2 - d( 2) =  2 - 2 = 0

Trong trường hợp này, phải mất 5 bước để về 0.


Viết chương trình hoặc hàm cho số không âm n trả về số bước cần thực hiện để giảm xuống 0 bằng cách trừ đi lặp lại số lần chia.

Ví dụ:

0, 0
1, 1
6, 2
16, 5
100, 19
100000, 7534

5
Liên kết OEIS bắt buộc: A155043
Sp3000

Câu trả lời:



6

Python, 49 byte

f=lambda n:n and-~f(sum(n%~x<0for x in range(n)))

orlp đã giúp tiết kiệm một byte! Và Sp3000 đã lưu thêm hai. Cảm ơn!


1
Có thể rút ngắn mọi thứ bằng cách di chuyển -~vào n%-~kvà loại bỏ giới hạn dưới của phạm vi.
orlp

5

C, 52 byte

g,o;l(f){for(g=o=f;o;f%o--||--g);return f?1+l(g):0;}

4

Bình thường, 10 byte

tl.ulf%NTS

Bộ thử nghiệm.

Giải trình

tl.ulf%NTS
tl.ulf%NTSNQ  implicit variables at the end
           Q  obtain the input number
  .u      N   repeat the following until result no longer unique:
         S        generate range from 1 to N
     f            filter for:
      %NT             T in that range, which N%T is truthy (not zero)
    l             length of that list
                  that means, we found the number of "non-divisors" of N
tl            number of iterations, minus 1.

3

Julia, 31 byte

f(n)=n<1?0:f(sum(n%(1:n).>0))+1

Đơn giản thực hiện đệ quy.


2

MATL , 14 byte

`t~?x@q.]t:\zT

Hãy thử trực tuyến!

Giải trình

`            T  % Infinite loop
 t~?    ]       % Duplicate number. Is it non-zero?
    x@q.        % If so: delete number, push iteration index minus 1, break loop
         t:\    % Duplicate, range, modulo (remainder). Divisors give a 0 remainder
            z   % Number of non-zero elements; that is, of non-divisors

2

JavaScript (ES6), 64 51 byte

f=n=>n&&[...Array(m=n)].map((_,i)=>m-=n%++i<1)|f(m)+1

Đừng hỏi tôi tại sao tôi không cần thiết sử dụng đệ quy đuôi.


2

Java, 147 93

a->{int k,i,n=new Integer(a),l=0;for(;n!=0;n-=k)for(l+=k=i=1;i<n;)if(n%i++==0)++k;return l;}

3
Tại sao n=new Integer(100000)thay vì n=100000?
dùng8397947

1

05AB1E, 12 10 byte

Mã số:

[Ð>#Ñg-¼]¾

Giải trình:

[           # start infinite loop
 Ð          # triplicate current number
  >#        # increase by 1 and break if true
    Ñg      # get number of divisors
      -     # subtract number of divisors from number
       ¼    # increase counter
        ]   # end loop
         ¾  # print counter

Dùng thử trực tuyến

Chỉnh sửa: Đã lưu 2 byte và một lỗi với đầu vào 0 được sửa nhờ @Adnan


Rất đẹp! Tôi đã cố gắng đánh gôn một chút và nhận được xuống còn 10 byte : [Ð>#Ñg-¼]¾. Phải có một cách để làm cho nó ngắn hơn mặc dù ...
Adnan

@LuisMendo Vâng, đó là vì D0Q#phần này nằm sau phần tăng của bộ đếm. Các [Ð>#Ñg-¼]¾mã nên làm việc 0mặc dù :).
Ad Nam

@Adnan: Tôi đã thử một phiên bản dựa trên việc tạo ra tất cả số đếm lên đến n và đi từ chỉ số này sang giá trị khác tại chỉ mục và đếm lên, nhưng không quản lý để rút ngắn nó theo cách đó.
Emigna


1

Mathcad, [tbd] byte

nhập mô tả hình ảnh ở đây


Sơ đồ tương đương byte Mathcad vẫn chưa được xác định. Sử dụng tương đương tổ hợp phím thô, chương trình sử dụng khoảng 39 "byte". Lưu ý rằng các toán tử while và cho lập trình chỉ thực hiện một thao tác bàn phím cho mỗi thao tác nhập (ctl-] và ctl-shft- #, tương ứng) - thực sự, chúng chỉ có thể được nhập theo cách này từ bàn phím.

Những gì bạn thấy là chính xác những gì được đưa vào bảng tính Mathcad. Mathcad đánh giá các phương trình / chương trình và đặt đầu ra trên cùng một trang (ví dụ: sau toán tử đánh giá '=' hoặc trên biểu đồ).


1

MATL, 13 byte

tX`t:\ztt]Nq&

Dùng thử trực tuyến

Giải trình:

t               % Duplicate input
 X`      ]      % while loop, consumes 1 input
   t:\z         % calculates n-d(n), by counting number non-divisors
       tt       % dupe twice, for while loop condition, next iteration and to keep in stack
          Nq&   % get stack size, decrement, display that value

1

Toán học, 35 byte

If[#<1,0,#0[#-0~DivisorSigma~#]+1]&

Tận dụng tốt cũ DivisorSigma. @ MartinBüttner lưu ý các lựa chọn thay thế sau:

If[#<1,0,#0[#-DivisorSum[#,1&]]+1]&
f@0=0;f@n_:=f[n-DivisorSum[n,1&]]+1

1

Hoon , 93 76 byte

|=
r/@
?~
r
0
+($(r (sub r (lent (skim (gulf 1^r) |=(@ =(0 (mod r +<))))))))

Ung dung:

|=  r/@
?~  r
  0
=+  (skim (gulf 1^r) |=(@ =(0 (mod r +<))))
+($(r (sub r (lent -))))

Trả về một hàm mất một nguyên tử , r. Tạo một giá trị trung gian có chứa tất cả các độ lệch của r(Tạo danh sách [1..n], chỉ giữ lại các phần tử trong đó (mod ri) ​​== 0). Nếu rbằng 0 trả về 0, khác trả về giá trị tăng dần của đệ quy với r bằng r- (ước số độ dài).

Mã as-is mất một lượng thời gian ngu ngốc để đánh giá n = 100.000, hoàn toàn bởi vì việc tìm ra các độ lệch cho số lớn tạo ra một danh sách khổng lồ và ánh xạ lên nó. Ghi nhớ các ước số có đầu ra chính xác cho n = 10.000, nhưng tôi không buồn đợi khoảng 100.000


1

Haskell, 43 40 39 byte

g 0=0;g n=1+g(sum$min 1.mod n<$>[1..n])

Phương pháp đệ quy đơn giản. Ví dụ sử dụng: g 16-> 5.

Chỉnh sửa: @Lynn lưu 3 4 byte. Cảm ơn!


Thế còn g(sum$signum.mod n<$>[1..n])?
Lynn

Ồ, và min 1thực sự ngắn hơn một byte so với signum, thậm chí
Lynn

1

PowerShell v2 +, 74 67 byte

param($n)for($o=0;$n-gt0){$a=0;1..$n|%{$a+=!($n%$_)};$n-=$a;$o++}$o

Có vẻ khá dài so với một số câu trả lời khác ...

Đưa đầu vào $n, vào một forvòng lặp với điều kiện $nlớn hơn 0. Mỗi vòng lặp chúng ta đặt trình trợ giúp $a, sau đó lặp qua mọi số từ 1tối đa $n. Mỗi vòng lặp bên trong, chúng tôi kiểm tra từng số để xem đó có phải là số chia hay không và nếu có thì chúng tôi sẽ tăng trợ giúp của mình $a(sử dụng phủ định Boolean và ẩn cast-to-int). Sau đó, chúng tôi trừ đi bao nhiêu ước số mà chúng tôi đã tìm thấy $n-=$avà tăng số lượt truy cập của chúng tôi $o++. Cuối cùng, chúng tôi đầu ra $o.

Phải mất một thời gian dài để thực hiện, vì đó là một cấu trúc vòng lặp quan trọng. Ví dụ: chạy n = 10,000trên máy của tôi (1yr cũ Core i5) mất gần 3 phút.


1

Vợt - 126 byte Xuống tới 98 byte 91 byte

Một giải pháp cực kỳ ngây thơ - có lẽ có thể bị cắt giảm rất nhiều với một thuật toán hợp lý và một số thủ thuật không thể thiếu mà tôi không biết

(define(g x[c 0][d 0][i 2])(cond[(= x 0)c][(= i x)(g d(+ 1 c))][(=(modulo x i)0)(g x c d(+ 1 i))][else(g x c(+ 1 d)(+ 1 i))]))

Chỉnh sửa: giải thích theo yêu cầu. Như tôi đã nói, đây là một giải pháp đệ quy cực kỳ ngây thơ và có thể ngắn hơn nhiều.

(define (g x [c 0] [d 0] [i 2]) ;g is the name of the function - arguments are x (input), c (counter for steps), d (non-divisor counter), i (iterator)
  (cond
    [(= x 0) c] ;once x gets to 0 c is outputted
    [(= i x) (g d (+ 1 c))] ;if iterator reaches x then we recurse with d as input and add 1 to c
    [(= (modulo x i) 0) (g x c d (+ 1 i))] ;checks if iterator is non divisor, then adds it to d and increments iterator
    [else(g x c (+ 1 d) (+ 1 i))])) ;otherwise just increments iterator

Chỉnh sửa phiên bản 2: 98 byte với thuật toán ít câm hơn (mặc dù vẫn khá ngu ngốc và có thể ngắn hơn)

(define(g x)(if(< x 1)0(+ 1(g(length(filter(λ(y)(>(modulo x y)0))(cdr(build-list x values))))))))

Giải trình:

(define (g x) ;function name g, input x
  (if (< x 1)
      0 ;returns 0 if x < 1 (base case)
      (+ 1 ;simple recursion - adds 1 to output for each time we're looping
         (g (length ;the input we're passing is the length of... 
              (filter (λ (y) (> (modulo x y) 0)) ;the list where all numbers which are 0 modulo x are 0 are filtered out from...
                             (cdr (build-list x values)))))))) ;the list of all integers up to x, not including 0

Chỉnh sửa 3: Đã lưu 7 byte bằng cách thay thế (cdr(build-list x values))bằng(build-list x add1)

(define(g x)(if(< x 1)0(+ 1(g(length(filter(λ(y)(>(modulo x y)0))(build-list x add1)))))))

Xin chào, và chào mừng đến với PPCG! Bài đăng tuyệt vời! Bạn có thể giải thích giải pháp của bạn xin vui lòng? (PS Tôi yêu Lisp!)
NoOneIsHãy

@NoOneIsHere Đã chỉnh sửa trong
kronicmage

0

> <> , 52 + 2 = 54 byte

Số đầu vào cần phải có mặt trên ngăn xếp khi bắt đầu chương trình, vì vậy có +2 byte cho -vcờ. Hãy thử trực tuyến!

:0)?v~ln;>~$-]
03[}\::
@@:$<    v?=0:-1}+{~$?@@01%@:

4 byte gây phiền nhiễu lãng phí cho các vấn đề liên kết. Bah

Cái này hoạt động bằng cách xây dựng chuỗi từ nđến0 trên ngăn xếp. Khi đã đạt đến 0, hãy bật nó và đưa ra chiều dài của ngăn xếp còn lại.

Nhân tiện, nó chạy O(n^2)đúng lúc, nên tôi sẽ không thử n = 100000...


-vlà một byte, không phải hai.
NoOneIsHere

0

> <> , 36 + 3 = 39 byte

:?v~ln; >~&
:}\0&
+&>1-:?!^:{:}$%0)&

Việc thực hiện tương đối đơn giản, với mỗi lần lặp sum(n%k>0 for k in range(1,n-1)). +3 byte cho -vcờ, mỗi meta .

Hãy thử trực tuyến!


0

Ruby, 42 byte

f=->n{n<1?0:1+f[n-(1..n).count{|i|n%i<1}]}

Có lỗi tràn ngăn xếp trong trường hợp thử nghiệm lớn nhất 100000, vì vậy đây là phiên bản lặp trong phạm vi 49 byte . Mất một lúc, mặc dù, xem xét sự O(N^2)phức tạp.

->n{c=0;c+=1 while 0<n-=(1..n).count{|i|n%i<1};c}

0

Perl 5, 40 byte

sub f{@_?(1,f((1)x grep@_%$_,1..@_)):()}

Đầu vào và đầu ra là danh sách số lượng bản sao cần thiết của 1.


0

C #, 63 byte

int F(int n)=>n<1?0:F(Enumerable.Range(1,n).Count(i=>n%i>0))+1;

0

Trên thực tế, 17 byte

";╗R`╜%`░l;"£╬klD

Hãy thử trực tuyến! (lưu ý: trường hợp thử nghiệm cuối cùng hết thời gian trên TIO)

Giải trình:

";╗R`╜%`░l;"£╬klD
"          "£╬     while top of stack is truthy, call the function:
 ;╗                  push a copy of n to reg0
   R                 range(1,n+1) ([1,n])
    `  `░l             push the number of values where the following is truthy:
     ╜%                  k mod n
                       (this computes the number of non-divisors of n)
          ;            make a copy
              klD  push entire stack as list, count number of items, subtract 1
                   (the result is the number of times the function was called)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.