Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

前N个自然数的3到9次方打表,也就700多个int,再2分查找感觉会效率高一些

Posted by Eov_Second at 2016-12-01 22:46:20 on Problem 3100
可惜测试数据不给力,体现不出来。

#include <stdio.h>
#include <math.h>

#define UB 1000000
int mp[7][110]; // mp[X][0]作为此行有效数据个数

int bfind(int*p, int n)
{
	int l, r, m;
	l = 1; r = p[0];
	while (l <= r)
	{
		m = (l + r) / 2;
		if (p[m] == n) return m;
		else if (n > p[m])
		{
			l = m + 1;
			if (l > p[0]) return m;
			if(n < p[l])
			{
				if(p[l] + p[m] > n*2)
					return m;
				else
					return l;
			}
		}
		else
		{
			r = m -1;
			if(0==r) return m;
			if(n > p[r])
			{
				if(n*2 > p[m] + p[r])
					return m;
				else
					return r;
			}
		}
	}
	return 0;
}

int main()
{
	int i,j,k,a,b,n;
	int *p = mp[0],*q;
// 先构造3次方的初始行
	for (i = 1; i < 101; i++)
		p[i] = i * i * i;
	p[0] = 100;
// 表的后续行由之前行构造
	for (j = 1; j < 7; j++)
	{
		p = mp[j];
		q = mp[j - 1];
		for (i = 1; i < 33; i++)
		{
			k = q[i] * i;
// 只计算到大于100w就够了,p[0]记录数组里数据个数
			if (k > UB){ p[0] = i ; p[i]=k;break; }
			p[i] = k;
		}
	}
	while (1){
		scanf("%d %d", &b, &n);
		if (0 == b && 0 == n)break;
		if (1 == n || 1 == b)a = b;
// 2次用开方计算,2次以上再查表
		else if (2 == n)
		{
			double r = sqrt((double)b);
			i = r;
			k = i * i;
			a = k + 2 * i + 1;
			if (2*b < a + k) a = i;
			else a = i + 1;
		}
		else
		{
			p = mp[n - 3];
			a = bfind(p, b);
		}
		printf("%d\n", a);
	}
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator