UVA10976 分数拆分 Fractions Again?!

简介: UVA10976 分数拆分 Fractions Again?!

题目描述


2021061418545451.png

输入

2
12


输出


2
1/2 = 1/6 + 1/3
1/2 = 1/4 + 1/4
8
1/12 = 1/156 + 1/13
1/12 = 1/84 + 1/14
1/12 = 1/60 + 1/15
1/12 = 1/48 + 1/16
1/12 = 1/36 + 1/18
1/12 = 1/30 + 1/20
1/12 = 1/28 + 1/21
1/12 = 1/24 + 1/24


思路: 由于没有给x,y的数的范围,也不知道啥时候枚举结束.我们可以根据已知条件做出一些推断:


1/k = 1 / x + 1 / y <= 2/y ===>> y<=2*k

另外x = k*y / (y-k) => y>k

所以 y∈[k+1,2*k]

这样我们粗略的得到了y的范围,知道了y的范围,我们可以根据上面那个式子推出x ,在判断x是否存在时,我们可以通过 求余进行判断推出的x是否合理.


参考代码:

#include<iostream>
using namespace std;
int k,y,a[5000],b[5000],cnt;//定义两个数组存储所有的可能性. 
int main()
{
  //y<=2*k   x = k*y / (y-k)==> y >k
  while(cin>>k){
    //memset(a,0,sizeof(a));
    cnt = 0;//用于计数 
    for(int y = k+1; y <= 2*k;y++){//枚举y,同时枚举x   
      if(!(k*y % (y-k)) && k*y / (y-k) >=y){//当 k*y 对 (y-k)求余为0,并且x >=y 则说明满足题意. 
        a[cnt] = k*y / (y-k);
        b[cnt] = y;
        cnt++;
      }
    }
    cout<<cnt<<endl;
    for(int i = 0;i < cnt;i++){
      printf("1/%d = 1/%d + 1/%d\n",k,a[i],b[i]);
    } 
  }
  return 0;
}

另外看了看刘汝佳大佬的代码,也很不错,附上

参考代码2

#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
int main()
{
  int k;
  while(scanf("%d",&k)==1&&k){
    vector<int> X,Y;
    for(int y = k+1;y<=2*k;y++){
      if(k*y %(y-k)==0){
        X.push_back(k*y /(y-k));
        Y.push_back(y); 
      }
    }
    printf("%d\n",X.size());
    for(int i = 0;i < X.size();i++){
      printf("1/%d = 1/%d + 1/%d\n",k,X[i],Y[i]);
    }
  }
  return 0;
}
相关文章
|
6月前
PTA-求分数序列的前n项和分数 20
求分数序列的前n项和分数 20
68 0
|
6月前
|
算法 测试技术 C#
区间合并|LeetCode2963:统计好分割方案的数目
区间合并|LeetCode2963:统计好分割方案的数目
|
5月前
|
存储 算法 测试技术
每日练习之广义搜索——小红的素数合并
每日练习之广义搜索——小红的素数合并
29 1
|
6月前
|
Python
PTA-第4章-8 求分数序列前N项和
编写程序计算序列 2/1+3/2+5/3+8/5+... 的前N项和,其中每项分子是前一项分子与分母之和,分母是前一项分子。输入一个正整数N,输出部分和,精确到小数点后两位。给定N=20,输出为32.66。以下是代码实现: ```python n = int(input()) sum = 0 a = 2 b = 1 for i in range(1, n + 1): sum += a / b c = a a = a + b b = c print(f&quot;{sum:.2f}&quot;) ```
130 3
【LeetCode 热题 HOT 100】139. 单词拆分【中等】
【LeetCode 热题 HOT 100】139. 单词拆分【中等】
|
6月前
【每日一题Day165】LC1039多边形三角剖分的最低得分 | 区间dp
【每日一题Day165】LC1039多边形三角剖分的最低得分 | 区间dp
57 0
|
算法
华为机试HJ70:矩阵乘法计算量估算
华为机试HJ70:矩阵乘法计算量估算
华为机试HJ45:名字的漂亮度
华为机试HJ45:名字的漂亮度
|
人工智能 算法 C语言
LeetCode.每日一题 1039. 多边形三角剖分的最低得分
这题是一道区间Dp问题,将一个多边形形划分为若干个三角形,求其最小的得分.
99 0
|
算法 Java 网络架构
代码随想录训练营day27| 39. 组合总和 40.组合总和II 131.分割回文串
代码随想录训练营day27| 39. 组合总和 40.组合总和II 131.分割回文串