砝码称重

来源:互联网 发布:cf手游刷钻软件免费版 编辑:程序博客网 时间:2024/05/17 07:11

/*


5个砝码

用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量。
如果只有5个砝码,重量分别是1,3,9,27,81。则它们可以组合称出1到121之间任意整数重量(砝码允许放在左右两个盘中)。
本题目要求编程实现:对用户给定的重量,给出砝码组合方案。
例如:
用户输入:
5
程序输出:
9-3-1
用户输入:
19
程序输出:
27-9+1

要求程序输出的组合总是大数在前小数在后。
可以假设用户的输入的数字符合范围1~121。

*/

#include<iostream.h>

void main()
{
 int x;
    cin>>x;
 int y[5];
 int e[]={0,1,-1};
 int d[]={0,3,-3};
 int c[]={0,9,-9};
 int b[]={0,27,-27};
 int a[]={0,81,-81};
 for(int i=0;i<3;i++)
  for(int j=0;j<3;j++)
   for(int k=0;k<3;k++)
    for(int m=0;m<3;m++)
     for(int n=0;n<3;n++)
       if(a[i]+b[j]+c[k]+d[m]+e[n]==x)
       {
        
       // cout<<a[i]<<b[j]<<c[k]<<d[m]<<e[n]<<endl;

        y[0]=a[i];
        y[1]=b[j];
        y[2]=c[k];
        y[3]=d[m];
        y[4]=e[n];
       }
       for(i=0;i<5;i++)
       {
        if(y[i]!=0)
        {
         cout<<y[i];
         for(int j=i+1;j<5;j++)
         {
          if(y[j]>0)
           cout<<"+"<<y[j];
          else if(y[j]<0) cout<<y[j];
         }
         break;
        }
       }


}

/*
#include<stdio.h>
void main()

 int len=0,a[10]={0},j;
 char op[10];
 int t,k,m,input,i;
 for(j=1;j<100;j++) 
 { 
  input=j;
  m=j;
  len=0; 
  t=1;
  while(input)
  { 
   k=input%3; 
   input/=3;
   //关键是这里的两步 
   switch(k) 
   { 
   case 0:break; 
   case 1:
    a[len]=t;
    op[len++]='+';
    break; 
   case 2:
    a[len]=t;
    op[len++]='-';
    input++;
    break; 
   }
   t*=3;
  }

  printf("%d=%d",m,a[len-1]); 
  for(i=len-2;i>=0;i--) 
   printf("%c%d",op[i],a[i]);
  printf("\n");
 }

*/