自然数n的分解

输入自然数n(n<100),输出所有和的形式。不能重复。

如:4=1+1+2;4=1+2+1;4=2+1+1 属于一种分解形式。

样例:

输入:

7

输出:

7=1+6

7=1+1+5

7=1+1+1+4

7=1+1+1+1+3

7=1+1+1+1+1+2

7=1+1+1+1+1+1+1

7=1+1+1+2+2

7=1+1+2+3

7=1+2+4

7=1+2+2+2

7=1+3+3

7=2+5

7=2+2+3

7=3+4

分析:

假设n=a[1]+a[2]+...+a[n],为了避免分解重复,可以约定a[1]≤a[2]≤...≤a[n],

假设当前已经分解出cur项,待分解的数字为m(m=n-a[1]-a[2]...-a[cur]);

则 a[1],a[2],...,a[cur],m即是一种分解方案(cur>0)

如何继续分解呢,a[cur+1]=?

a[cur+1]的取值范围:a[cur]~m/2  (因为 m-a[cur+1]>=a[cur+1],则a[cur+1]/2<=m才能继续分解)

代码:

 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 int a[100],b[100];
 5 int s=0, n;
 6 void dfs(int cur,int m){
 7     if (cur>0){
 8         s++;
 9         cout<<n<<"=";
10         for (int i=1;i<=cur;i++) cout<<a[i]<<"+";
11         cout<<m<<endl;
12     }
13      for (int i=a[cur];i<=m/2;i++){
14          a[cur+1]=i;
15         dfs(cur+1,m-i);
16         }
17      }
18 int main(){
19     memset(a,0,sizeof(a));
20     memset(b,0,sizeof(b));
21     cin>>n;
22     a[0]=1;
23     dfs(0,n);
24     cout<<s<<endl;
25     return 0;
26 }

时间: 2024-10-24 23:55:50

自然数n的分解的相关文章

【Codevs2549/2548】自然数和/积分解

自然数和分解 Description 把自然数N分解为若干个自然数之和,输出方案数. Input N,(1≤n≤50) Output 方案数 Sample Input 5 Sample Output 7 HINT 5 可分为 1 1 1 1 11 1 1 21 1 31 2 21 42 35 题解 解法1:完全背包 #include<iostream> #include<cstdio> using namespace std; int n,ans; int a [55]; int

有理数分解-数论

题目描述 Description 任何一个[0,1]中的有理数p/q(p.q均为自然数)一定可以分解成1/r1+1/r2+1/r3+-+1/rk,且r1<r2<r3<-<rk.当然这样的分解不是唯一的,如5/6=1/2+1/3=1/2+1/5+1/8+1/120,第一个分解式中的第二项比第二个分解式中的第二项大,因此我们可以定义第一个分解式比第二个分解式大. 程序要求找出p/q的最大分解式. 输入输出格式 Input/output 输入格式:键盘输入p.q,1≤p≤q≤50 输出格

质因数分解的rho以及miller-rabin

一.前言 质因数分解,是一个在算法竞赛里老生常谈的经典问题.我们在解决许多问题的时候需要用到质因数分解来辅助运算,而且质因数分解牵扯到许许多多经典高效的算法,例如miller-rabin判断素数算法,rho启发式搜索质因数分解算法等.在此文里,我要介绍的就是miller-rabin算法以及rho启发式搜索分解算法. 二.算术基本定理 首先,我们得知道,任意一个大于1的自然数都可以分解为有限个质数的乘积.这里因子均为质数,且为正整数.我们把这样的分解成为N的标准分解式.关于算数基本定理的应用有许多

欧几里德算法和唯一分解定理

刘汝佳<入门经典>上提供了一道经典的题目: 除法表达式,在NYOJ上可以找到原题,题号1013 描述 给出一个这样的除法表达式:X1/X2/X3/···/Xk,其中Xi是正整数.除法表达式应当按照从左到右的顺序求和,例如表达式1/2/1/2值为1/4.但是可以在表达式中嵌入括号以改变计算顺序,例如表达式(1/2)/(1/2)的值为1. 输入 首先输入一个N,表示有N组测试数据, 每组数据输入占一行,为一个除法 表 达式,输入保证合法. 使表达式的值为整数.k<=10000,Xi<=

UVA 10061 How many zero&#39;s and how many digits ? (m进制,阶乘位数,阶乘后缀0)

题意:给出两个数字a和b,求a的阶乘转换成b进制后,输出(1)后缀中有多少个连续的0? (2)有多少位? 思路:逐个问题解决. 设a!=k.  k暂时不用直接转成b进制. (1)阶乘后缀0问题.先看这个十进制后缀0的例子:http://www.cnblogs.com/xcw0754/p/4604473.html 解法差不多,稍变化. 首先将b分解成若干质数(比如8={2*2*2})保存在一个集合A中(注意自然数的质数分解是唯一的),只要有一个序列A就能构成一个0,因为满b就进位,b可以表示成10

今日刷题集合

月考没考,最皮的是刷题效率低的可怕,搜索中的那些回溯用的还是很水,不如总结一下. codevs 题号:1501 1506 1842 1983 2549 2806 3143 3145 1008 1294 1295 1501 二叉树的最大宽度和高度(没加using namespace std ;会过不去编译,max.min函数封装在#include<iostream>里,所以没有using namespace std ;不行.) 1 #include<bits/stdc++.h> 2

有趣的两道数论题——2017华杯初赛小高组

首发于订阅号 嗨编程,这是一个以嗨为目标的编程订阅号(仅仅是目标而已),扫码可关注,争取每周5更. 5.从1-20这20个整数中任意取11个数,其中必有两个数的和等于() A. 19    B.20    C.21    D.22 答案:C 解析: 最小的11个数是1~11,当中最大的两个数之和是21,最大的11个数是10~20,当中最小的两个数之和是21,即可确定答案. 9.在一个自然数的所有因数中,能被3整除的因数比奇因数多5个,那么这个自然数最小是_____ 答案:72 解析:考虑对这个自

质素与密码

ps:今天在一个社交软件上认识了一个朋友,在聊天过程了谈到过质素于密码的关系,所以上网搜索些许资料,进行补充个人知识库. 在本世纪七十年代,有几位美国数学家提出一种编码方法,这种方法可以把通讯双方的约定公开,然而却无法破译密码,这种奇迹般的密码就与素数有关(RSA加密算法). 我们知道,任何一个自然数都可以分解为素数的乘积,如果不计因数的次序,分解形式是唯一的.这叫做算术基本定理(欧几里得早已证明).可是将一个大整数分解却没有一个简单通行的办法,只能用较小的素数一个一个去试除,耗时极大.如果用电

codevs 2549 自然数和分解

时间限制: 1 s 空间限制: 32000 KB 题目等级 : 白银 Silver 题目描述 Description 把自然数N分解为若干个自然数之和,输出方案数. 输入描述 Input Description N,(1≤n≤50) 输出描述 Output Description 方案数 样例输入 Sample Input 5 样例输出 Sample Output 7 数据范围及提示 Data Size & Hint 5 可分为 1 1 1 1 11 1 1 21 1 31 2 21 42 35