C语言编程将整数1分解成若干个几分之一的和 

千年捞菜 2015-03-11 09:42:18
形如:1/a 的分数称为单位分数。

可以把1分解为若干个互不相同的单位分数之和。
例如:
1 = 1/2 + 1/3 + 1/9 + 1/18
1 = 1/2 + 1/3 + 1/10 + 1/15
1 = 1/3 + 1/5 + 1/7 + 1/9 + 1/11 + 1/15 + 1/35 + 1/45 + 1/231
等等,类似这样的分解无穷无尽。

我们增加一个约束条件:最大的分母必须不超过30

请你求出分解为n项时的所有不同分解法。

数据格式要求:

输入一个整数n,表示要分解为n项(n<12)
输出分解后的单位分数项,中间用一个空格分开。
每种分解法占用一行,行间的顺序按照分母从小到大排序。

例如,
输入:
4
程序应该输出:
1/2 1/3 1/8 1/24
1/2 1/3 1/9 1/18
1/2 1/3 1/10 1/15
1/2 1/4 1/5 1/20
1/2 1/4 1/6 1/12
...全文
643 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2015-03-13
  • 打赏
  • 举报
回复
或参考下面:
//求从Begin到End的正整数中挑出任意个数使其总和为Sum的所有方案
#include <stdio.h>
int Begin,End,Sum;
int j;
int o[1000];
long n;
void combsum(int b,int e,int s,int d) {
    int i;

    if (e>s) e=s;
    for (i=e;i>=b;i--) {
        if ((i+b)*(i-b+1)/2<s) break;
        o[d]=i;
        if (s-i<=0) {
            n++;
            printf("%8ld:",n);
            for (j=0;j<=d;j++) printf("%d ",o[j]);
            printf("\n");
        } else {
            if (d+1<1000) combsum(b,i-1,s-i,d+1);
            else {
                printf("Error:Too deep.\n");
                return;
            }
        }
    }
}
int main() {
    printf("Input Begin,End,Sum:");fflush(stdout);
    scanf("%d,%d,%d",&Begin,&End,&Sum);
    n=0L;
    combsum(Begin,End,Sum,0);
    printf("Total:%ld\n",n);
    return 0;
}
赵4老师 2015-03-13
  • 打赏
  • 举报
回复
在给定数x的约数之中寻找n个约数使得之和等于x 参考下面:
//n个(2<=n<=20)整数(整数范围-10<=x<=10),判断是否可以从这n个数中找到若干个数,其和为10
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <algorithm>
using namespace std;
int MAXN=20;
int MINN=2;
int x[20];
int n,i,j,k,sum;
int main() {
    srand((unsigned)time(NULL));
    n=MINN+rand()%(MAXN-1);
    for (i=0;i<n;i++) {
        x[i]=-10+rand()%21;
        printf("%d,",x[i]);
    }
    printf("\n");
    sort(&x[0],&x[n]);
    do {
        for (i=2;i<=n;i++) {
            sum=0;
            k=n/2-i/2;
            for (j=k;j<k+i;j++) {
                sum+=x[j];
            }
            if (10==sum) {
                for (j=k;j<k+i;j++) {
                    if (j==k+i-1) {
                        printf("%d==10\n",x[j]);
                    } else {
                        printf("%d+",x[j]);
                    }
                }
                printf("YES\n");
                return 1;
            }
        }
    } while (next_permutation(&x[0],&x[n]));
    printf("NO\n");
    return 0;
}
赵4老师 2015-03-12
  • 打赏
  • 举报
回复
仅供参考:
Mr. Code 2015-03-12
  • 打赏
  • 举报
回复
等式可以认为是(a1+a2+...am)/K,很好理解,a1,...am必然是K的所有约数的和的组合。因此最后题目就是转化为求一个数K的所有约数(质因子),题目K最大才30,之后求出所有约数中,n个数的和等于K的组合。 比如:K=30,30=2*3*5,根据“约数个数定理”,约数有8个,除去自己本身就剩7个,为1,2,3,5,6,10,15,如果你输入n=4,那么就是求这7个约数中,哪4个相加正好等于30的所有组合,根据组合原理,C(7,4)才210中组合,因此循环不会很久。 题目没规定K值,因此,需要K从1到30循环,对每一次循环的K,找出所有所有约数,并对所有约数个数不小于n的情况,循环找出所有n个约数等于K的组合。 建议搜索: 1、约数个数定理 2、求求一个数的所有约数(或者质因子) 3、从N个数中任选M个数相加的和等于K(循环应该就能解决)
FancyMouse 2015-03-12
  • 打赏
  • 举报
回复
引用 2 楼 lovesmiles 的回复:
加了限制项n 时,就更加好办了,就是求n个数相加等于30
样例的1/2 1/3 1/8 1/24你这么做能出来?
一根烂笔头 2015-03-12
  • 打赏
  • 举报
回复
其实就是整数分解的变体 比如 (18 + 12 + 4 + 2) / 36 = 1. 为了保证分子是1,那么分子必须是分母的约数。为了保证和为1,那么约数之和必须等于分母 故:在给定数x的约数之中寻找n个约数使得之和等于x
勤奋的小游侠 2015-03-11
  • 打赏
  • 举报
回复
加了限制项n 时,就更加好办了,就是求n个数相加等于30
勤奋的小游侠 2015-03-11
  • 打赏
  • 举报
回复
给个思路你: 1=30/30 这个分母就是30,分子也是30,将分子的30做分解就可以了。列出1-29之内相加等于30的各种可能,然后将这些数和分母约分就可以了 比如:30=2+3+25 则1=(2+3+25)/30 1=1/15+1/10+5/6

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧