zoukankan      html  css  js  c++  java
  • 【蓝桥杯2014_C++】t3:神奇算式

    神奇算式

    由4个不同的数字,组成的一个乘法算式,它们的乘积仍然由这4个数字组成。

    比如:

    210 x 6 = 1260
    8 x 473 = 3784
    27 x 81 = 2187

    都符合要求。

    如果满足乘法交换律的算式算作同一种情况,那么,包含上边已列出的3种情况,一共有多少种满足要求的算式。

    请填写该数字,通过浏览器提交答案,不要填写多余内容(例如:列出所有算式)。

    这题就是直接做,先把所有的四位数枚举出来,然后筛选出符合条件的。

    上代码:

     1 #include <iostream>
     2 #include <cstring>
     3 #include <sstream>
     4 using namespace std;
     5 
     6 string i2s(int i){
     7     stringstream ss;
     8     string s;
     9     ss<<i;
    10     ss>>s;
    11     return s;
    12 }
    13 
    14 void solve1(int i,int j,int k,int l){
    15     int a = i;
    16     int b = 100*j+10*k+l;
    17     int c = a*b;
    18     string s = i2s(c); 
    19     if(s.find(i+'0')!=string::npos && s.find(j+'0')!=string::npos && s.find(k+'0')!=string::npos && s.find(l+'0')!=string::npos)
    20         cout<<a<<"*"<<b<<"="<<c<<endl;
    21 }
    22 void solve2(int i,int j,int k,int l){
    23     int a = 10*i+j;
    24     int b = 10*k+l;
    25     if(a>=b) return;  //两位数相乘的情况会出现满足乘法交换律的两组算式,排除其中一组 
    26     int c = a*b;
    27     string s = i2s(c);
    28     if(s.find(i+'0')!=string::npos && s.find(j+'0')!=string::npos && s.find(k+'0')!=string::npos && s.find(l+'0')!=string::npos)
    29         cout<<a<<"*"<<b<<"="<<c<<endl;
    30 }
    31 
    32 int main(){
    33     for(int i=1;i<=9;i++)
    34         for(int j=0;j<=9;j++)
    35             for(int k=0;k<=9;k++)
    36                 for(int l=0;l<=9;l++){
    37                     if(i!=j&&i!=k&&i!=l&&j!=k&&j!=l&&k!=l){
    38                         solve1(i,j,k,l);
    39                         solve2(i,j,k,l);    
    40                     }
    41                 }
    42     
    43     return 0;
    44 }

    代码看起来很长,其实solve1和solve2几乎都是重复的,作为填空题无脑解法,写起来还是很快的。。

    一开始两位数相乘那边忘了考虑乘法交换律,算出来有18组,把算式打印出来看了一下发现有重复的,于是又加了乘数a<b的条件。

    string里找子串可以用str.find("xxx")!=string::npos; 还真忘了。。还查了下c++ reference来着orz。还看到有先把两个字符串排序再比较的,

    还有就是'0'-'9'以内的字符和0-9以内的数字转换可以用char = int +'0';  int = char -'0'的方法~强转还是不太安全的,至少在devc++里会打印出奇怪的东西。。

    打印出来有12组:

    答案是12。

  • 相关阅读:
    依靠MySQL(frm、MYD、MYI)数据文件恢复
    Centos7.4.1708安装Jumpserver
    Ubuntu16.04安装vmware pro 15激活码
    AIX系统命令
    virtualbox迁移虚拟机
    RedHat Enterprise7 搭建ISCSI
    RedHat Enterprise7 修改为CentOS的yum源
    关于Server2008 R2日志的查看
    Centos7.4.1708搭建syslog服务
    ElasticSearch第四步-查询详解
  • 原文地址:https://www.cnblogs.com/Aikoin/p/10556462.html
Copyright © 2011-2022 走看看