如何在没有循环的情况下解决这个问题?

Fat*_*eme 0 c loops if-statement division

我们有 3 个数字 y、x 和 n。我们被要求在 1 <= k <= n 且 k % x = y 的情况下找到最大的 k。例如:输入:1 2 100 输出:99

我可以写的是:

#include <stdio.h>
int main()
{
   int y, x, n, max = 1;
   scanf("%d %d %d", &y, &x, &n);
   for (int k = 1; k <= n; k++)
   {
        if ((k % x == y) && (k >= max))
        max = k;
   }
   printf("%d", max);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

它完全正常工作。但问题是程序应该在不使用任何循环或 if 的情况下编写。有人有什么想法吗?

Eri*_*hil 5

这个答案假设所有数字都是非负的,x非零,并且 0 \xe2\x89\xa4 y< x

\n

满足条件的最大数(如果存在)是(n-y)/x*x + y

\n

证明:

\n

设为不大于m的最大倍数。然后=对于一些 0 \xe2\x89\xa4 < 。(如果是负数,则大于。如果是或大于 ,则不是最大倍数,而是不大于的倍数。)xn-yn-ym+rrxrmn-yxmm+xxn-y

\n

然后(n-y)/x== (m+r)/x/因为整数除法会m丢弃x余数。所以(n-y)/x*x= m

\n

由于m是 的倍数xm % x= 0。那么(m+y) % x= y,所以(n-y)/x*x + y= y

\n

要查看这是不大于的最大数字n,请观察下一个较大的数字,余数为y= (n-y)/x*x + y + x= m + y + x= m + y + r + (x-r)= (n-y) + y + (x-r)n + (x-r)我们知道x-r是正数,因此它大于n

\n

注意:关于条件 1 \xe2\x89\xa4 ,如果足够大以允许这样的解决方案,k则自动满足,因为该公式产生最大的\xe2\x89\xa4 n ,其余数模为。如果公式的结果不满足 1 \xe2\x89\xa4 ,则不存在解。nkxykk

\n