diff options
| author | Mistivia <i@mistivia.com> | 2025-08-29 14:08:26 +0800 |
|---|---|---|
| committer | Mistivia <i@mistivia.com> | 2025-08-29 14:08:26 +0800 |
| commit | 5089eec1aeca122a540d890d2cbdee2992819321 (patch) | |
| tree | 3a62c9d4f3b369b8571bdeb915bfce65f2a851c9 | |
| parent | 045bca0f6c0e17351372f65b60f635dc37da75d1 (diff) | |
| -rw-r--r-- | .gitignore | 1 | ||||
| -rw-r--r-- | 0016/main.adb | 125 |
2 files changed, 126 insertions, 0 deletions
@@ -2,3 +2,4 @@ *.o main *.ppu +*.ali diff --git a/0016/main.adb b/0016/main.adb new file mode 100644 index 0000000..43a9c0d --- /dev/null +++ b/0016/main.adb @@ -0,0 +1,125 @@ +with ada.text_io; use ada.text_io; +with ada.integer_text_io; use ada.integer_text_io; +with ada.containers.vectors; + +procedure main is + package int_vector is new ada.containers.vectors ( + index_type => natural, + element_type => integer + ); + use int_vector; + + function add(a: vector; b: vector) return vector is + ret: vector; + len: integer; + na, nb: integer; + carry: integer := 0; + begin + len := integer(length(a)); + if integer(length(b)) > len then + len := integer(length(b)); + end if; + for i in 0..len-1 loop + na := 0; + nb := 0; + if i < integer(length(a)) then + na := element(a, i); + end if; + if i < integer(length(b)) then + nb := element(b, i); + end if; + append(ret, (na + nb + carry) mod 10); + carry := (na + nb + carry) / 10; + end loop; + if carry > 0 then + ret.append(1); + end if; + return ret; + end add; + + function mul(a: vector; b: integer) return vector is + ret: vector; + len: integer; + carry: integer := 0; + begin + len := integer(length(a)); + if b = 10 then + append(ret, 0); + for i in 0..len-1 loop + append(ret, a.element(i)); + end loop; + return ret; + end if; + + if b = 0 then + append(ret, 0); + return ret; + end if; + + for i in 0..len-1 loop + append(ret, (a.element(i) * b + carry) mod 10); + carry := (a.element(i) * b + carry) / 10; + end loop; + if carry > 0 then + ret.append(carry); + end if; + return ret; + end mul; + + procedure printnum(a: vector); + + function mul(a: vector; b: vector) return vector is + ret: vector; + t1: vector; + t2: vector; + len: integer; + begin + len := integer(length(b)); + for i in 0..len-1 loop + clear(t1); + clear(t2); + for j in 1..i loop + append(t1, 0); + end loop; + t2 := mul(a, b.element(i)); + for j in 0..integer(length(t2))-1 loop + append(t1, t2.element(j)); + end loop; + ret := add(ret, t1); + end loop; + return ret; + end mul; + + procedure printnum(a: vector) is + begin + for i in reverse 0..integer(length(a))-1 loop + put(a.element(i), 0); + end loop; + new_line; + end printnum; + + function pow2(n: integer) return vector is + t: vector; + begin + if n = 0 then + append(t, 1); + return t; + end if; + if n mod 2 = 1 then + return mul(pow2(n-1), 2); + else + t := pow2(n / 2); + return mul(t, t); + end if; + end pow2; + +v: vector; +res: integer := 0; +begin + v := pow2(1000); + for i in 0..integer(length(v)) - 1 loop + res := res + v.element(i); + end loop; + put(res); +end main; + |
