Johnson先将天上n个星星排成一排,起初它们都是暗的。。

他告诉他的妹子,他将挥动n次魔法棒,第i次挥动会将编号为i的正整数倍的星星的亮暗反转,即亮的星星转暗,暗的星星转亮。

Johnson想问Nancy,最终会有多少个星星依旧闪亮在天空。

确定求完全平方数:
首先,我们知道要找的数是他的因子个数只有奇数的。
而完全平方数的因子个数为奇数(记住,证明没啥可了解的)

如何求完全平方数
那么就是求范围在(1,x)的所有完全平方数的个数。
一般想到的思路是:

int count=0;
for(int i=1;i<=x;i++)
{    if(sqrt(x)被完全开方)
    { count++;   }
}

但我们知道,这样就需要double的格式,再判断sqrt有无小数。但这样的想法太简单粗暴了。

所以我们转换思路
从1开始遍历,判断条件是i*i<=x,这样就不存在是否能整除的问题。
也就是

for(int i=1;i*i<=x;i++){
    count++;
}

但还有一种更加简便的方法:
我们发现,i是一个个增加的,而循环结束的条件是ii=x,也就是从1-根号x的个数。这也就是根号x。*
最终,我们得到的代码为

cout<<sqrt(x)

这里有个不属于算法但属于acm的点,
因为x可能很大,所以应用

long long x;

代替

int x;

为验证,我们进行测试,取x=100000000000000000;
long long x 得到 316227766
int x 得到 46340