判断回文方法 1.
- :确定一个数的各位储存在数组里,再对应匹配:从个位开始储存在栈中,直到1/2的位数,再将比1/2的位数高的那些位拿出来匹配,栈top–,直到top=0;
判断十进制位数方法
- while 循环 2
- (int)log10(n);
判断质数方法
- for循环 2到i*i<n,1,2特判
- 简单线性筛:book[0]=1,book[1]=1,用for遍历2~n , 小于等于n大于2的所有2的倍数设为合数(book[2k]=1)(用while),再除3以外3的所有倍数设为合数(book[3k]=1),4因为是合数跳过(book[4]==1)…,若book[k]==0为质数,反则为合数。
- 快速线性筛:同样先0,1去除,遍历2~n,从2开始的每个数按一定的方式和小于它的一些数相乘,这些相乘得到的合数的book设为1,以达到避免重复计算合数的目的。(如在简单线性筛中36=218=312还带来重复计算,我们需要找到一种优化的方法不会重复筛除一个合数)
那么这种方法前人已经提出:
如果i为素数, i 乘以不大于 i 的素数得到的合数book=1;
如果i为合数,将合数和它的最小质因数相乘得到的合数book=1;
如果是一个质数和他之前全部质数相乘,如果是奇合数和在包括它最小质因子之前的质因数相乘,如果是偶合数和2相乘
2 * 2 , 3 * 2 , 3 * 3 , 4 * 2,5 * 2,5 * 3 ,5 * 5 , 6 * 2 , 7 * 2 , 7 * 3 , 7 * 5 , 7 * 7…
这些合数会包括
- 所有两个质数的乘积(15=31*51)
- 合数和它最小质因子的乘积(16=8*2)
合数 * 最小质数=合数,,
而不让合数 * 其他大一丢的质数
若允许43=(2 * 2) * 3=12则62=(2 * 3) * 2=12重复,
这表明该合数i=p1 * p2 * … * pn若和大一丢的质数ps相乘,则存在大于i的合数i’=p2p3…pnps使得i’p1和ips相等导致重复(说明合数不需要去和大的质数或者合数相乘,因为该相乘得到合数可以通过某一个合数和它的最小质数相乘得到)
(前面的合数 i=p1 * p2…*pn, //pi都是素数(2<=i<=n), pi<=pj ( i<=j ))
代码参考
https://blog.csdn.net/dinosoft/article/details/5829550
题目参考(luoguo1217)
https://www.luogu.com.cn/problem/P1217
题解参考
https://www.luogu.com.cn/problemnew/solution/P1217