第二次练习笔记(查找算法)

找素数

埃氏筛法

埃氏筛法的基本思想 :从2开始,将每个质数的倍数都标记成合数,以达到筛选素数的目的。

操作:先把所有整数列出来,然后把2的倍数全部剔除,然后是三的,以此类推,遍历所有素数,把倍数全部划去。

对于每个数字i,如果没被划去,他一定是素数,因为他不是任何2到i-1数字的倍数。然后就开始划它的倍数就好。

参考博客   素数基本(埃氏筛法/线性筛法)_兔老大RabbitMQ的博客-CSDN博客_埃氏筛法

代码实现:

  • int visit[max];  
    void Prime(){
        mem(visit,0);           //初始化都是素数
        visit[0] = visit[1] = 1;  //0 和 1不是素数
        for (int i = 2; i <= max; i++) {
            if (!visit[i]) {         //如果i是素数,让i的所有倍数都不是素数
                for (int j = i*i; j <= max; j += i) { 
                    visit[j] = 1;  //提剔除素数倍数的数字
                }
            }
        }
    

欧拉筛法

欧拉筛法的基本思想 :在埃氏筛法的基础上,让每个合数只被它的最小质因子筛选一次,以达到不重复的目的

代码实现:

  • int prime[maxn];
    int visit[maxn];
    void Prime(){
        mem(visit,0);
        mem(prime, 0);
        for (int i = 2;i <= maxn; i++) {
            cout<<" i = "<<i<<endl;
            if (!visit[i]) {
                prime[++prime[0]] = i;      //纪录素数, 这个prime[0] 相当于 cnt,用来计数
            }
            for (int j = 1; j <=prime[0] && i*prime[j] <= maxn; j++) {
    //            cout<<"  j = "<<j<<" prime["<<j<<"]"<<" = "<<prime[j]<<" i*prime[j] = "<<i*prime[j]<<endl;
                visit[i*prime[j]] = 1;
                if (i % prime[j] == 0) {
                    break;
                }
            }
        }
    }
    

    对于visit[i*prime[j]] = 1 的解释: 这里不是用i的倍数来消去合数,而是把 prime里面纪录的素数,升序来当做要消去合数的最小素因子

幸运数

基本思想:将数组不断的更新放入vector中,直到数组符合要求。

核心代码:

do  // do while循环 
	{
		old.push_back(0);//与前面a相对应 
		if (start > a.size()-1)//判断是否越界  start小于a中的元素个数 
			break;          //跳出循环 
		k = a[start++];      
		if (k > a.size())
			break;
		for (i = 1; i < a.size(); i++)
		{
			if (i % k)  //if ( k%i != 0) 
				old.push_back(a[i]);  //保留的数放入old容器中 
		}
		a.clear();//将a容器里面清空 
		a.assign(old.begin(), old.end());//将old容器中的值赋到a容器中 
		old.clear();  //清空old 准备进入下一次循环 
	}  while (true);

知识点

利用C++中的vector函数,存储数组

定义:vector <int>a(10);

在a的最后一个向量后插入一个元素,其值为5

a.push_back(5);

清空a中的元素

a.clear();

子集选取

long long C(long long m,long long n){
    if(!m||m==n) return 1;
    if(m>n) return 0;
    if(m<mod&&n<=mod)
        return ((long long)((long long)(jc[n]*inv[m])%mod)*inv[n-m])%mod;
    return ((long long)C(m%mod,n%mod)*C(m/mod,n/mod))%mod;
}

P1003

基本思想:先将字符串中的字母进行排序,然后再进行比较。

核心代码:

public static String f(String str1, String[] s1) {
		for (String string : s1) {                    // 遍历 s1
			char[] n = str1.toCharArray();          // 强转字符数组
			char[] m = string.toCharArray();
			Arrays.sort(n);                         // 排序
			Arrays.sort(m);
			if (new String(n).equals(new String(m))) {  // 一 一 比 较
				return string;                        // 返回
			}
		}
		return "";                                  // 空串
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值