zoukankan      html  css  js  c++  java
  • 2014年蓝桥杯省赛A组c++第3题(数组构造+暴力求解)

    /*
    标题:神奇算式       
    由4个不同的数字,组成的一个乘法算式,它们的乘积仍然由这4个数字组成。       
    比如:
    210 x 6 = 1260  
    8 x 473 = 3784 
    27 x 81 = 2187        
    都符合要求。       
    如果满足乘法交换律的算式算作同一种情况,那么,包含上边已列出的3种情况,一共有多少种满足要求的算式。        
    请填写该数字,通过浏览器提交答案,不要填写多余内容(例如:列出所有算式)。
    */
    
    #include<cstdio>  
    #include<cstring>  
    #include<algorithm>  
    #include<iostream>  
    #include<string>  
    #include<vector>  
    #include<stack>  
    #include<bitset>  
    #include<cstdlib>  
    #include<cmath>  
    #include<set>  
    #include<list>  
    #include<deque>  
    #include<map>  
    #include<queue>
    using namespace std;
    
    /*
    如果是初始化,只要定义第一个元素为0,后面就全为0了,如
    int a[10] = {0};
    如果是在定义以后想全部赋为0,用memset()函数是比较快的。
    如:
    int a[10];
    memset(a, 0, sizeof(int)*10);
    */
    int flag[10];
    
    //compares the two arrays so as to know if they have the same elements
    bool f(int a1[],int a2[])
    {
        for(int i=0;i<10;i++)
        {
            if(a1[i]!=a2[i])    return false;
        }
        return true;
    }
    
    int main()
    {
        for(int i=1000;i<=9999;i++)
        {
            memset(flag, 0, sizeof(int)*10);
            int n=i;
            int a[4] = {0};
            {
                a[0]=n/1000;n=n%1000;
                a[1]=n/100;n=n%100;
                a[2]=n/10;n=n%10;
                a[3]=n;//求每一位的数字 
            }
            n=i;
            while(n)//求解i每一位的组成 
            {
                flag[n%10]++;
                n/=10;
                //cout<<flag[0]<<flag[1]<<flag[2]<<flag[3]<<flag[4]<<flag[5]<<flag[6]<<flag[7]<<flag[8]<<flag[9]<<flag[10]<<endl;
            }
            int final[3];//存放每一种组合的相乘的结果 
            {
                final[0]=(a[0])*(a[1]*100+a[2]*10+a[3]);
                final[1]=(a[0]*10+a[1])*(+a[2]*10+a[3]);
                final[2]=(a[0]*100+a[1]*10+a[2])*(a[3]);
            }
            int flag1[3][10]={0};//存放每个结果的每一位的组成
            for(int j=0;j<3;j++)
            {
                n=final[j];
                while(n)
                {
                    flag1[j][n%10]++;
                    n/=10;
                }
                //cout<<flag1[j][0]<<flag1[j][1]<<flag1[j][2]<<flag1[j][3]<<flag1[j][4]<<flag1[j][5]<<flag1[j][6]<<flag1[j][7]<<flag1[j][8]<<flag1[j][9]<<flag1[j][10]<<endl;
            }
            bool b;
            //case1
            if(f(flag,flag1[0]))    cout<<a[0]<<"*"<<a[1]*100+a[2]*10+a[3]<<"="<<final[0]<<endl;
            //case2
            if(f(flag,flag1[1]))    cout<<a[0]*10+a[1]<<"*"<<a[2]*10+a[3]<<"="<<final[1]<<endl;
            //case3
            if(f(flag,flag1[2]))    cout<<a[0]*100+a[1]*10+a[2]<<"*"<<a[3]<<"="<<final[2]<<endl;
        }
        return 0;
    }

    思想并不复杂,就是从1000到9999,把每个数拆分成四位存到一个数组里, 然后考虑每个数,对每一种分解情况考虑两个因子的组成是不是和原数一样,是就输出。
    主要是要注意构造好存放每一位的标志数组flag和flag1,因为这两个数组没构造好,导致我浪费了一个小时调试,TNND。

    tz@COI HZAU

    2018/3/14

  • 相关阅读:
    zTree学习笔记之展开树和收起树
    添优--史上超级全面的前端面试题大集合
    springboot2.0整合jpa
    Idea快捷键
    实用工具收藏
    nginx
    SQLServer锁的机制
    centos安装jenkins
    java8
    前端开发收藏
  • 原文地址:https://www.cnblogs.com/acm-icpcer/p/8569706.html
Copyright © 2011-2022 走看看