历届试题 趣味算式填符号

来源:互联网 发布:mysql默认配置文件 编辑:程序博客网 时间:2024/05/17 04:12


    匪警请拨110,即使手机欠费也可拨通!


    为了保障社会秩序,保护人民群众生命财产安全,警察叔叔需要与罪犯斗智斗勇,因而需要经常性地进行体力训练和智力训练!


    某批警察叔叔正在进行智力训练:


    1 2 3 4 5 6 7 8 9 = 110;


    请看上边的算式,为了使等式成立,需要在数字间填入加号或者减号(可以不填,但不能填入其它符号)。之间没有填入符号的数字组合成一个数,例如:12+34+56+7-8+9 就是一种合格的填法;123+4+5+67-89 是另一个可能的答案。


    请你利用计算机的优势,帮助警察叔叔快速找到所有答案。


    每个答案占一行。形如:


12+34+56+7-8+9
123+4+5+67-89
......


    已知的两个答案可以输出,但不计分。
    
    各个答案的前后顺序不重要。


   注意:


    请仔细调试!您的程序只有能运行出正确结果的时候才有机会得分!
    
    请把所有类写在同一个文件中,调试好后,存入与【考生文件夹】下对应题号的“解答.txt”中即可。
    
    相关的工程文件不要拷入。
    
    请不要使用package语句。
    

    源程序中只能出现JDK1.5中允许的语法或调用。不能使用1.6或更高版本。


思路:

准备用递归的,但条件没控制好,改换成用循环穷举了,将运算符作为枚举对象,用1 2 3 分别表示空格,+,-,

代码:

#include<iostream>#include<algorithm>using namespace std;int main(){int i,j,c=0,k=0;int a[9]={1,2,3,4,5,6,7,8,9};int s[8],t[9]={0},sum=0;for (s[0]=1; s[0]<=3; s[0]++){for (s[1]=1; s[1]<=3; s[1]++){for (s[2]=1; s[2]<=3; s[2]++){for (s[3]=1; s[3]<=3; s[3]++){for (s[4]=1; s[4]<=3; s[4]++){for (s[5]=1; s[5]<=3; s[5]++){for (s[6]=1; s[6]<=3; s[6]++){for (s[7]=1; s[7]<=3; s[7]++){//s[0]=1;s[1]=1;s[2]=2;s[3]=2;s[4]=2;s[5]=1;s[6]=3;s[7]=1;k=0;c=0;sum=0;    t[k]=a[c];   for (i=0; i<=7; i++)    {    switch(s[i])    {    case 1:    t[k]=t[k]*10+a[++c];    break;    case 2:    t[++k]=a[++c];    break;    case 3:    t[++k]=a[++c];    break;}}c=0;sum=t[c];for (i=0;i<=7;i++){switch(s[i]){case 2:sum+=t[++c];break;case 3:sum-=t[++c];break;}}if (sum==110){j=0;for (i=0; i<=k; i++){cout<<t[i];for (; j<=7;j++){if (s[j]==2){cout<<"+";j++;  break;}if (s[j]==3){cout<<"-";j++;break;}}}cout<<endl;}}}}}}}}}return 0;}



1 0