数组数字加减乘得24问题

问题描述:

1个程度为n(1<=n<=10000)的一维数组A,A[i]=i(1<=i<=n)。每次运算操作中,我们先删除该数组任意2个元素a和b,将这2个元素做加,减或乘(a+b,a-b,a*b)运算后会得到1个整数,再将该整数放进数组。如此进行n-1次运算操作后,数组将仅剩1个元素。问任意给定的n,有没有可能存在这样的运算操作序列使得数组A最后得到的数字为24?不存在,输出“NO”,存在,输出“YES”,并输出一种可行的运算序列。

分析:

这个问题乍一看感觉有点懵,因为每次选择都是随机选择两个数,用暴力解法的话,空间很大。

如果我们按照常规的思路:考虑第一次选哪两个数,第二次选哪两个数,...依次执行n-1次,最后得到一个数。沿着这个思路最后只能用暴力搜索答案,空间太大,不可行。

如果你仔细思考可能会发现这个问题有一个限制行极强的条件:A[i]=i。这就是说数组内容是从1到n的连续整数,不是任意的随机数字。跳出常规的思路,这道题有没有什么规律,可不可以用数论的知识解决?聪明的你也许会发现:

如果f(k)=24,则 f(K+2) = f(k)*((k+2)-(k+1))=24;
!!  发现了吗

如果f(k)=24 ,则f(k+2x) 都可以等于24。(x = 1,2,3....)

我们很自然的想到了归纳法,所以我们需要找到前面的可以得出24的那个k。

f(4) = (1+2+3)*4 = 24   ,所以,所有大于4的偶数也都可以得到24;

f(5) = (5-2)*(1+3+4) = 24 , 所以,所有大于5的奇数都可以得到24;

从而大于等于4的n都可以得到24.

很明显的,n等于1,2,3时无法得到24.所以全域的解就得到了。

所以,有的时候,我们容易被一些已有的思维模式所束缚,如果能跳出常规的思维模式看问题,也许会得到意想不到的收获!

代码:

<span style="font-size:14px;">#include <iostream>

void Game24(int [] A, int n)
{
	using namespace std;
	if(n >= 4){
		cout << "YES"<<endl;
		if(n%2==0)
		{
			cout << "1+2 =3"<<endl;
			cout << "3+3 =6"<<endl;
			cout << "6*4 = 24"<<endl;

			while(int i = 4; i<=n-2; i++)
			{
				cout << i+2 << "-" << i+1<< "=" << 1 << endl;
				cout << "24*1 =24"<<endl;
			}
		}
		else
		{
			cout << "5-2 =3"<<endl;
			cout << "1+3 =4"<<endl;
			cout << "4+4 = 8"<<endl;
			cout << "3*8 =24"<<endl;

			while(int i = 5; i<=n-2; i++)
			{
				cout << i+2 << "-" << i+1<< "=" << 1 << endl;
				cout << "24*1 =24"<<endl;
			}
		}
	}
	else
		cout << "NO" <<endl;

	return ;
}</span>
时间: 2024-11-08 23:36:10

数组数字加减乘得24问题的相关文章

自定义数字加减控件

1_自定义数字加减控件的要求 创建Module -NumberAddSubView A_输入的只能是数字,而且不能通过键盘输入 B_通过加减按钮操作数字 C_监听加减按钮 D_数组有最小值和最大值的限制 E_自定义属性 2.提供接口,让外界监听到数字的变化 1_设置接口 @Override public void onClick(View v) { if (v.getId() == R.id.btn_sub) { //Toast.makeText(mContext,"减",Toast.

小巧实用的数字加减插件(jquery插件)

自己的第一个jquery插件,规模虽然不大,但是小成就满满,对jquery又有了更进一步的认识. 简单实用的数字加减插件,实现通过加减按钮对文本框内的数字进行增减操作. 效果图: 参数: 默认值.最大值.最小值.增减度. 可单独对每个input设置参数,也可以对所有input统一设置.参考代码在下方: 使用方法: 1.引用css.js文件(记得引用jquery.min.js) 2.前台: 2.1无参数 <input type="text" class="numberTe

jQuery实现购物车数字加减效果

效果图: jQuery实现购物车数字加减效果,方法本简单. 经常会写到购物车这块,而购物车很多就有加减这个效果(可以将HTML代码复制多个,同时支持),小小的总结了一下,代码如下: HTML: <div class="gw_num"> <em class="jian">-</em> <input type="text" value="1" class="num"/&

jQuery数字加减插件

我们在网上购物提交订单时,在网页上一般会有一个选择数量的控件,要求买家选择购买商品的件数,开发者会把该控件做成可以通过点击实现加减等微调操作,当然也可以直接输入数字件数.本文将介绍常见的几种使用spinner数字微调器来实现数字加减的功能的方法. 左右加减数字 像京东提交订单时目前使用的是左右加减数字的效果,这个效果直接明了,操作简单.我们使用jquery.spinner.js插件实现左右加减数字,调用方法非常简单,请看演示示例1.   <input type="text" cl

微信小程序——购物车数字加减

上一篇,我们有讲到如何造一个购物车弹层.今天来说一下,购物车数量的加减如何实现. 主要思路就是在data里面定义一个属性,属性值就是这个数量.点击+的时候就+1,点击-的时候就-1,再结合setData更改这个数字.当数字等于1的时候,要给-的按钮添加一个disabled的属性. wxml代码: <view class='row item-center'> <button class="buy-num-btn btn-minus" disabled="{{m

数据结构 二维数组方阵加减乘

#include<stdio.h>int main(){ int A[200][200],B[200][200],sum[200][200]; int m,n,i,j,a,b; printf("请输入行数和列数:\n"); scanf("%d,%d",&m,&n); for(i=0;i<m;i++){  for(j=0;j<n;j++){   printf("请输入A的数值:\n");   scanf(&q

jQuery购物数量数字加减运算效果

<a href="###" id="add" value="+">+</a> <input type="text" id="num" value="3" /> <input type="button" id="jian" value="-" /> <script> $(

Appcan 自定义数字加减控件

DIV部分: *这里的三个ID:as_sub_3.as_now_3.as_add_3里面的“3”可以自定义,这个对于生成任意个数的列表形式很有帮助 <div class="ub ub-f1 ub-pe as-height"> <div id="as_sub_3" onclick="as_sub(this)" class="ub ub-pc ub-ac as-border"> <div class=

代码练习(二维数组的定义,字符串加减,子元素的创建及绑定,排序算法)

<!DOCTYPE> <html> <head> <meta charset="utf-8"> <title>IFE JavaScript Task 01</title> </head> <body> <ul id="source"> <li>北京空气质量:<b>90</b></li> <li>上海空