题目1:输出1-999999之间的完全平方数
程序一
#include <stdio.h>
#define MAX 999999
int main()
{
int i=1;
long int square=1;
while (square <= MAX)
{
printf("%ld/t",square);
i++;
square = (i*i);
}
printf("/n");
return 0;
}
程序二
#include <stdio.h>
#define MAX 999999
int main()
{
int i=1;
long int square=1;
while (square <= MAX)
{
printf("%ld/t",square);
square+=(i+=2);
}
printf("/n");
return 0;
}
=========================
题目2:一个小于999999整数,它加上100后是一个完全平方数,再加上268又是一个完全平方数,请问该数是多少?
程序一
#include <stdio.h>
#include <math.h>
int main()
{
long x=-100;
while(x <=999999)
{
long double i=sqrt(x+100);
long double j=sqrt(x+268);
if((long)i==i&&(long)j==j) printf("%ld/t",x);
x++;
}
return 0;
}
程序二
#include <stdio.h>
#include <math.h>
/*算法分析:m^2=x+268
n^2=x+100
两式相减得(m+n)*(m-n)=168
以此为条件判断
*/
int main()
{
long int x=0;
for(long int m=1;m <=3200;m++) //sqrt(999999) <=3200
{
for(long int n=1;n <=3200;n++)
{
x=n*n-100;
if((m+n)*(m-n)==168)
printf("%ld/t",x);
}
}
return 0;
}
===============
判断一个数是否是完全平方数 n^2=1+3+......+(2n-1)
int yysquare(int x)
{
int i = 1;
for(;n>0;i+=2) n-=i;
if(0!=n)return -1;
return 0;
}
因为计算机在内部存储数据的时候一个很小的数字也会当成0来处理,所以用开方后是不是整数这一条件来判断会不会出什么问题?浮点数记录的是近似值,所以使用sqrt函数得到的可能不是真值,这样有没有可能导致程序出现类似情况:
执行程序有 sqrt(i+100)*sqrt(i+100)==i+100;
但其实i+100开方后的真值与sqrt(i+100)并不相等,从而导致出现误判。