素数的个数统计

1.从C语言的语法设计来说是不支持的,早期的C编译器未考虑过函数重载这一功能,所以就会有那么多类似的函数abs,labs,fabs等等(每种类型都要考虑一个不同的函数名)。
2.C语言标准就规定不允许同一作用域中两个函数重名。和C语言相关的域有两种,一个是给编译器看得,还有一种是给链接器看的,而给编译器看的这种域主要是关于
变量的可见范围,而链接器看到的那个是叫文件域,而全局域可能要跨越好几个文件域,这样只要两个同名函数用static修饰,并且在不同的文件中,就不会
冲突。不过这个实际上已经超越了编译器的范围,表面看起来两个函数同名,但是实际上编译器为链接器产生是指向的同一个函数地址。 
3.函数重载是一个编译期行为,主要是通过name mangling来产生不同的汇编符号,让linker可以正确的link代码。

4.但是,C语言作为一个具有超强功能的底层语言,是有办法进行模拟函数重载的。那就是函数指针。最简单的例子就是qsort函数。这个函数可以传递一个函数指针变量,通过不同的函数指针,可以对不同的数据类型就行相同的qsort操作,从某种层面来说相当于函数重载。


打表法:

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int CountPrime(int n)
{
if (n<=1)
{
return 0;  //1不是素数
}
else if (n == 2)
{
return 1;
}
int count = 0;
bool *tag = (bool *)malloc(sizeof(bool)*(n+1));
tag[2] = true;    
    int j = 3;
    while (j <= n)
    {
tag[j++] = true;
tag[j++] = false;
    }
for (int i=3; i<=sqrt((double)n); ++i)   //sqrt() VC 2008后为重载函数,原型为 float sqrt (float),double sqrt (double),double long sqrt(double long)
{
if (!tag[i])
{
continue;
}
for (int j=i*i; j<=n; j+=i)
{
tag[j] = false;
}
}
for (int i=2; i<=n; ++i)
{
if (tag[i])
{
++count;
}
}
delete []tag;
return count;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值