打印整数的所有分解式
来源:互联网 发布:淘宝轮播2吃什么意思 编辑:程序博客网 时间:2024/04/30 09:55
这个题目的要求是:将一个大于1的整数写成几个整数乘积的形式,因为任意数和1相乘,其乘积不变,故要求分解后的数不能为1。题目要求所有的排列形式,所以12=3×4和12=4×3应该视为是两个不同的分解式,都应当输出。例如:对于整数n=36,其所有的分解式是
36=3636=2*1836=18*236=3*1236=12*336=4*936=9*436=6*636=2*2*936=2*9*236=9*2*236=2*3*636=2*6*336=3*6*236=3*2*636=6*2*336=6*3*236=3*3*436=3*4*336=4*3*336=2*2*3*336=2*3*2*336=2*3*3*236=3*2*2*336=3*2*3*236=3*3*2*2
算法原理:
本算法采用递归实现。若整数n的各个因子放在一个栈stack中,元素个数为len,则
1. 输出"n="各个因子相乘的形式。
2. 将数组的最后一个元素出栈,送入m,将m分解成2个整数m1,m2,将m1,m2入栈,此时,栈中的元素个数为len+1,递归调用函数split.
为了简便起见,我们使用数组模拟栈。函数split的代码如下:
void split(int n,int arr[], int len){ int i,last; printf("%d=",n); for (i=0;i<len;i++) { if (i>0) printf("*"); printf("%d",arr[i]); } printf("\n"); for(last=arr[len-1],i=2; i<=last/2;i++) { if( last % i == 0 ) { arr[len-1]=i; //将last其中的一个因子i入栈,替换掉最后一个元素last arr[len]=last/i; //将last的另一个因子last/i入栈 split(n,arr,len+1); //递归调用split函数 } }}
由于高度合成数的因子非常多,我们的测试代码使用了前40个高度合成数做实验。关于高度合成数的概念,请参阅见维基百科高合成数条目 http://zh.wikipedia.org/wiki/%E9%AB%98%E5%90%88%E6%88%90%E6%95%B0
完整的代码如下:
#include <stdio.h>#include <stdlib.h>void split(int n,int arr[], int len){ int i,last; printf("%d=",n); for (i=0;i<len;i++) { if (i>0) printf("*"); printf("%d",arr[i]); } printf("\n"); for(last=arr[len-1],i=2; i<=last/2;i++) { if( last % i == 0 ) { arr[len-1]=i; //将last其中的一个因子i入栈,替换掉最后一个元素last arr[len]=last/i; //将last的另一个因子last/i入栈 split(n,arr,len+1); //递归调用split函数 } }}int main(){ int high_comp_num_arr[]= { 2, 4, 6, 12, 24, 36, 48, 60, 120, 180, 240, 360, 720, 840, 1260, 1680, 2520, 5040, 7560, 10080, 15120, 20160, 25200, 27720, 45360, 50400, 55440, 83160, 110880, 166320, 221760, 277200, 332640, 498960, 554400, 665280, 720720, 1081080,1441440,2162160 }; int i,n,arr[32]; for (i=0;i<sizeof(high_comp_num_arr)/sizeof(int);i++) { printf("-------------------------------------\n"); n=high_comp_num_arr[i]; arr[0]=n; split(n,arr,1); } return 0;}
如果12=3×4和12=4×3视为是同一个分解式,只需要输出1个。则这个split函数应该修改如下。为了和原来的那个split区别,我们把这个函数命名为split2
void split2(int n,int arr[], int len){ int i,last,sqrt_last; printf("%d=",n); for (i=0;i<len;i++) { if (i>0) printf("*"); printf("%d",arr[i]); } printf("\n"); last=arr[len-1]; sqrt_last=(int)sqrt(last*1.0); if (len<2) i=2; else i=arr[len-2]; for(;i<=sqrt_last;i++) { if( last % i == 0 ) { arr[len-1]=i; //将last其中的一个因子i入栈,替换掉最后一个元素last arr[len]=last/i; //将last的另一个因子last/i入栈 split2(n,arr,len+1); //递归调用split函数 } }}
- 打印整数的所有分解式
- 输出整数的所有分解
- 整数因子分解:计算一个整数所有的分解式(递归实现)
- 整数分解,输出所有分解方案
- C++分解质因数(获取整数的所有素因子)
- 求出区间[a,b]中所有整数的质因数分解。
- 整数的质数分解
- 整数的分解
- 整数的幂分解
- 整数因子的分解
- 分解整数, 列出所有加法组合
- 递归打印输出一个整数的所有因式分解
- 练习1.11:打印出两个整数之间的所有数
- 质因数分解(给定一个整数,求该数的所有质因数)
- 素数筛选,整数的唯一分解,整数所有因子之和,递归求等比数列前n项和
- 整数分解成多个连续的整数序列
- 整数的质因数分解算法
- 整数的素数分解算法
- 将关系数据映射到业务实体
- Android实现仿gallery垂直滚动的效果
- 【2012百度之星/资格赛】C: 易手机的套餐
- ProGuard入门
- AWS里面的centos AMI
- 打印整数的所有分解式
- java 表格加滚动条
- vc 得到软件的版本信息 资源文件中的../Version/VS_VERSION_INFO/FILEVERSION的值
- windows的tos问题
- 【2012百度之星/资格赛】D:共同狂欢
- 删除aux.asp及com1/lpt1/prn/nul等无法删除文件
- sysfs接口函数到建立_DEVICE_ATTR
- Android定时器Timer.schedule
- HTML5 - MathML Tutorial