一维前缀和——UVA11461 Square Numbers

 

A - Square Numbers 

A square number is an integer number whose square root is also an integer. For example 1, 4, 81 are some square numbers. Given two numbers a and b you will have to find out how many square numbers are there between a and b (inclusive).
Input
The input file contains at most 201 lines of inputs. Each line contains two integers a and b (0 < a ≤ b ≤ 100000). Input is terminated by a line containing two zeroes. This line should not be processed.
Output
For each line of input produce one line of output. This line contains an integer which denotes how many square numbers are there between a and b (inclusive).
Sample Input
1 4
1 10
0 0
Sample Output
2
3
 

一维前缀和:

a[1],a[2],a[3],......a[n] 

s[i]=a[1]+a[2]+a[3]+...a[n],s[0]=0;

a[j]+a[j+1]+....a[k]=s[k]-s[j-1]

#include
#include
#include
#include
using namespace std;
const int maxn=100100;
int s[maxn];
int main()
{
	memset(s,0,sizeof(s));
	for(int i=1,j=1;i<=maxn;i++)
	if(i==j*j)
	{
		s[i]=s[i-1]+1;             //此处前缀和的对象定义为平方数的个数,也是依赖前一项前缀和推来 
		                        //例如定义a数组存放是否为平方数,是为1,则a[10]为1,0,0,1,0,0,0,0,1,0
								//定义s为前缀和数组,s[10]为1,0,0,2,0,0,0,0,3,0      而此处直接使用前缀和即可,不必涉及a数组 (助理解) 
		j++;
	}
	else
	{
		s[i]=s[i-1];
	}
	
	int a,b;
	while(~scanf("%d%d",&a,&b)&&(a||b))//   此处需考虑完整,例如a=0,b=1符合(不应写成a>>0&&b>>0) 
	{
	  printf("%d\n",s[b]-s[a-1]);
	}
	return 0;
}

 

你可能感兴趣的:(前缀和,差分)