aboutsummaryrefslogtreecommitdiff
path: root/0016
diff options
context:
space:
mode:
authorMistivia <i@mistivia.com>2025-08-29 14:08:26 +0800
committerMistivia <i@mistivia.com>2025-08-29 14:08:26 +0800
commit5089eec1aeca122a540d890d2cbdee2992819321 (patch)
tree3a62c9d4f3b369b8571bdeb915bfce65f2a851c9 /0016
parent045bca0f6c0e17351372f65b60f635dc37da75d1 (diff)
solve 16HEADmaster
Diffstat (limited to '0016')
-rw-r--r--0016/main.adb125
1 files changed, 125 insertions, 0 deletions
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;
+