编程小技巧

简介: 1.判断一个自然数是否是某个数的平方?(其实就是判断这个数一定是奇数相加的) 由于 (n+1)^2 =n^2 + 2n + 1, = ... = 1 + (2*1 + 1) + (2*2 + 1) + ... + (2*n + 1) 注意到这些项构成了等差数列(每项之间相差2)。

 

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

  1. int square(int n)    
  2. {    
  3.     int i = 1;    
  4.     n = n - i;    
  5.     while( n > 0 )    
  6.     {    
  7.         i += 2;    
  8.         n -= i;    
  9.     }    
  10.     if( n == 0 )        //是某个数的平方    
  11.         return 1;    
  12.     else                //不是某个数的平方    
  13.         return 0;    
  14. }    


2.如何判断一个元素的奇偶性?

  1. //判断元素的奇偶性  
  2. bool isEven(int data)  
  3. {  
  4.     return((data & 1) == 0 ? true : false);  
  5. }  

[html] view plain copy
  1. if((exponent & 0x1) == 1) //判断是否为奇数  

3.判断一字符串是否是对称的。
  1. bool IsSymmetrical(char *pBegin , char *pEnd)  
  2. {  
  3.     if(pBegin == NULL || pEnd == NULL || pBegin > pEnd)  
  4.         return false;  
  5.   
  6.     while(pBegin < pEnd)  
  7.     {  
  8.         if(*pBegin != *pEnd)  
  9.             return false;  
  10.   
  11.         pBegin++;  
  12.         pEnd--;  
  13.     }  
  14.   
  15.     return true;  
  16. }  


 

4.输入一个整数n,求从1到n这个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1的数字有1,10,11和12,1一共出现了5次。

  1. int NumberOf1(unsigned int n)  
  2. {  
  3.     int number = 0;  
  4.     while(n)  
  5.     {  
  6.         if(n % 10 == 1)  
  7.             number++;  
  8.   
  9.         n = n / 10;  
  10.     }  
  11.   
  12.     return number;  
  13. }  
  14.   
  15. int NumberOf1Between1AndN(unsigned int n)  
  16. {  
  17.     int number = 0;  
  18.   
  19.     for(unsigned int i = 1 ; i <= n ; ++i)  
  20.         number += NumberOf1(i);  
  21.   
  22.     //cout<<number<<endl;  
  23.     return number;  
  24. }  


实现代码:

  1. #include<iostream>  
  2. using namespace std;  
  3.   
  4. int NumberOf1(unsigned int n)  
  5. {  
  6.     int number = 0;  
  7.     while(n)  
  8.     {  
  9.         if(n % 10 == 1)  
  10.             number++;  
  11.   
  12.         n = n / 10;  
  13.     }  
  14.   
  15.     return number;  
  16. }  
  17.   
  18. void NumberOf1Between1AndN(unsigned int n)  
  19. {  
  20.     int number = 0;  
  21.   
  22.     for(unsigned int i = 1 ; i <= n ; ++i)  
  23.         number += NumberOf1(i);  
  24.   
  25.     cout<<number<<endl;  
  26. }  
  27.   
  28. int main()  
  29. {  
  30.     int n = 12;  
  31.     NumberOf1Between1AndN( n);  
  32.   
  33.     return 0;  
  34. }  


 5.判断一个数是否是素数。

    1. bool isPrime(int n)  
    2. {   
    3.     for(int i = 2 ; i <= sqrt(n) ; i++)  
    4.     {  
    5.         if(n % i == 0)  
    6.             return false;  
    7.     }  
    8.     return true;  

img_e00999465d1c2c1b02df587a3ec9c13d.jpg
微信公众号: 猿人谷
如果您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】
如果您希望与我交流互动,欢迎关注微信公众号
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

目录
相关文章
|
13天前
|
存储 编译器 C语言
爱上C语言:函数递归,青蛙跳台阶图文详解
爱上C语言:函数递归,青蛙跳台阶图文详解
|
2月前
|
算法 搜索推荐 程序员
C语言第三十六练——多重背包
C语言第三十六练——多重背包
40 0
|
2月前
|
算法 搜索推荐 程序员
C语言第三十五练——完全背包
C语言第三十五练——完全背包
27 0
|
2月前
|
算法 搜索推荐 程序员
C语言第三十三练—— KMP算法和扩展 KMP算法
C语言第三十三练—— KMP算法和扩展 KMP算法
34 0
|
2月前
|
算法 搜索推荐 程序员
C语言第三十七练——状态压缩DP
C语言第三十七练——状态压缩DP
25 0
|
2月前
|
C语言
C语言刷题训练【第十天】
C语言刷题训练【第十天】
|
8月前
|
算法 C语言
【零钱问题】C语言贪心算法分析(文末彩蛋)
【零钱问题】C语言贪心算法分析(文末彩蛋)
105 0
|
8月前
洛谷P1424 小鱼的航程(改进版) C语言版
洛谷P1424 小鱼的航程(改进版) C语言版
|
算法 Python
【Python 百练成钢】蓝桥杯填空题
【Python 百练成钢】蓝桥杯填空题
155 0
|
11月前
|
C语言
【C语言每日一题】验证尼科彻斯定理
✨✨ 题目:验证尼科彻斯定理,即:任何一个整数m的立方都可以写成m个连续奇数之和。 例如: 1^3=1 2^3=3+5 3^3=7+9+11 4^3=13+15+17+19 输入一个正整数m(m≤100),将m的立方写成m个连续奇数之和的形式输出。 注意:本题含有多组输入数据。 数据范围:1≤m≤100 链接: 题目链接

热门文章

最新文章