sicily1000. 整数划分
来源:互联网 发布:淘宝手机500元优惠券 编辑:程序博客网 时间:2024/05/01 06:09
sicily1000. 整数划分
Description
对于一个整数m,m > 0,它可以写成t个整数的和的形式(t>0):
m = z1 + z2 + … + zt ,其中zi > 0且为整数(1≤i≤t)
这t个整数就是整数m的一种划分。
比如整数4有以下5种划分:
4
3+1
2+2
2+1+1
1+1+1+1
Input
第一行是一个整数n,代表有n个测试用例
接下来的n行每一行是一个整数m,代表待划分的整数
Output
对于每一个用例,输出它的所有划分,格式如下:
对于一个划分,它按照数字降序排序,比如:4+3+2+1
对于两个划分3+2和3+1+1的排序:3+2排在3+1+1前面,比较顺序从左到右依次比较,第一个数字3是相等的,接下来第二个数字2 > 1,所以3+2排在3+1+1前面
注意输出没有空格
Sample Input
Copy sample input to clipboard
1
5
Sample Output
5
4+1
3+2
3+1+1
2+2+1
2+1+1+1
1+1+1+1+1
解题思路:
1、将m看成m个1,其最多划分成m个部分
2、把m划成0个部分,输出m。
把m划分第1个部分, m-1, 1
m-2, 2
m-3, 3
1, m-1
当第一部分小于第二部分, 不进行输出, 继续划分。
当最后部分划分为1,结束划分。
把m划分第2个部分, m-2, 1,1
m-3, 2,1
m-3, 1,2
m-4, 3,1
m-4, 2,2
m-4, 1,3
….
…..
1,1, m-2
当第i(i>=1)部分小于i-1部分, 不进行输出, 继续划分。
当划分第i(i>=2)部分, 划分时需判断是否小于前一部分,
是,继续划分。
否,结束划分。
#include <cstdio>#include <cctype>#include <cstdio>int list[100001];void divide(int n, int m) { if (m == 0 || list[m] <= list[m-1]) { for (int i = 0; i <= m; i++) { if (i == 0) printf("%d", list[0]); else printf("+%d", list[i]); } printf("\n"); } for (int i = n-1; i >= 1; i--) { list[m] = i; list[m+1] = n-i; if (m == 0 || list[m] <= list[m-1]) { divide(n-i, m+1); } }}int main() { int n, m; scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%d", &m); list[0] = m; divide(m, 0); } return 0;}
- sicily1000. 整数划分
- 整数划分
- 整数划分
- 整数划分
- 整数划分
- 整数划分
- 整数划分
- 整数划分
- 整数划分
- 整数划分
- 整数划分
- 整数划分
- 整数划分
- 整数划分
- 整数划分
- 整数划分:
- 整数划分
- 整数划分
- ANDROID OKHTTP MVP
- 056.Declare Global Variable 声明全局变量
- Android开发之旅:应用程序基础及组件(续)
- 安卓开发学习之006 LinearLayout.LayoutParams详解
- Zoho CRM系统助艾比森光电点亮客户统一管理之路
- sicily1000. 整数划分
- 获取元素的页面位置
- %p的用法
- 机器学习中的数学(2)-线性回归,偏差、方差权衡
- 055.Global Variable 全局变量
- 第4周项目6 多项式求和
- 第八周上机实践项目4-字符串加密
- 第7周时间项目4 - 队列数组
- CXF+MyEclipse 开发webservice入门实例之HelloWorld