用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量。
如果只有5个砝码,重量分别是1,3,9,27,81
则它们可以组合称出1到121之间任意整数重量(砝码允许放在左右两个盘中)。
本题目要求编程实现:对用户给定的重量,给出砝码组合方案。
例如:
用户输入:
5
程序输出:
9-3-1
用户输入:
19
程序输出:
27-9+1
要求程序输出的组合总是大数在前小数在后。
如果只有5个砝码,重量分别是1,3,9,27,81
则它们可以组合称出1到121之间任意整数重量(砝码允许放在左右两个盘中)。
本题目要求编程实现:对用户给定的重量,给出砝码组合方案。
例如:
用户输入:
5
程序输出:
9-3-1
用户输入:
19
程序输出:
27-9+1
要求程序输出的组合总是大数在前小数在后。
可以假设用户的输入的数字符合范围1~121。
刚开始说实话,本来想用爆搜,但是写着写着发现用爆搜来解本题,真是太蠢了;
解题思路:首先题目给的这5个砝码重量:1,3,9,27,81;就是解题的关键,他们都3 的阶乘得到的,如:3^0,3^1,3^2,3^3,3^4;那么如果把输入的n转成3进制,直接对应权值,来输出算式,这题就很简单了。当然变为3进制,如果余数为2,则变为-1,商+1;下面上代码:
#include<iostream>
using namespace std;
int main()
{
int n,j=4;
cin>>n;
int arr[5]={0};//最大的121转3进制 ,为11111,所有数组大小定为5
int s[5]={81,27,9,3,1};//砝码重
while(n)
{
if(n%3==2)//余数为2,改为-1,商+1,这样才能对应算式中的减号
{
arr[j--]=-1;
n=n/3+1;
}
else
{
arr[j--]=n%3;
n/=3;
}
}
for(int i=0;i<5;++i)
{
if(arr[i]!=0)
cout<<s[i]*arr[i]; //最后直接相乘结果输出
if(arr[i+1]==1)
cout<<'+';
}
return 0;
}
小白虫继续修炼中,希望大家以后多多关照