筛选法求素数

用筛法求素数的基本思想是:把从1开始的、某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛掉。剩下的数中选择最小的数是素数,然后去掉它的倍数。依次类推,直到筛子为空时结束。 如有: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 1不是素数,去掉。剩下的数中2最小,是素数,去掉2的倍数,余下的数是: 3 5 7 9 11 13 15 17 19 21 23 25 27 29 剩下的数中3最小,是素数,去掉3的倍数,如此下去直到所有的数都被筛完,求出的素数为: 2 3 5 7 11 13 17 19 23 29 31 37 41 43 4 ...

c++折半查找

介绍 折半查找,又称作二分查找。这个查找的算法的特点,就是,要求数据要是有序的。 1 ,存储结构一定是顺序存储 2 ,关键字大小必须有序排列 然后,利用这组有序的数据之间的关系,来进行折半的查找。 比方说,这组数据是升序排列的。一开始,首先对比这组数据的中间的项与关键值(key)的关系。若是关键值(key)>中间值,则说明,关键值(key)在中间值的右侧,因此将这组数据的区间缩小为以中间值为最左侧的小区间。然后,继续用中间值进行比较,以此类推,最终肯定会找到在数组当中与之匹配的关键值,直到区间缩小为0还没找 ...

c++快速幂求a的b次方

例如5^90如果用for循环要循环90次。而快速幂只需要4次; 90 的二进制数是 1011010. 5^90 = 5^(2 + 8 + 16 + 64) = 5^2 * 5^8 * 5^16 * 5^64; 很容易看出来当二进制数上为1时进行幂运算,而0不进行。所以每次用 90 & 1来判断当前数位上的数是否为1,之后 >>= 90 的二进制去掉最后一位; 在我的理解来看,90的二进制是 1011010 有四个1.所以就进行四次乘法运算,但是每次乘以的数都是上一次相乘的a倍 代码: #include <stdio.h> #include <stdlib.h> #include<iostream> using namespace std; typedef ...

A+Bproblem(大数处理)

!!!!!杭电1002,错了七次!!,一直都不明白为啥错了,后来一字一字的读,才明白,,是大数计算。哭了。。应该用数组来做。   A + B Problem II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 448906    Accepted Submission(s): 87050 Problem Description I have a very simple problem for you. Given two integers A and B, your job is to calculate the Sum of A + B.   Input The first line of the input contains an integer T(1<=T<=20) ...

十进制转化成任意R进制

2<=R<=36 R<>10 1、递归: #include <iostream> #include<stdio.h> using namespace std; int to_Other(int n,int r) { char sh; /* if(n == 0) { printf("0"); return 0; } */ if(n>0) { //n = n/r; //if(n !=0) to_Other(n/r,r); int i = n%r; if(i>=10) { sh=(char)(i+55); printf("%c",sh); } else { ...

分苹果

题目内容: 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?M, N为自然数。说明:如有7个苹果,2个盘子,则(5, 1, 1)和(1, 5, 1)和(1, 1, 5)都是同一种分法。 输入描述 第一行一个整数表示数据的组数(多组数据),对于每组数据第一行是苹果个数M (1 ≤ m ≤ 100) ,第二行是盘子个数N(1 ≤ n ≤ 100)。 输出描述 每组数据输出一行,放苹果的方法个数。 输入样例 1 3 2 输出样例 2 /* 思路1: 122 212 221是同种方法,则取代表 221 123 .321 是同种方法,则取代表 321 能当“代表”的组合的特点是, ...