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 的情况下编写。有人有什么想法吗?
这个答案假设所有数字都是非负的,x非零,并且 0 \xe2\x89\xa4 y< x。
满足条件的最大数(如果存在)是(n-y)/x*x + y。
证明:
\n设为不大于m的最大倍数。然后=对于一些 0 \xe2\x89\xa4 < 。(如果是负数,则大于。如果是或大于 ,则不是最大倍数,而是不大于的倍数。)xn-yn-ym+rrxrmn-yxmm+xxn-y
然后(n-y)/x== (m+r)/x/因为整数除法会m丢弃x余数。所以(n-y)/x*x= m。
由于m是 的倍数x,m % x= 0。那么(m+y) % x= y,所以(n-y)/x*x + y= y。
要查看这是不大于的最大数字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。
注意:关于条件 1 \xe2\x89\xa4 ,如果足够大以允许这样的解决方案,k则自动满足,因为该公式产生最大的\xe2\x89\xa4 n ,其余数模为。如果公式的结果不满足 1 \xe2\x89\xa4 ,则不存在解。nkxykk