• 2017蓝桥杯算式900(C++C组)


    题目:算式900

    小明的作业本上有道思考题:

      看下面的算式:

      (□□□□-□□□□)*□□=900


      其中的小方块代表0~9的数字,这10个方块刚好包含了0~9中的所有数字。
      注意:0不能作为某个数字的首位。


    小明经过几天的努力,终于做出了答案!如下:
    (5012-4987)*36=900


    用计算机搜索后,发现还有另外一个解,本题的任务就是:请你算出这另外的一个解。


    注意:提交的格式需要与示例严格一致;
          括号及运算符号不要用中文输入法;
          整个算式中不能包含空格。


    注意:机器评卷,不要填写任何多余的内容,比如说明文字。


    解析:读完本题后,我们大概有了自己的想法,每个人都有自己解决的办法,不必拘于一种做法,在这里,我分享一下我的解法。首先,根据题意,我们可以先计算出10到99内可以被900整除的所有正整数,然后利用双重for循环遍历1000到9999之间做出的差,并加以判断该差是否可以被900整除并且属于第一步结果所得集合中的元素,如果符合,则需判断最后一步:减数和被减数还有900除以差的商是否占满了0-9是个数字且无重复(在这里,本人亲自写了一个算法,学识尚浅,欢迎指教)。


    代码:

    #include<iostream>
    #include<fstream>
    #include<string>


    using namespace std;


    #define SUB 100                                                                //10-99以内可以被900整除的数组的下标
    int A1,A2,A3,A4,B1,B2,B3,B4,C1,C2;                                //将减数被减数和900除以差的商的千百十个位数分离后的各个数
    int C[SUB] = {0};                                                                //10-99以内可以被900整除的数组
    int ABC[10];                                                                       //被分离后的各个数组成的集合(方便判断)


    void c_init();
    void abc_init();
    bool is_right(int data);                                                      //遍历能被900整除的数以判断是否满足is_right_temp函数
    bool is_right_temp(int m,int n,int data);                         //判断减数被减数和900除以差的商分离后的各个数字是否各不相同




    int main(int argc,char** argv){

    c_init();

    for(int i = 0;i < 13;i++){

    is_right(C[i]);
    }

    return 0;



    void c_init(){

    int order = 0;

    for(int i = 10;i < 100;i++){

    if(900 % i == 0){

    C[order] = i;
    order++;
    }
    }
    }


    void abc_init(){

    ABC[0] = A1;
    ABC[1] = A2;
    ABC[2] = A3;
    ABC[3] = A4;
    ABC[4] = B1;
    ABC[5] = B2;
    ABC[6] = B3;
    ABC[7] = B4;
    ABC[8] = C1;
    ABC[9] = C2;
    }


    bool is_right(int data){

    ofstream fout;
    fout.open("info.txt",ios::app);
    string space = "  ";

    for(int i = 1000;i < 10000;i++){

    for(int j = 1000;j < 10000;j++){

    if(i - j == 900 / data){

    if(is_right_temp(i,j,data)){

    fout << "(" << i << space << "-" << space << j << ")" << space << "*" << space << data << space << "="<< space << "900" << " ";
    }
    }
    }
    }

    fout.close();
    }


    bool is_right_temp(int a,int b,int c){

    int nums = 0;
    bool jud = false;

    while(a > 0){

    if(a / 10 >= 100){

    A4 = a % 10;

    }else if(a / 10 >= 10){

    A3 = a % 10;

    }else if(a / 10 >= 1){

    A2 = a % 10;

    }else{

    A1 = a;
    }

    a = a / 10;
    }

    while(b > 0){

    if(b / 10 >= 100){

    B4 = b % 10;

    }else if(b / 10 >= 10){

    B3 = b % 10;

    }else if(b / 10 >= 1){

    B2 = b % 10;

    }else{

    B1 = b;
    }

    b = b / 10;
    }

    while(c > 0){

    if(c / 10 >= 1){

    C2 = c % 10;

    }else{

    C1 = c;
    }

    c = c / 10;
    }

    abc_init();

    for(int i = 0;i < 10;i++){

    for(int j = 0;j < 10;j++){

    if(i == ABC[j]){

    jud = true;

    }
    }

    if(jud){

    nums++;
    jud = false;

    }

    }

    if(nums == 10){

    return true;

    }else{

    return false;
    }

    }

    输出结果(本题本人用到了文件流知识点,也可以使用控制台输出.)


  • 相关阅读:
    Day1.13 v-for中key属性的使用
    Day1.12 v-if、v-show
    Day1.11 v-for 四种使用方式
    Day1.10 属性绑定设置元素行类样式
    Day1.9 属性绑定设置元素class类样式
    Day1.7 v-model
    Day1.8 项目:计算器
    Day1.6 事件修饰符
    win7 忘记密码
    excel 单元格0 不显示的最佳方法
  • 原文地址:https://www.cnblogs.com/viplanyue/p/12700749.html
Copyright © 2020-2023  润新知