打印整数的所有分解式

来源:互联网 发布:淘宝轮播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函数        }    }}



 

原创粉丝点击