因子问题

所属作业: hw4 算法: 循环

描述

任给两个正整数N、M,求一个最小的正整数a,使得a和(M-a)都是N的因子。

输入

包括两个整数N、M。N不超过1,000,000。

输出

输出一个整数a,表示结果。如果某个案例中满足条件的正整数不存在,则在对应行输出-1

样例输入

35 10

样例输出

5

题目分析

因子是什么?假如整数n除以m,结果是无余数的整数,那么我们称m就是n的因子。

a和(M-a)都是N的因子等价于a整除N且M-a整除N。

样例输入2

7 8

样例输出2

1

样例输入3

7 14

样例输出3

7

注意:N的因子包括N

1
2
3
4
5
6
7
8
9
# 错误代码1
N, M = input().split()
N, M = int(N), int(M)
answer = -1
for i in range(1, N + 1):
    if N % i == 0 and N % (M - i) == 0:
        answer = i
        break
print(answer)

样例输入3

7 7

样例输出3

-1

代码1运行结果:

if N % i == 0 and N % (M - i) == 0: ^~~~~~~

ZeroDivisionError: integer modulo by zero

注意:i不能等于M

1
2
3
4
5
6
7
8
9
# 错误代码2
N, M = input().split()
N, M = int(N), int(M)
answer = -1
for i in range(1, M):
    if N % i == 0 and N % (M - i) == 0:
        answer = i
        break
print(answer)

样例输入4

14 7

样例输出4

14

代码2运行结果:

-1

注意:N的因子可以是负数,(M - i)可以是负数。i可以大于M

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# 正确代码
N, M = input().split()
# 将字符串转换为整数
N, M = int(N), int(M)

# 初始化答案为 -1,表示默认没有找到符合条件的 a
answer = -1

# 遍历从 1 到 N 的所有正整数 i
for i in range(1, N + 1):
    # 检查 i 是否是 N 的因子
    # 同时检查 M - i 是否不为 0 并且是 N 的因子
    if N % i == 0 and M - i != 0 and N % (M - i) == 0:
        # 如果条件满足,更新答案为 i
        answer = i
        # 找到第一个符合条件的 a,退出循环
        break

# 输出结果,如果没有找到符合条件的 a,则输出 -1
print(answer)