m=1,n=1001
1989*1001=1990989
其实这个连个程序都不用编,直接输出1和1001,因为这样的话,就能保证最后三位不会重复,如果四位的话就是1和10001
begin
writeln(1,' ',1001);
end.
数学原理:后三位相同,即除以1000后余数相同,列成同余算式就是:
1989m mod 1000 = 1989n mod 1000
化简就是:
989m mod 1000 = 989n mod 1000
令n=m+t (t>0)
则
989m mod 1000 = 989(m+t) mod 1000
989m mod 1000 = 989m mod 1000 + 989t mod 1000
即
989t mod 1000 = 0
t值就是:1000,2000,3000,...,1000k
最小的m,n可以分别取值1,1001
1989m 是1989×m? 还是说1989m,m是其中的一个数?比如m = 2, 1989m 就是19892?
如果是前者,楼上的已给出答案。 如果是后者,程序如下: 其实无论是前、后者,m和n的取值范围都要分析。 以后者为例: m是一位(1,9)的时候,n只能是3位数(不能是1位数,因为m≠n;不能是2位数,因为如果n是2位数,此时1989m的后三位是891~899, 而此时1989n的后三位是910~999)。同理,即便是1989m = 1989×m,m取1位数(1,9)时,1989m = 19890+m,n也不能是1位(因为n≠m),也不能是2位,因为如果n是2位,1989n =198900+n, 1989m后三位890~899,后1989n则是910~999,同理n也不能是3位,n只能从4位开始.
program mn1989;
var
m, n : Integer;
flag : Boolean;
begin
flag := false;
for m := 1 to 9 do
begin
for n := 100 to 999 do // for n := 1000 to 9999 do
begin
if (89*10+m = n) then
//if ((1989*m mod 1000) = (1989*n mod 1000)) then
begin
writeln ('m = ', m);
writeln ('n = ', n);
flag := true;
break;
end;
end;
if (flag) then
break;
end;
end.
运行:
m = 1
n = 891