C语言代码随记—基础, 入门
这里会有一两个小基础知识点,代码不多,直接看:
/*
* Function:找出 0~limit 内所有完全平方数 x
* 该完全平方数 x 满足条件(x + * 100)开方后也是完全平方数,( x + 100 + 168) 后开方也是完全平方数”
*/
void perfectSquare(long int limit)
{
int quantity = 0;
long int i;
double sqrt268, sqrt100;
for (i = 21; i <= limit; i++)
{
sqrt268 = sqrt(i + 268);
sqrt100 = sqrt(i + 100);
if (sqrt268-(int)sqrt268 == 0 && sqrt100-(int)sqrt100 == 0)
{
quantity++;
/*
printf("NO.%d Perfect Square number is %ld\n", quantity, i);
*/
}
else
continue;
}
return ;
}
for (i = 21; i <= limit; i++)
/* i = (21,limit)是因为 0~21 内的数都不满足 上述所需条件↑ */
这里人工计算 i 的起始值在某些情况下是需要的。 比如 这个for循环内部有多个嵌套循环, 到那时候’21’可就不只是一个小的数字而已了。
if (sqrt268-(int)sqrt268 == 0 && sqrt100-(int)sqrt100 == 0)
这里的 (DOUBLE sqrt268 - INT sqrt268 == 0)用于判断 整数 。 这个条件大家应该很少用到。因为我们初学编程默认都是用的 int 类型。这里也顺便提问:
浮点数的大、小、相等 如何比较?
此外, 这里涉及到 显示(强制)转换 的问题。double 强制转换为 int 型,只是省略小数部分,不做 四舍五入 处理!!
最后说一下 double sqrt(double var), linux 下需要在编译的时候在命令行添加 “-lm”。具体可以在终端:
man sqrt
gcc filename.c -o f.out -lm
#如果上面命令是下面这样:
gcc -g filename.c -o f.out -lm;
#那么只有在‘-g’下的 gdb调试模式下才会执行sqrt函数,从而得到期望的结果(如果程序没问题的话)
#在这种情况下执行程序
./f.out
#是没有反应的
-lm选项告诉编译器,我们程序中用到的数学函数要到这个库文件里找。大部分库函数(例如printf)位于libc.so库文件中,使用libc.so中的库函数在编译时不需要加-lc选项,因为这是gcc的默认选项
“纸上得来终觉浅,觉知此事要躬行”