算法学习-带分数

问题描述
100 可以表示为带分数的形式:100 = 3 + 69258 / 714。

还可以表示为:100 = 82 + 3546 / 197。

注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。

类似这样的带分数,100 有 11 种表示法。

输入格式
从标准输入读入一个正整数N (N<1000*1000)

输出格式
程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。

注意:不要求输出每个表示,只统计有多少表示法!

样例输入1
100
样例输出1
11
样例输入2
105
样例输出2
6

 

#include <stdio.h>

int w=0,n,count=0;
int list[]={1,2,3,4,5,6,7,8,9};


int main()

{
    void perm(int a[],int n,int k=-1);
    inline void Swap(int &a,int &b);
    int GetNum(int list[],int i,int j);
    


    scanf("%d",&n);
    int temp=n;
    while(temp!=0)
    {
    temp=temp/10;
    w++;

    }



    perm(list,9);
    printf("%d\n",count);


    return 0;
}



int GetNum(int list[],int i,int j)
{

//将list[i]到list[j]之间转换为数字
    int k,num=0;
    for(k=i;k<=j;k++)
    {

    num=num*10+list[k];
    }
    return num;


}

void perm(int a[],int size,int k=-1)
{
    int i;
    if(k==-1) k=size-1;

    if(k==0)
    {
        //排列结束。
        int j,u;//j表示a的末尾位数 不能超过num的位数;u表示bLast所在的位置
        int a=0,b=0,c=0,bLast=0;

        for(j=0;j<w;j++)
        {
            a=GetNum(list,0,j);
            /*num=a+b/c
                
                变形可以得到
                b=(num-a)*c
                而cLast=list[8]
                可以得到的是
                bLast=((num-a)*list[8])%10;


            */
            bLast=((n-a)*list[8])%10;
            for(u=j+1;u<8;u++)
            {    
                if(list[u]==bLast)
                {
                    b=GetNum(list,j+1,u);
                    c=GetNum(list,u+1,8);

                    if(a+b/c==n&&b%c==0) count++;


                }

            }


        }
                

    }    

    else
    {
        for(i=0;i<=k;i++)
        {
            int tmp;
            tmp=a[i];
            a[i]=a[k];
            a[k]=tmp;
            
            perm(a,size,k-1);
        
            tmp=a[i];
            a[i]=a[k];
            a[k]=tmp;


        }

    }



}

你可能感兴趣的:(算法)