zoukankan      html  css  js  c++  java
  • 算法学习-带分数

    问题描述 
    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
    ",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;
    
    
            }
    
        }
    
    
    
    }
    复制代码
  • 相关阅读:
    layer备忘
    Java中遍历Map对象的4种方法
    为什么Java中1000==1000为false而100==100为true?
    linux系统安装psycopg2
    centos7源码安装mysql5.7
    Azure Sql
    javascript和jQuery动态修改css样式的方法
    Git early EOF index-pack failed 问题
    C# 多线程——SemaphoreSlim的使用
    Docker 可视化
  • 原文地址:https://www.cnblogs.com/xieyulin/p/7060736.html
Copyright © 2011-2022 走看看