算文学习-带分数,算艺术学习带分数

算理学习-带分数,算历史学习带分数

主题素材汇报
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;


        }

    }



}

http://www.bkjia.com/cjjc/1011008.htmlwww.bkjia.comtruehttp://www.bkjia.com/cjjc/1011008.htmlTechArticle算法学习-带分数,算法学习带分数 难题陈诉 100
可以代表为带分数的款型:100 = 3 + 69258 / 714。 还足以代表为:100 = 82 +
3546 / 197。 注意特征…

标题陈说
100 可以代表为带分数的方式:100 = 3 + 69258 / 714。

还足以代表为:100 = 82 + 3546 / 197。

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

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

输入格式
从专门的学问输入读入三个正整数N (N<一千*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;


        }

    }



}

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图