题目描述:
求方程 (x+a)/(x+b) = c的非负整数根,其中a,b,c都是非负整数。
输入:
第一行是一个整数K,表示样例的个数(K≤30000)。以后的K行每行为以一个样例,包含三个非负整数a,b,c (a,b,c ≤ 109)。
输出:
每行输出一个样例的结果。如果方程没有根,输出“None”,否则输出根的值,如果存在多个根,输出最小的那个。
最初代码如下:
#include<stdio.h>
int main()
{
int K;
int a, b, c, p;
float t;
scanf_s("%d", &K);
while (K--) {
scanf_s("%d %d %d", &a, &b, &c);
if (a == b) {
if (b == 0) {
if(c==1)printf("1\n");
else printf("None\n");
}
else {
if(c==1)printf("0\n");
else printf("None\n");
}
}
else if (a > b) {
if (b == 0 && c == 1)printf("None\n");
else if (b == 0 && c != 1) {
t = a / (c - 1);
p = a % (c - 1);
if (t >= 0 && p == 0)
printf("%.f\n", t);
else printf("None\n");
}
else {
t = (a - b) / (c - 1) - b;
p = (a - b) % (c - 1);
if (t>= 0 && p== 0)
printf("%.f\n", t);
else printf("None\n");
}
}
else {
if (a == 0 && c == 1)printf("None\n");
else if (a == 0 && c != 1) {
t = b / (1 - c) - b;
p = b % (1 - c);
if (t >= 0 && p == 0)
printf("%.f\n", t);
else printf("None\n");
}
else {
t = (a - b) / (c - 1) - b;
p = (a - b) % (c - 1);
if (t >= 0 && p == 0)
printf("%.f\n", t);
else printf("None\n");
}
}
}
return 0;
}
遇到困难:
1、分类的复杂性
2、代码过长,运行超时
3、压缩困难(后来也是把所有情况罗列尽量合并同类项)
新代码如下:
#include<stdio.h>
int main()
{
int K;
scanf_s("%d", &K);
while (K--) {
int a, b, c,p;
float t;
scanf_s("%d %d %d", &a, &b, &c);
if (b != 0 && c != 1) {
t = (float)((a - b) / (c - 1) - b);
p = (a - b) % (c - 1);
if (t >= 0 && p == 0)
printf("%.f\n", t);
else printf("None\n");
}
else if (c == 1) {
if (a == b && b == 0)printf("1\n");
else if (a == b && b != 0)printf("0\n");
else printf("None\n");
}
else if (a == 0)printf("None\n");
else {
t = (float)(a / (c - 1));
p = a % (c - 1);
if (t >= 0 && p == 0)
printf("%.f\n", t);
else printf("None\n");
}
}
return 0;
}