专栏首页猿人谷编程小技巧

编程小技巧

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;  
}  

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 找出一个数组中出现次数最大的数

    描叙:一大堆数据里面,数字与数字之间用空格隔开,找出出现次数最多的一个数字的算法 #include<stdio.h> void FindMostTimesDi...

    猿人谷
  • 金山试题

    1. 结构POINT定义如下: typedef struct tagPOINT {          int x;         int y;     } ...

    猿人谷
  • cctype

    在头文件<ctype.h>中定义了一些测试字符的函数。在这些函数中,每个函数的参数都是整型int,而每个参数的值或者为EOF,或者为char类型的字符。<cty...

    猿人谷
  • LeetCode 周赛题解 213

    因为 arr 和 pieces 中都不包含重复的数字,所以直接在pieces中暴力寻找 arr[i] 即可,然后连续的元素是否相同即可。

    ACM算法日常
  • Data Structure_图图论带权图

    交通运输,社交网络,互联网,工作的安排,闹区活动等等都可以用到图论处理。图可以分成两大类,一类是无向图,就是没有方向的,就好像两个人都互相认识一样,有向图就是单...

    西红柿炒鸡蛋
  • 奇技淫巧”话递归

    “To Iterate is Human, to Recurs,Divine.” --- L. Peter Deutsch “迭代是人,递归是神” 第一次见有人...

    itclanCoder
  • LeetCode 354 Russian Doll Envelopes (动态规划)

    一道好题目,把最长递增子序列扩展到二维,但是这道题和最长递增子序列是有区别的,它不要求是序列,只是在数组中找到一组最长的组合,不要求顺序在初始中相同。

    ShenduCC
  • Data Structure_图

    交通运输,社交网络,互联网,工作的安排,闹区活动等等都可以用到图论处理。图可以分成两大类,一类是无向图,就是没有方向的,就好像两个人都互相认识一样,有向图就是单...

    西红柿炒鸡蛋
  • 牛客集训派对day3

    题目描述 有一张无限大的棋盘,你要将马从(0,0)移到(n,m)。 每一步中,如果马在(x,y),你可以将它移动到(x+1,y+2),(x+1,y-2),(x-...

    xiaohejun
  • 4.7字符串匹配(3)

    用户1147447

扫码关注云+社区

领取腾讯云代金券