五个整数任意组合(加减)得到1~122之间的数

2024-08-30 01:58

本文主要是介绍五个整数任意组合(加减)得到1~122之间的数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

/问题描述
/*
给定五个整数1,3,9,27,81,这个五个整数可以任意组合进行加减(可以是五个数中的部分相加),这五个数组合进行加减可以得到1~122之间的数, 任意输入1~122之间的一个整数,得到其相应的组合,并且按照由大到小的顺序输出其表达式


    示例输入输出


    输入:5


    输出:9-3-1
*/



之前写过一个华为上机题,五个数字相加任意组合成1~122之间的数,这几天看到了,感觉当时写的方法太挫了,居然是利用多层循环,那如果有更多数,或者数字个数不确定,那不就没辙了。

利用循环实现:

对于这个数字任意组合,很容易想到的就是排列组合(输出n个数字的所有排列)。类似,就可以用回溯的方法来实现。这里回溯其实也就是直接搜索,执行过程与利用多层循环实质相同,但对于解决问题比多层循环的挫办法要实用得多。

代码与求n个数字的排列类似,也是到达最里面一层判断是否满足条件,否则返回上一层,并更改这一层的状态,继续往下一层走。

 

[cpp] view plain copy
  1. #include <iostream>  
  2.   
  3. using namespace std;  
  4. int weights[5] = {81,27,9,3,1};  
  5.   
  6.   
  7. void combine(int n, int sign[], int value)  
  8. {  
  9.     if (n == 5)  
  10.     {  
  11.         int sum = 0;  
  12.         for (int i = 0; i < 5; i++)  
  13.         {  
  14.             int tmp = weights[i]*sign[i];  
  15.             sum += tmp;  
  16.         }  
  17.           
  18.         if (sum == value)  
  19.         {  
  20.             //输出  
  21.             bool flag = false;  
  22.             for (int j = 0; j < 5; j++)  
  23.             {  
  24.                 if (sign[j] != 0)  
  25.                 {  
  26.   
  27.                     if (sign[j] == 1)  
  28.                     {  
  29.                         if (flag)  
  30.                         {  
  31.                             cout << "+";  
  32.                         }  
  33.                         cout << weights[j];  
  34.                     }  
  35.                     else if (sign[j] == -1)  
  36.                     {  
  37.                         cout << "-" << weights[j];  
  38.                     }  
  39.                                       
  40.                     flag = true;  
  41.                 }  
  42.   
  43.             }  
  44.             cout << endl;  
  45.         }  
  46.     }  
  47.     else  
  48.     {  
  49.         sign[n] = 0; combine(n+1, sign, value);  
  50.         sign[n] = 1; combine(n+1, sign, value);  
  51.         sign[n] = -1; combine(n+1, sign, value);  
  52.           
  53.     }  
  54.       
  55. }  
  56.   
  57.   
  58.   
  59. int main()  
  60. {  
  61.     int Value;  
  62.     int sign[5];   
  63.     while(cin>>Value)  
  64.     {  
  65.         combine(0, sign, Value);  
  66.     }  
  67.       
  68.       
  69.     return 0;  
  70. }  

当输入的数不再是5个二是任意个数时该怎么解决(留个小问题)??

这篇关于五个整数任意组合(加减)得到1~122之间的数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1119477

相关文章

hdu4869(逆元+求组合数)

//输入n,m,n表示翻牌的次数,m表示牌的数目,求经过n次操作后共有几种状态#include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdlib.h>#includ

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

day-51 合并零之间的节点

思路 直接遍历链表即可,遇到val=0跳过,val非零则加在一起,最后返回即可 解题过程 返回链表可以有头结点,方便插入,返回head.next Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*

PTA求一批整数中出现最多的个位数字

作者 徐镜春 单位 浙江大学 给定一批整数,分析每个整数的每一位数字,求出现次数最多的个位数字。例如给定3个整数1234、2345、3456,其中出现最多次数的数字是3和4,均出现了3次。 输入格式: 输入在第1行中给出正整数N(≤1000),在第二行中给出N个不超过整型范围的非负整数,数字间以空格分隔。 输出格式: 在一行中按格式“M: n1 n2 ...”输出,其中M是最大次数,n

整数Hash散列总结

方法:    step1  :线性探测  step2 散列   当 h(k)位置已经存储有元素的时候,依次探查(h(k)+i) mod S, i=1,2,3…,直到找到空的存储单元为止。其中,S为 数组长度。 HDU 1496   a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 。 x在 [-100,100] 解的个数  const int MaxN = 3000

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

linux中使用rust语言在不同进程之间通信

第一种:使用mmap映射相同文件 fn main() {let pid = std::process::id();println!(

O(n)时间内对[0..n^-1]之间的n个数排序

题目 如何在O(n)时间内,对0到n^2-1之间的n个整数进行排序 思路 把整数转换为n进制再排序,每个数有两位,每位的取值范围是[0..n-1],再进行基数排序 代码 #include <iostream>#include <cmath>using namespace std;int n, radix, length_A, digit = 2;void Print(int *A,

Go组合

摘要 golang并非完全面向对象的程序语言,为了实现面向对象的继承这一神奇的功能,golang允许struct间使用匿名引入的方式实现对象属性方法的组合 组合使用注意项 使用匿名引入的方式来组合其他struct 默认优先调用外层方法 可以指定匿名struct以调用内层方法 代码 package mainimport ("fmt")type People struct{}type Pe

16 子组件和父组件之间传值

划重点 子组件 / 父组件 定义组件中:props 的使用组件中:data 的使用(有 return 返回值) ; 区别:Vue中的data (没有返回值);组件方法中 emit 的使用:emit:英文原意是:触发、发射 的意思components :直接在Vue的方法中声明和绑定要使用的组件 小炒肉:温馨可口 <!DOCTYPE html><html lang="en"><head><