题目大意:中文
注释代码:
/*
* Problem ID : NPOJ 1069 小学生作业
* Author : Lirx.t.Una
* Language : C
* Run Time : 1
* Run Memory : 1092
*/
#include <stdio.h>
int
judge( int a, int b ) {//判断a和b求z
//设k为一正整数,使得(a + z) / (b + z) = k
//当k > 1时有z = (a - kb) / (k - 1),这是一个关于k的单调函数
//要是z最大必须得k最小,因此可以从2到a / b枚举k,第一个满足
//整除的k即为所求,如果一个k都没有表示不存在这样的z
int bound;//k的界限
int k;
if ( a < b ) return -1;//当a < b时必定无法整除
if ( !( a % b ) ) return 0;//可以直接整除的情况
//!!!注意:里面包括了k = 1的情况
bound = a / b + 1;//从小到大枚举k
for ( k = 2; k < bound; k++ )
if ( !( ( a - k * b ) % ( k - 1 ) ) )
return ( a - k * b ) / ( k - 1 );
return -1;//没有找到
}
int
main() {
int t;
int iscn;
int a, b;
scanf("%d", &t);
iscn = 0;
while ( t-- ) {
scanf("%d%d", &a, &b);
printf("Case %d: %d\n", ++iscn, judge( a, b ));
}
return 0;
}
无注释代码:
#include <stdio.h>
int
judge( int a, int b ) {
int bound;
int k;
if ( a < b ) return -1;
if ( !( a % b ) ) return 0;
bound = a / b + 1;
for ( k = 2; k < bound; k++ )
if ( !( ( a - k * b ) % ( k - 1 ) ) )
return ( a - k * b ) / ( k - 1 );
return -1;
}
int
main() {
int t;
int iscn;
int a, b;
scanf("%d", &t);
iscn = 0;
while ( t-- ) {
scanf("%d%d", &a, &b);
printf("Case %d: %d\n", ++iscn, judge( a, b ));
}
return 0;
}