1.题目Count Primes(计算质数个数)
Count the number of prime numbers less than a non-negative number, n.
计算小于n的非负数中质数的个数
思路:对于每一个数k,检查是否能被2到sqrt(k)整除
代码:
class Solution {
public:
int countPrimes(int n) {
if(n<=0)
return 0;
int num=1;
for(int i=2;i<n;++i)
{
int j=2;
for(;j<=(int)sqrt(i);++j)
{
if(0==i%j)
break;
}
if(j>(int)sqrt(i))
++num;
}
}
};
可以改进的地方:时间复杂度太高
改进的方法:
思路:https://zh.wikipedia.org/wiki/埃拉托斯特尼筛法
给出要筛数值的范围n,找出以内的素数。先用2去筛,即把2留下,把2的倍数剔除掉;再用下一个素数,也就是3筛,把3留下,把3的倍数剔除掉;接下去用下一个素数5筛,把5留下,把5的倍数剔除掉;不断重复下去......。
http://blog.csdn.net/angelazy/article/details/45561885
这里还可以进行一个优化,即对于质数 p,排除掉p的整数倍后,剩下的元素中满足 p<k<p∗p 的元素k均为质数。这里简单证明一下:
- 每个非质数均可以分解为若干个( >2 ,否则 k 本身为质数)质数的乘积: k=p1∗p2∗⋯∗pm ;
- 对于满足 p<k<p∗p 的元素来说,如果 k 不为质数,则 k 可以分解为 k=p1∗p2∗⋯∗pm ,其中必然有一个质数满足 pi<p ;
- 这里用反证法证明。若 k=p1∗p2∗⋯∗pm 中每一个质数均 pi>p ;则有 k>p∗p ,超出限定的条件 p<k<p∗p ,所以该非质数已经在前面的处理过程中排除掉了。
代码:
class Solution {
public:
int countPrimes(int n) {
if(n<=2)
return 0;
int *array = new int[n]();
int tmp, sum, count = n-2;
for(int i=2; i<=(int) sqrt(n); i++)
{
if(!array[i])
{
tmp = i*i;
for(int j=0; (sum=tmp+i*j)<n; ++j)
{
if(!array[sum])
{
array[sum] = true;
--count;
}
}
}
}
delete []array;
return count;
}
};
2. 题目:快乐数字
Write an algorithm to determine if a number is "happy".
A happy number is a number defined by the following process: Starting with any positive integer, replace the number by the sum of the squares of its digits, and repeat the process until the number equals 1 (where it will stay), or it loops endlessly in a cycle which does not include 1. Those numbers for which this process ends in 1 are happy numbers.
Example: 19 is a happy number
- 12 + 92 = 82
- 82 + 22 = 68
- 62 + 82 = 100
- 12 + 02 + 02 = 1
用循环的方式判断各位数字之和是否为1。为避免无限循环,将每次数学的数字存入哈希表中,若再次出现,则跳出循环。
代码:
class Solution {
public:
bool isHappy(int n) {
if(n<=0)
return false;
set<int> a;
a.insert(n);
while(n!=1)
{
a.insert(n);
int sum=0;
while(n>9)
{
sum+=pow((n%10),2);
n/=10;
}
sum+=pow(n,2);
if(a.find(sum)!=a.end())
return false;
n=sum;
}
return true;
}
};
可以改进的地方:时间开销大
改进的方法:
思路:
Using fact all numbers in [2, 6] are not happy (and all not happy numbers end on a cycle that hits this interval)
不知道怎么证明的?
代码:
bool isHappy(int n) {
while(n>6){
int next = 0;
while(n){next+=pow(n%10,2); n/=10;}
n = next;
}
return n==1;
}
后来在维基百科里搜到了https://en.wikipedia.org/wiki/Happy_number
自己写了下代码:
class Solution {
public:
bool isHappy(int n) {
while (n!=1 && n!=4) {
int sum = 0;
while (n) {
sum+=pow(n%10,2);
n /= 10;
}
n = sum;
}
return n==1;
}
};