算式900蓝桥杯

21 篇文章 1 订阅
16 篇文章 2 订阅


标题:算式900


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

看下面的算式:

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

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

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

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

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

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

题目的解法:定义一个数组包含0-9这10个数字,满足(XXXX-XXXX)*XX==900,如果能够使得10个数字顺序变化轮换一遍即可解决此问题。

由此可以选择使用函数next_permutation

两个用来计算排列组合关系的算法,分别是next_permutation和prev_permutation。

首先我们必须了解什么是“下一个”排列组合,什么是“前一个”排列组合。

考虑三个字符所组成的序列{a,b,c}。

这个序列有六个可能的排列组合:abc,acb,bac,bca,cab,cba。这些排列组合根据less-than操作符做字典顺序的排序。

也就是说,abc名列第一,因为每一个元素都小于其后的元素。acb是次一个排列组合,因为它是固定了a(序列内最小元素)之后所做的新组合。

同样道理,那些固定b(序列中次小元素)而做的排列组合,在次序上将先于那些固定c而做的排列组合。以bac和bca为例,bac在bca之前,因为次序ac小于序列ca。面对bca,我们可以说其前一个排列组合是bac,而其后一个排列组合是cab。序列abc没有“前一个”排列组合,cba没有“后一个”排列组合。
next_permutation()会取得[first,last)所标示之序列的下一个排列组合,如果没有下一个排列组合,便返回false;否则返回true。

1、输出序列{1,2,3,4}字典序的全排列。

#include <iostream>
#include<algorithm>
using namespace std;
 
int main(int argc, char** argv) {
    int a[4]={1,2,3,4};
    sort(a,a+4);//(需要先有序排列)
    do{
        //cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<" "<<a[3]<<endl;
        for(int i=0;i<4;i++)
            cout<<a[i]<<" ";
        cout<<endl;
    }while(next_permutation(a,a+4));
    return 0;
}

 2、输入定义四个字符,字典序的全排列

#include <iostream>
#include<algorithm>
using namespace std;
 
int main(int argc, char** argv) {
    char a[4]={'A','B','C','D'};
    sort(a,a+4);
    do{
        //cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<" "<<a[3]<<endl;
        for(int i=0;i<4;i++)
            cout<<a[i]<<" ";
        cout<<endl;
    }while(next_permutation(a,a+4));
    return 0;
}

 3、输入任意一个字符串,输出其字典序的全排列

#include <iostream>
#include<algorithm>
using namespace std;
 
int main(int argc, char** argv) {
    string str;
    cin>>str;
    sort(str.begin(),str.end());
    do{
        cout<<str<<endl;
    }while(next_permutation(str.begin(),str.end()));
    return 0;
}

 3、能否直接算出集合{1, 2, ..., m}的第n个排列?
举例说明:如8个数的集合为{1, 2, 3, 4, 5, 6, 7,8},要求出第n=1234个排列。

n=1,第一个排列为12345678;

n=2,第二个排列为12345687;

#include <iostream>
#include<algorithm>
using namespace std;
 
int main(int argc, char** argv) {
    int a[8]={1,2,3,4,5,6,7,8};
    sort(a,a+8); 
    int n=0;
    do{
        if(n==1234){
            for(int i=0;i<8;i++)
              cout<<a[i];
            cout<<endl;
        break;
        }
        n++;
    }while(next_permutation(a,a+8));
    return 0;
}

n=1234,第1234个排列为13745826。

此题目用到next_permutation()全排列方法即可解决。

#include <iostream>
#include<algorithm>
using namespace std;
int main()
{
    int A,B,C,a[10]={0,1,2,3,4,5,6,7,8,9};
    //0-9是个数在不同位置,满足(XXXX-XXXX)*XX=900
    //(A-B)*C==900
    do{
        if(a[0]==0||a[4]==0||a[8]==0) continue;
        A = a[0]*1000+a[1]*100+a[2]*10+a[3];
        B = a[4]*1000+a[5]*100+a[6]*10+a[7];
        C = a[8]*10+a[9];
        if((A-B)*C==900)
        {
            printf("(%d-%d)*%d==900\n",A,B,C);
        }
    }while(next_permutation(a,a+10));

    return 0;

使用全排列的方法将原始数据进行了全部变量,满足条件的答案如图所示。 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值