user-0 提问: 第五届在线编程大赛月赛第一题：完全平方数的个数，一直错。。。求解

回复:
user: user-1
content: low == sqrtLow * sqrtLow   貌似有问题，你再测测

user: user-2
content: #include <stdio.h> #include <math.h>  int countnum(int a, int b);  int main (){ 	//int count=0; 	int start, end; 	printf("Enter the start and end number->"); 	scanf("%i,%i",&start,&end); 	printf("The total count between %i and %i is %i",start, end, countnum(start, end)); } int countnum(int a, int b){ 	int i; 	int n; 	int count=0; 	for (i=a;i<b+1;i++){ 		n=sqrt(a); 		if (n*n==a) count++; 		printf("n=%i, a=%i \n",n,a); 		a++; 	} 	return count; }

user: user-0
content: 引用 3 楼 slx_391987 的回复:这个题目不用循环，时间复杂度为O(1)即可解决。  1、判断下A,B 是否是平方数 2、判断下( sqrt(A), sqrt(B) )之间有多少个数。 恩。的确是O（1）就可以了，我的代码也是O（1） 下限low，上限high 当时我想 [low, high] = [1, high] - [1, low) 所以只需要判断下限是否为平方数，然后取整相减加上标记就好了。  我回去又想了一下，其实不需要判断是否为平方数，直接开方以后上下取整相减加一即可

user: user-0
content: 引用 2 楼 user-7 的回复:我突然明白了，刚才没看懂楼主的代码。 没必要用long int吧，1<=A<=B<=2000000000，int够用了。 有没有return 0的要求？ sqrtHigh和sqrtLow直接定义成int会不会好一点？ long int 和 int 在VC下都表示的4个字节 而早期的编译器int只有2个字节的，所以这边我使用long int sqrtHigh和sqrtLow这两个在我这个方法中可以使用int 不过我原来是准备做上下取整然后相减加一的方法，所以定义为double

user: user-0
content: 引用 1 楼 user-7 的回复:楼主写的代码不符合需求啊。 比如输入3和10，3到10之间包含两个完全平方数4和9，所以结果是2 如果输入10和50，这里面有16、25、36、49，结果应该是4 这段代码 3，10结果就是2 10，50结果就是4

user: user-3
content: 浮点型可能损失精度 low == sqrtLow * sqrtLow这句可能有很少的机会相等  #include <stdio.h> #include <math.h> int main() { 	int a, b,num; 	double da, db; 	while (scanf("%d%d", &a, &b) == 2) 	{ 		da = sqrt((double)a); 		db = sqrt((double)b); 		num = (int)db - (int)da; 		if (da - (int)da == 0) 			num++; 		if (db - (int)db == 0) 			num++; 		if (a == b&&da - (int)da == 0) 		{ 			num = 1; 		} 		printf("%d\n", num); 	} 	return 0; }

user: user-4
content: #include<stdio.h> #include<math.h>   int main() { 	int A,B,low,high; 	 	A = 3; 	B = 100; 	 	low = (int)sqrt(A ); 	if( A != low * low ) 	{ 		low += 1; 	} 	 	high = (int)sqrt(B ); 	 	printf("满足要求的数字有%d\n",(high - low +1 ) ); 	     return 0; }

user: user-5
content: 拿你的题目练习一下  #include <stdio.h> #include <math.h>  int main(void) { 	long int low; 	long int high; 	int sqrt_low; 	int sqrt_high;  	while (scanf("%ld %ld", &low, &high) == 2) 	{ 		sqrt_low = (int)sqrt(low); 		sqrt_high = (int)sqrt(high); 		if (low == sqrt_low * sqrt_low) 		{ 			--sqrt_low; 		} 		 		printf("%d\n", sqrt_high - sqrt_low); 	}  	return 0; }

user: user-6
content: #include <stdio.h> #include <math.h>  int main(int argc, char* argv[]) { 	//B要求大于A 	int A = 1; 	int B = 100; 	int a = (int)sqrt(A); 	int b = (int)sqrt(B); 	int isASquare = 0;  //标记A是否是完全平方数 	int isBSquare = 0;  //标记B是否是完全平方数 	int count = 0; 	 	//如果A是平方数 	if (A == a*a) 	{ 		count++; 		isASquare = 1; 	} 	//如果B是平方数 	if (B == b*b) 	{ 		count++; 		isBSquare = 1; 	}  	if (A==B) 	{ 		if (1 == isASquare) 		{ 			count = 1; 		} 		else 		{ 			count = 0; 		} 	} 	else 	{ 		//下面两行代码，相当于取(a, b)(注意是开区间)之间的数 		a = a + 1;  //a要向上取整，所以a需要+1； 		b = b - 1*isBSquare; //b向下取整 		 		//计算A的平方根与B的平方根之间有多少个数字 		count += (b-a+1); 	}  	printf("count = %d \n", count);  	return 0; }   楼主验证下代码是否可行，如果不行，我明天再修改下。

user: user-6
content: 这个题目不用循环，时间复杂度为O(1)即可解决。  1、判断下A,B 是否是平方数 2、判断下( sqrt(A), sqrt(B) )之间有多少个数。

user: user-7
content: 我突然明白了，刚才没看懂楼主的代码。 没必要用long int吧，1<=A<=B<=2000000000，int够用了。 有没有return 0的要求？ sqrtHigh和sqrtLow直接定义成int会不会好一点？

user: user-7
content: 楼主写的代码不符合需求啊。 比如输入3和10，3到10之间包含两个完全平方数4和9，所以结果是2 如果输入10和50，这里面有16、25、36、49，结果应该是4