• 第七届蓝桥杯C语言B组题目之凑算式


    第一部分:题目

    凑算式


           B      DEF
    A + --- + ------- = 10
           C      GHI
         
    (如果显示有问题,可以参见下图)


     
    这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。

    比如:
    6+8/3+952/714 就是一种解法,
    5+3/1+972/486 是另一种解法。


    这个算式一共有多少种解法?


    注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字。

    这个题不多说了,直接暴力生成9的全排列然后去验证等式是否成立,只是验证的时候如果防止精度问题可以通分把除法变成乘法。

    答案是:29
    第二部分:思路

    (式子改成:a+b/c+m/n=10,其中,a,b,c都是一位数,m,n都是三位数。总共10个数字,并且这些数是1~9.不能重复)

    暴力枚举。a,b,c从1~9中一次选取,保证两两不相同即可。利用数组take[10],来记录已取数字。m,n从987到123选取。

    根据take数组,判断m,n是否包含已取数字,同时判断m,n自身是否有重复数字。满足这些条件的情况下,判断是否满足式子。因为可能出现不能整除的情况,所以

    把式子变形,(b*n+c*m)/(c*n)=10-a,并且(b*n+c*m)%(c*m)=0;这就保证了式子的”合法性“。

    第三部分:代码

    #include<stdio.h>
    int take[10],index=0;//用于记录当前已取数字 
    int is_d(int n)//判断数字是不是有重复 
    {
      int s[10],i,j,l=0,o;
      while(n)
      {
        s[l++]=n%10;
        n/=10;
      }
      for(i=0;i<l;i++)
      {
        for(o=0;o<index;o++)
        {
          if(s[i]==take[o]||s[i]==0)//注意不包含0 
          {
            return 0;
          }
        }
        for(j=i+1;j<l;j++)
        {
          if(s[i]==s[j])
          {
            return 0;
          }
        }
      }
      for(j=0;j<l;j++)//在枚举的数字满足条件的情况下,把数字加入已取数字数组 
      {
        take[index++]=s[j];
      }
      return 1;
    } 
    int main()
    {
      int a,b,c,m,n,count=0;
      for(a=1;a<=9;a++)//a从1~9枚举 
      {
        take[index++]=a;
        for(b=1;b<=9;b++)
        {
          if(b!=a)
          {
            take[index++]=b;
            for(c=1;c<=9;c++)
            {
              if(c!=a&&c!=b)
              {
                take[index++]=c;
                for(m=987;m>=123;m--)
                {
                  if(is_d(m))
                  {
                    for(n=987;n>=123;n--)
                    {
                      if(is_d(n))
                      {
                      //判断是否满足式子要求,变形 
                      if((b*n+c*m)/(c*n)==10-a&&(b*n+c*m)%(c*n)==0)
                      {
                        printf("%d+%d/%d+%d/%d=10
    ",a,b,c,m,n);
                        count++;
                      }
                      index-=3;//在进行下一次枚举前,把当前数字删除 
                    }
                  }
                  index-=3;
                }
              }
              index--;
            }
          }
          index--;
        }
      }
      index--;
     }
     printf("%d
    ",count);
     return 0;
    }

    不足之处还望指教

    害怕失败的人,已经是一个loser!
  • 相关阅读:
    Linux C++ 网络编程学习系列(2)——多路IO之select实现
    Linux C++ 网络编程学习系列(1)——端口复用实现
    Linux c++ vim环境搭建系列(5)——vim使用
    Linux c++ vim环境搭建系列(4)——vim插件安装配置使用
    Linux c++ vim环境搭建系列(3)——Ubuntu18.04.4编译安装youcompleteme
    0512String类
    0511Object类和异常
    Leetcode--53. 最大子序和
    哥德巴赫猜想 Java实现
    面向对象案例-学生信息管理系统V1.1
  • 原文地址:https://www.cnblogs.com/xiangguoguo/p/5331233.html
Copyright © 2020-2023  润新知