• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
james1207

博客园    首页    新随笔    联系   管理    订阅  订阅

数学题还是计算机题啊

这道题是从http://blog.csdn.net/fmddlmyy/article/details/7234119#plain看来的。伐木丁丁鸟鸣嘤嘤

 

伐木丁丁鸟鸣嘤嘤

 

1. 缘起

岳父大人拿来一张去年的报纸,说有一道很难做的益智题,让我看看,就是下图中的题目:

如果这是一道正常的益智题,岳父大人既然做不出来,我是肯定做不出来的。不过看过题目后,我觉得这个题目就是一个典型的编程作业。把编程作业当作益智题,显然是个恶作剧了。下面简单介绍一下如何编程求解这道题目。

 

2. 我的解法

这题可以表述如下(因为第一步肯定是2011+7=2018,最后一步肯定是2017-5=2012):

已知x0 = 2018, x1=2017,

f1(x)= (x/2)+7;

f2(x)= (x+7)/2;

f3(x)= (x*3)-5;

f4(x)= (x-5)*3;

并且fa1fa2…fan(x0)= x1,

a1,a2,…,an属于集合{1,2,3,4}。

求a1,a2,…,an.
用程序暴力解法如下:
// Math2012.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <vector>
#include <set>
#include <windows.h>
using namespace std;

int f1(int even)
{
	int ret = even / 2 + 7;
	return ret;
}
int f2(int odd)
{
	int ret = (odd + 7) / 2;
	return ret;
}
int f3(int input)
{
	int ret = (input - 5) * 3;
	return ret;
}
int f4(int input)
{
	int ret = input * 3 - 5;
	return ret;
}

int _tmain(int argc, _TCHAR* argv[])
{
	int initial = 2018;
	int destine = 2017;//2017 674 1334 2661 892 299 584 1154 2301 772 1530 515 1016
	std::set<int> seed_array;
	std::set<int> seed_array_copy;
	std::set<int>::iterator it;
	seed_array.insert(initial);
	bool success = false;
	while (true)
	{
		Sleep(50);
		printf("seed_array:\n");
		for (it = seed_array.begin(); it != seed_array.end(); ++it)
		{
			int temp = *it;
			printf("%d\t", temp);
			if (temp % 2 == 0)
			{
				int ret1 = f1(temp);
				seed_array_copy.insert(ret1);
				if (ret1 == destine)
				{
					success = true;
					printf("success.\n");
					break;
				}
			}
			else
			{
				int ret2 = f2(temp);
				seed_array_copy.insert(ret2);
				if (ret2 == destine)
				{
					success = true;
					printf("success.\n");
					break;
				}
			}
			int ret3 = f3(temp);
			seed_array_copy.insert(ret3);
			if (ret3 == destine)
			{
				success = true;
				printf("success.\n");
				break;
			}
			int ret4 = f4(temp);
			seed_array_copy.insert(ret4);
			if (ret4 == destine)
			{
				success = true;
				printf("success.\n");
				break;
			}
		}
		seed_array = seed_array_copy;
		seed_array_copy = std::set<int>();   
		printf("\n");
		if (success)
		{
			break;
		}
	}

	return 0;
}

程序是一目了然的,就是最笨的穷举法。这个程序要执行好几遍,第一遍把destine = 2017, 然后就会输出下一个destine = 674, 以此类推,destine = 2017 674 1334 2661 892 299 584 1154 2301 772 1530 515 1016。见下图:



3.结束

有点无聊的题,不知道谁想出来的。

 

 

posted @ 2013-10-10 21:38  Class Xman  阅读(220)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3