首页
社区
课程
招聘
一道数学题求公式
发表于: 2010-4-25 12:20 4133

一道数学题求公式

2010-4-25 12:20
4133
要x可以无限增加 每加一次 鼠标点按照图中轨迹行走,找了好多大学同学都没有做出公式来,以前碰到过这个公式后来没用就忘记了,怎么找也找不到了,希望各位帮帮忙,帮我列出公式

[课程]Linux pwn 探索篇!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 424
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
具体数学书上有
第三章习题40
公式略微复杂恩
2010-4-25 12:34
0
雪    币: 237
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
可以帮忙列出来么。。。。  找不到在哪。。。。
2010-4-25 12:54
0
雪    币: 458
活跃值: (421)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
4
写了个C++类,完成你的功能了
代码很烂很烂

typedef enum
{
	_RIGHT,
	_DOWN,
	_LEFT,
	_UP
}JUST_DIR;


class CJustMath  
{
public:
	CJustMath(int x, int y, int step);
	void GetPosition(int &x, int &y);
	void mov();
	virtual ~CJustMath();
private:
	int m_x;
	int m_y;
	int m_step;
	int m_times;
	int m_Remember;
	JUST_DIR m_Dir;
};

CJustMath::CJustMath(int x, int y, int step)
{
	m_Dir = _RIGHT;
	m_x = x;
	m_y = y;
	m_step = step;
	m_times = 0;
	m_Remember = 0;
}

CJustMath::~CJustMath()
{
	
}

void CJustMath::GetPosition(int &x, int &y)
{
	x = m_x;
	y = m_y;
}

void CJustMath::mov()
{
	switch(m_Dir)
	{
	case _RIGHT:
		if (m_Remember == 0)
			m_times++;
		while (m_Remember<m_times)
		{
			m_x += m_step;
			m_Remember++;
			return ;
		}
		m_Remember = 0;
		m_Dir = _DOWN;
	case _DOWN:
		while (m_Remember<m_times)
		{
			m_y += m_step;
			m_Remember++;
			return ;
		}
		m_Remember = 0;
		m_Dir = _LEFT;
	case _LEFT:
		if (m_Remember == 0)
			m_times++;
		while (m_Remember<m_times)
		{
			m_x -= m_step;
			m_Remember++;
			return ;
		}
		m_Remember = 0;
		m_Dir = _UP;
	case _UP:
		while (m_Remember<m_times)
		{
			m_y -= m_step;
			m_Remember++;
			return ; 
		}
		m_Remember = 0;	
		m_Dir = _RIGHT;
		mov();
	}
}

#include "stdafx.h"
#include "JustMath.h"

int main(int argc, char* argv[])
{
	int x = 0;
	int y = 0;
	CJustMath justmath(33, 21, 1);
	for (int i=0; i<13; i++)
	{
		justmath.GetPosition(x, y);
		printf("(%d,%d)\r\n", x, y);
                justmath.mov();
	}
	return 0;
}
上传的附件:
2010-4-25 21:07
0
雪    币: 424
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
5
ls的对复杂度没什么概念么= =

公式是根据x直接算出对应的坐标,而且x可以非常大......
2010-4-25 21:15
0
雪    币: 517
活跃值: (35)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
6
呵呵,不就是数列的通项公式么?搞得这么复杂。
2010-4-26 10:48
0
雪    币: 401
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
边长是这样的:11223344556677...............
不用循环,直接根据X算出来:
#include <stdio.h>
#include <math.h>

int main(int argc,char *argv[])
{
	int x = 33;			//0点的坐标
	int y = 21;

	int order;			//次序
	int n = 0;			//向下取整后的平方根
	int m = 0;			//对n取平方

	printf("Enter a order:");
	scanf("%d",&order);
	n = (int)sqrt((double)order);
	if(n%2)					//只需要偶数
	{
		n--;
	}

	m = n*n;				//从这一点开始计算
	x = x - n/2;				//开始点的坐标
	y = y + n/2;


	if( (order <= m+n) )				//第一条边
	{
		x = x;
		y = y - (order - m);
	}
	else if(order <= (m+n)+n+1)			//第二条边
	{
		x = x + (order - (m+n));
		y = y - n;
	}
	else if(order <= (m+n+n+1)+n+1)			//第三条边
	{
		x = x + (n+1);
		y = (y - n) + (order - (m+n+n+1));
	}
	else if(order < (m+n+n+1+n+1)+n+2)		//第四条边
	{
		x = x + (n+1) - (order-(m+n+n+1+n+1));
		y = y + 1;
	}
	printf("(%d,%d)\n",x,y);



	return 0;
}
2010-4-26 11:37
0
雪    币: 237
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
好像随便带入一个数就不对吧。。。 你自己带入一个小一点的数,根据你的那个就不对,
2010-4-26 13:28
0
雪    币: 401
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
在我这里怎么是对的?我从0开始到34每一条边上的点我都试了一下,都没问题啊。哪个数字错了你给说一下,我调一下看看。
2010-4-26 13:44
0
雪    币: 424
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
10
公式基本上就是xiilin找到的这样:)
你只需要写成数学式即可。 而且比较复杂所以出现一点小数据错误是很容易的,一定要小心哦:)
2010-4-26 19:38
0
雪    币: 237
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
下午看错了,刚才验证了下的确正确,虽然没有公式但是在程序中制作出来一样…………(本来就是要写到程序中么),给分结贴
2010-4-26 20:12
0
游客
登录 | 注册 方可回帖
返回
//