Smith numbers: Difference between revisions
Content added Content deleted
Not a robot (talk | contribs) (Add Draco) |
Not a robot (talk | contribs) (Add Cowgol) |
||
Line 1,009: | Line 1,009: | ||
stream$putl(po, "\nFound " || int$unparse(count) || " Smith numbers.") |
stream$putl(po, "\nFound " || int$unparse(count) || " Smith numbers.") |
||
end start_up</lang> |
end start_up</lang> |
||
{{out}} |
|||
<pre> 4 22 27 58 85 94 121 166 202 265 274 319 346 355 378 382 |
|||
391 438 454 483 517 526 535 562 576 588 627 634 636 645 648 654 |
|||
663 666 690 706 728 729 762 778 825 852 861 895 913 915 922 958 |
|||
985 1086 1111 1165 1219 1255 1282 1284 1376 1449 1507 1581 1626 1633 1642 1678 |
|||
1736 1755 1776 1795 1822 1842 1858 1872 1881 1894 1903 1908 1921 1935 1952 1962 |
|||
1966 2038 2067 2079 2155 2173 2182 2218 2227 2265 2286 2326 2362 2366 2373 2409 |
|||
2434 2461 2475 2484 2515 2556 2576 2578 2583 2605 2614 2679 2688 2722 2745 2751 |
|||
2785 2839 2888 2902 2911 2934 2944 2958 2964 2965 2970 2974 3046 3091 3138 3168 |
|||
3174 3226 3246 3258 3294 3345 3366 3390 3442 3505 3564 3595 3615 3622 3649 3663 |
|||
3690 3694 3802 3852 3864 3865 3930 3946 3973 4054 4126 4162 4173 4185 4189 4191 |
|||
4198 4209 4279 4306 4369 4414 4428 4464 4472 4557 4592 4594 4702 4743 4765 4788 |
|||
4794 4832 4855 4880 4918 4954 4959 4960 4974 4981 5062 5071 5088 5098 5172 5242 |
|||
5248 5253 5269 5298 5305 5386 5388 5397 5422 5458 5485 5526 5539 5602 5638 5642 |
|||
5674 5772 5818 5854 5874 5915 5926 5935 5936 5946 5998 6036 6054 6084 6096 6115 |
|||
6171 6178 6187 6188 6252 6259 6295 6315 6344 6385 6439 6457 6502 6531 6567 6583 |
|||
6585 6603 6684 6693 6702 6718 6760 6816 6835 6855 6880 6934 6981 7026 7051 7062 |
|||
7068 7078 7089 7119 7136 7186 7195 7227 7249 7287 7339 7402 7438 7447 7465 7503 |
|||
7627 7674 7683 7695 7712 7726 7762 7764 7782 7784 7809 7824 7834 7915 7952 7978 |
|||
8005 8014 8023 8073 8077 8095 8149 8154 8158 8185 8196 8253 8257 8277 8307 8347 |
|||
8372 8412 8421 8466 8518 8545 8568 8628 8653 8680 8736 8754 8766 8790 8792 8851 |
|||
8864 8874 8883 8901 8914 9015 9031 9036 9094 9166 9184 9193 9229 9274 9276 9285 |
|||
9294 9296 9301 9330 9346 9355 9382 9386 9387 9396 9414 9427 9483 9522 9535 9571 |
|||
9598 9633 9634 9639 9648 9657 9684 9708 9717 9735 9742 9760 9778 9840 9843 9849 |
|||
9861 9880 9895 9924 9942 9968 9975 9985 |
|||
Found 376 Smith numbers.</pre> |
|||
=={{header|Cowgol}}== |
|||
<lang cowgol>include "cowgol.coh"; |
|||
typedef N is uint16; # 16-bit math is good enough |
|||
# Print a value right-justified in a field of length N |
|||
sub print_right(n: N, width: uint8) is |
|||
var arr: uint8[16]; |
|||
var buf := &arr[0]; |
|||
var nxt := UIToA(n as uint32, 10, buf); |
|||
var len := (nxt - buf) as uint8; |
|||
while len < width loop |
|||
print_char(' '); |
|||
len := len + 1; |
|||
end loop; |
|||
print(buf); |
|||
end sub; |
|||
# Find the sum of the digits of a number |
|||
sub digit_sum(n: N): (sum: N) is |
|||
sum := 0; |
|||
while n > 0 loop |
|||
sum := sum + n % 10; |
|||
n := n / 10; |
|||
end loop; |
|||
end sub; |
|||
# Factorize a number, write the factors into the buffer, |
|||
# return the amount of factors. |
|||
sub factorize(n: N, buf: [N]): (count: N) is |
|||
count := 0; |
|||
# Take care of the factors of 2 first |
|||
while n>0 and n & 1 == 0 loop |
|||
n := n >> 1; |
|||
count := count + 1; |
|||
[buf] := 2; |
|||
buf := @next buf; |
|||
end loop; |
|||
# Then do the odd factors |
|||
var fac: N := 3; |
|||
while n >= fac loop |
|||
while n % fac == 0 loop |
|||
n := n / fac; |
|||
count := count + 1; |
|||
[buf] := fac; |
|||
buf := @next buf; |
|||
end loop; |
|||
fac := fac + 2; |
|||
end loop; |
|||
end sub; |
|||
# See if a number is a Smith number |
|||
sub smith(n: N): (rslt: uint8) is |
|||
rslt := 0; |
|||
var facs: N[16]; |
|||
var n_facs := factorize(n, &facs[0]) as @indexof facs; |
|||
if n_facs > 1 then |
|||
# Only composite numbers are Smith numbers |
|||
var dsum := digit_sum(n); |
|||
var facsum: N := 0; |
|||
var i: @indexof facs := 0; |
|||
while i < n_facs loop |
|||
facsum := facsum + digit_sum(facs[i]); |
|||
i := i + 1; |
|||
end loop; |
|||
if facsum == dsum then rslt := 1; end if; |
|||
end if; |
|||
end sub; |
|||
# Display all Smith numbers below 10000 |
|||
var i: N := 2; |
|||
var count: N := 0; |
|||
while i < 10000 loop |
|||
if smith(i) != 0 then |
|||
count := count + 1; |
|||
print_right(i, 5); |
|||
if count & 0xF == 0 then print_nl(); end if; |
|||
end if; |
|||
i := i + 1; |
|||
end loop; |
|||
print_nl(); |
|||
print("Found "); |
|||
print_i32(count as uint32); |
|||
print(" Smith numbers.\n");</lang> |
|||
{{out}} |
{{out}} |
||
<pre> 4 22 27 58 85 94 121 166 202 265 274 319 346 355 378 382 |
<pre> 4 22 27 58 85 94 121 166 202 265 274 319 346 355 378 382 |