一【题目难度】
- 乙级
二【题目编号】
- 1103 缘分数 (20 分)
三【题目描述】
- 所谓缘分数是指这样一对正整数 a a a 和 b b b,其中 a a a 和它的小弟 a − 1 a−1 a−1 的立方差正好是另一个整数 c c c 的平方,而 c c c 正好是 b b b 和它的小弟 b − 1 b−1 b−1 的平方和。例如 8 3 − 7 3 = 169 = 1 3 2 8^3−7^3 =169=13^2 83−73=169=132 ,而 13 = 3 2 + 2 2 13=3^2 +2^2 13=32+22 ,于是 8 8 8 和 3 3 3 就是一对缘分数。
- 给定 a a a 所在的区间 [ m , n ] [m,n] [m,n],是否存在缘分数?
四【题目示例】
-
输入格式:
输入给出区间的两个端点 0 < m < n ≤ 25000 0<m<n≤25000 0<m<n≤25000,其间以空格分隔。 -
输出格式:
按照 a a a 从小到大的顺序,每行输出一对缘分数,数字间以空格分隔。如果无解,则输出 No Solution。 -
输入样例 1:
8 200 -
输出样例 1:
8 3
105 10 -
输入样例 2:
9 100 -
输出样例 2:
No Solution
五【解题思路】
- 整个题目的思路还是比较好想的,就是按照题目要求一步一步模拟。这里比较巧妙的是,判断立方差是否是另外一个数的平方,如果对这个立方差开方之后(注意要用 f l o a t float float类型接收),再强制转换为 i n t int int类型,然后判断相等的话,就符合要求,继续后面的操作即可。但是这个题目的坑点在于最后一个测试用例:1 1。按照题目的描述,这个测试用例应该是缘分数,但是判题程序却不认为它是缘分数,原因在于,题目并没有说明小弟们都是正整数,而仅仅作为正数是不能说明这个测试用例不是缘分数的,所以这个题目描述是有问题的,也就会导致最后一个用例无法通过,解决办法就是内层 f o r for for循环从2开始
六【最终得分】
- 20分
七【代码实现】
#include<stdio.h>
#include<math.h>
int main()
{
int m,n,flag = 0;
scanf("%d %d",&m,&n);
for(int i = m;i<=n;i++)
{
int c = pow(i,3) - pow(i - 1,3);
float temp = sqrt(c);
if(temp == (int)temp)
{
for(int j = 2;j<=temp;j++)
{
if((pow(j,2) + pow(j - 1,2)) == temp)
{
flag++;
printf("%d %d\n",i,j);
}
}
}
}
if(flag == 0)
{
printf("No Solution");
}
return 0;
}