这道题我的想法就是,先找出两个相同的来,如果没有就一大一小也可以
然后再去寻找的是就是将分母比较小的那个-1,去寻找有没有可以和它相配的另一个数
来看看汝佳是怎么写的吧
其实我之前的思路是有一点问题的,如何表示一个分数?难道是用小数来表示吗?但是浮点数里面的小数是有误差的啊
所以汝佳大神直接将分数转换成了整数进行计算
另外还有一点值得学习的是,如何求出整数x的过程
我之前想的是从2*y一直往上增1,直到他们相加的和超过了1/k,那么说明就没有值,真的太垃圾了
那就是不需要真的计算出x,只需要判断ky%(y-k)是不是整数就可以了,如果是,那么x = ky/y-k
所以学到的两点就是如何表示一个分数,如何计算一个整数
AC代码
//这道题我的想法就是,先找出两个相同的来,如果没有就一大一小也可以 //然后再去寻找的是就是将分母比较小的那个-1,去寻找有没有可以和它相配的另一个数 //来看看汝佳是怎么写的吧 //汝佳不愧是汝佳啊 //其实我之前的思路是有一点问题的,如何表示一个分数?难道是用小数来表示吗?但是浮点数里面的小数是有误差的啊 //所以汝佳大神直接将分数转换成了整数进行计算 //另外还有一点值得学习的是,如何求出整数x的过程 //我之前想的是从2*y一直往上增1,直到他们相加的和超过了1/k,那么说明就没有值,真的太垃圾了 //那就是不需要真的计算出x,只需要判断ky%(y-k)是不是整数就可以了,如果是,那么x = ky/y-k //汝佳大神非常的厉害,下面实现它的方式 #include<cstdio> #include<vector> using namespace std; int main() { #ifdef local freopen("input.txt","r",stdin); #endif int k; while(scanf("%d",&k) == 1) { vector<int>ans_x; vector<int>ans_y; int cnt = 0; for(int y = k + 1;y <= 2 * k;y++) { if((k * y) % (y - k) == 0) { ans_y.push_back(y); ans_x.push_back((k * y) / (y - k)); cnt++; } } printf("%d\n",cnt); for(int i = 0;i < cnt;i++) { printf("1/%d = 1/%d + 1/%d\n",k,ans_x[i],ans_y[i]); } } return 0; }