zoukankan      html  css  js  c++  java
  • 蓝桥杯 2014本科C++ B组 奇怪的分式 暴力枚举

    蓝桥杯 枚举 奇怪的分式

    标题:奇怪的分式

        上小学的时候,小明经常自己发明新算法。一次,老师出的题目是:

        1/4 乘以 8/5

        小明居然把分子拼接在一起,分母拼接在一起,答案是:18/45 (参见图1.png)

        老师刚想批评他,转念一想,这个答案凑巧也对啊,真是见鬼!

        对于分子、分母都是 1~9 中的一位数的情况,还有哪些算式可以这样计算呢?

        请写出所有不同算式的个数(包括题中举例的)。

        显然,交换分子分母后,例如:4/1 乘以 5/8 是满足要求的,这算做不同的算式。

        但对于分子分母相同的情况,2/2 乘以 3/3 这样的类型太多了,不在计数之列!

    注意:答案是个整数(考虑对称性,肯定是偶数)。请通过浏览器提交。不要书写多余的内容。

    挺简单的,要是暴力枚举也没问题,用一个DFS的深搜代码看上去简单点,另外熟悉GCD,将两个分数的最大公约数求出,相除公约数,再去判断这两个分数是否相同。

    答案:14

    代码如下

     1 #include<iostream>
     2 #include<cstdio>
     3 #define MAXN 5
     4 using namespace std;
     5 int num[MAXN],s1,s2,r1,r2;
     6 int count=0;
     7 int gcd(int a,int b)
     8 {
     9     int s;
    10     while(b)
    11     {
    12         s=a%b;
    13         a=b;
    14         b=s;
    15     }
    16     return a;
    17  } 
    18 void dfs(int m)
    19 {
    20     int i,j,a,b,t,ss1,ss2,rr1,rr2;
    21     if(m==5)
    22     {
    23         if(num[1]!=num[2]&&num[3]!=num[4])
    24         {
    25             s1=num[1]*10+num[3];
    26             s2=num[2]*10+num[4];
    27             r1=num[1]*num[3];
    28             r2=num[2]*num[4];
    29             if(r1<r2)
    30             {
    31                 a=r2;
    32                 b=r1;
    33                 t=gcd(a,b);
    34             }
    35             else
    36             {
    37                 a=r1;
    38                 b=r2;
    39                 t=gcd(a,b); 
    40             }
    41             rr1=r1/t;
    42             rr2=r2/t;
    43             if(s1<s2)
    44             {
    45                 a=s2;
    46                 b=s1;
    47                 t=gcd(a,b);
    48             }
    49             else
    50             {
    51                 a=s1;
    52                 b=s2;
    53                 t=gcd(a,b); 
    54             }    
    55             ss1=s1/t;
    56             ss2=s2/t;
    57             if(rr1==ss1&&rr2==ss2)
    58             {
    59                 cout<<num[1]<<"/"<<num[2]<<" * "<<num[3]<<"/"<<num[4]<<" = "<<num[1]<<num[3]<<"/"<<num[2]<<num[4]<<endl;
    60                 count++;
    61             }
    62         }
    63     }
    64     else
    65     {
    66         for(i=1;i<=9;i++)
    67         {
    68             num[m]=i;
    69             dfs(m+1);
    70         }
    71     }
    72  } 
    73  int main()
    74  {
    75      dfs(1);
    76      cout<<count<<endl;
    77      return 0;
    78  }
  • 相关阅读:
    【MYSQL】某些有用的sql【持续更新中】
    【LDAP】什么时候需要使用LDAP?
    【LDAP】 objectClass 分类
    MySQL的锁机制
    spring的事务传播级别及场景
    @NotEmpty,@NotNull和@NotBlank的区别
    mysql的字段为bit时,插入数据报Data too long
    activeMQ启动报--找不到或无法加载主类
    【ListViewJson】【com.demo.app】【AppException】源码分析及其在工程中作用
    【ListViewJson】【com.demo.app】【AppConfig】源码分析及其在工程中作用
  • 原文地址:https://www.cnblogs.com/fancy-itlife/p/4379613.html
Copyright © 2011-2022 走看看