20XX年,pascal语言有多了一种新的整型int128。它能够运算10000位的超大数据。今天我们的任务就 是:输入一个类型为int128的数字n(0<=n<=10^10001),判断它是否为3的倍数。
时间: 2024-04-04 21:32:58 浏览: 16
好的,对于这个问题,我可以给出以下解法:
1. 读入int128类型的数字
由于int128类型的数字太大,不能直接使用内置的整型数据类型,需要使用字符串来存储和操作。具体实现可以参考以下代码:
```
type
int128 = record
s: array[1..10000] of longint; // 数字的每一位
len: longint; // 数字的位数
end;
var
n: int128;
procedure read_int128(var a: int128);
var
s: string;
i, j, k: longint;
begin
readln(s);
a.len := length(s);
k := 0;
for i := a.len downto 1 do begin
inc(k);
a.s[k] := ord(s[i]) - ord('0');
end;
while (k > 1) and (a.s[k] = 0) do dec(k);
a.len := k;
end;
```
2. 判断是否为3的倍数
判断一个数是否为3的倍数有一个简单的规律:将这个数的每一位数字相加,若和能被3整除,则这个数也能被3整除。
具体实现可以参考以下代码:
```
function is_multiple_of_three(a: int128): boolean;
var
i, sum: longint;
begin
sum := 0;
for i := 1 to a.len do begin
sum := sum + a.s[i];
end;
is_multiple_of_three := (sum mod 3 = 0);
end;
```
完整代码如下:
```
type
int128 = record
s: array[1..10000] of longint; // 数字的每一位
len: longint; // 数字的位数
end;
var
n: int128;
procedure read_int128(var a: int128);
var
s: string;
i, j, k: longint;
begin
readln(s);
a.len := length(s);
k := 0;
for i := a.len downto 1 do begin
inc(k);
a.s[k] := ord(s[i]) - ord('0');
end;
while (k > 1) and (a.s[k] = 0) do dec(k);
a.len := k;
end;
function is_multiple_of_three(a: int128): boolean;
var
i, sum: longint;
begin
sum := 0;
for i := 1 to a.len do begin
sum := sum + a.s[i];
end;
is_multiple_of_three := (sum mod 3 = 0);
end;
begin
read_int128(n);
if is_multiple_of_three(n) then begin
writeln('Yes');
end else begin
writeln('No');
end;
end.
```
需要注意的是,由于int128类型的数字太大,需要使用高精度计算,因此代码的运行效率较低。