1.判断一个自然数是否是某个数的平方?(其实就是判断这个数一定是奇数相加的)
由于
(n+1)^2
=n^2 + 2n + 1,
= ...
= 1 + (2*1 + 1) + (2*2 + 1) + ... + (2*n + 1)
注意到这些项构成了等差数列(每项之间相差2)。
所以我们可以比较 N-1, N - 1 - 3, N - 1 - 3 - 5 ... 和0的关系。
如果大于0,则继续减;如果等于0,则成功退出;如果小于 0,则失败退出。
复杂度为O(n^0.5)。不过方法3中利用加减法替换掉了方法1中的乘法,所以速度会更快些。
例如:3^2 = 9 = 1 + 2*1+1 + 2*2+1 = 1 + 3 + 5
4^2 = 16 = 1 + 2*1 + 1 + 2*2+1 + 2*3+1
- int square(int n)
- {
- int i = 1;
- n = n - i;
- while( n > 0 )
- {
- i += 2;
- n -= i;
- }
- if( n == 0 ) //是某个数的平方
- return 1;
- else //不是某个数的平方
- return 0;
- }
2.如何判断一个元素的奇偶性?
- //判断元素的奇偶性
- bool isEven(int data)
- {
- return((data & 1) == 0 ? true : false);
- }
- if((exponent & 0x1) == 1) //判断是否为奇数
3.判断一字符串是否是对称的。
- bool IsSymmetrical(char *pBegin , char *pEnd)
- {
- if(pBegin == NULL || pEnd == NULL || pBegin > pEnd)
- return false;
- while(pBegin < pEnd)
- {
- if(*pBegin != *pEnd)
- return false;
- pBegin++;
- pEnd--;
- }
- return true;
- }
4.输入一个整数n,求从1到n这个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1的数字有1,10,11和12,1一共出现了5次。
- int NumberOf1(unsigned int n)
- {
- int number = 0;
- while(n)
- {
- if(n % 10 == 1)
- number++;
- n = n / 10;
- }
- return number;
- }
- int NumberOf1Between1AndN(unsigned int n)
- {
- int number = 0;
- for(unsigned int i = 1 ; i <= n ; ++i)
- number += NumberOf1(i);
- //cout<<number<<endl;
- return number;
- }
实现代码:
- #include<iostream>
- using namespace std;
- int NumberOf1(unsigned int n)
- {
- int number = 0;
- while(n)
- {
- if(n % 10 == 1)
- number++;
- n = n / 10;
- }
- return number;
- }
- void NumberOf1Between1AndN(unsigned int n)
- {
- int number = 0;
- for(unsigned int i = 1 ; i <= n ; ++i)
- number += NumberOf1(i);
- cout<<number<<endl;
- }
- int main()
- {
- int n = 12;
- NumberOf1Between1AndN( n);
- return 0;
- }
5.判断一个数是否是素数。
- bool isPrime(int n)
- {
- for(int i = 2 ; i <= sqrt(n) ; i++)
- {
- if(n % i == 0)
- return false;
- }
- return true;
- }