常用API

  • 判断闰年
bool IfLeap(int n)
{
    if(n%100==0)
    {
        if(n%400==0)
            return true;
    }
    if(n%4==0)
            return true;
    return false;
}
  • 判断素数(易错)
bool isPrime(int n)
{
    if(n==1) //1不是素数
    return false;
    int sqr=(int)sqrt(1.0*n);
    for(int i=2;i<=sqr;i++)
    {
        if(n%i==0)
            return false;
    }
    return true;
}
  • 获取100以内素数,存于数组prime
#include <iostream>
#include<cstring>
using namespace std;
const int maxn=101;
int prime[maxn],pNum=0;
bool p[maxn];
void Find_Prime()
{
    for(int i=2;i<maxn;i++)
    {
        if(p[i]==false)
        {
            prime[pNum++]=i;
            for(int j=i+i;j<maxn;j+=i)
            {
                p[j]=true;
            }
        }
    }
}
int main()
{
    memset(p,false,sizeof(p));
    Find_Prime();
    for(int i=0;i<pNum;i++)
    {
        printf("%d ",prime[i]);
        //2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
    }
    return 0;
}
  • 将n进行质因数分解,结果存于fac数组(易错)
/*质因数一定是素数*/
//详见算法笔记P168
#include <iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=100010;
int prime[maxn],pNum=0;
bool p[maxn];
void Find_Prime()
{
    for(int i=2; i<maxn; i++)
    {
        if(p[i]==false)
        {
            prime[pNum++]=i;
            for(int j=i+i; j<maxn; j+=i)
            {
                p[j]=true;
            }
        }
    }
}
struct factor
{
    int x;
    int cnt;
} fac[10];
int fNum=0;
void getFac(int n)
{
    int sqr=(int)sqrt(1.0*n);
    for(int i=0; i<pNum&&prime[i]<=sqr; i++)//在素数范围内查找质因数
    {
        if(n%prime[i]==0)
        {
            fac[fNum].x=prime[i];
            fac[fNum].cnt=0;
            while(n%prime[i]==0)
            {
                fac[fNum].cnt++;
                n/=prime[i];
            }
            fNum++;
        }
        if(n==1)
            return;
    }
    if(n!=1)
    {
        fac[fNum].x=n;
        fac[fNum].cnt=1;
        fNum++;
    }
}
int main()
{
    memset(p,false,sizeof(p));
    Find_Prime();
    getFac(180);
    cout<<"对于180"<<endl;
    for(int i=0; i<fNum;i++)
    {
       cout<<"质因子"<<fac[i].x<<"个数为"<<fac[i].cnt<<endl;
    }
    return 0;
}
/*
对于180
质因子2个数为2
质因子3个数为2
质因子5个数为1
*/
  • 找一个数的约数,存于divs数组
#include<iostream>
#include<cstring>
using namespace std;
int divs[100],dnum=0;
void getDiv(int n)
{
    memset(divs,0,100);
    for(int i=1; i<=n/2; i++)//是n/2,不是n
    {
        if(n%i==0)
        {
            divs[dnum]=i;//注意没有n/=i这句
            dnum++;
        }
    }
}
int main()
{
    //这两句用于重置dnum和divs,常用于while(cin>>n){}内
    dnum=0;
    memset(divs,0,100);

    getDiv(220);
    cout<<220<<"的约数为";
    for(int j=0; j<dnum; j++)
    {
        cout<<divs[j]<<" ";
    }
    return 0;
}
//220的约数为1 2 4 5 10 11 20 22 44 55 110
//详见算法笔记P185
#include<iostream>
#include<cstring>
using namespace std;
int C(int n,int m)
{
    int ans=1;//注意
    for(int i=1;i<=m;i++)
    {
        ans*=(n-m+i)/i;
    }
    return ans;
}
int main()
{
    cout<<C(3,2)<<endl;//3
    return 0;
}
  • 统计单词个数-输入数据有多行,遇到#终止(易错)
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main()
{
    string str;
    vector<string> words;
    while(getline(cin,str))
    {
        if(str[0]=='#')
            return 0;
        int count=0;
        bool new_w=false,still=false;
        for(int i=0; i<str.length(); i++)
        {
            if(str[i]!=' '&&new_w==false&&still==false)
            {
                count++;
                new_w=true;////出现新单词
                still=true;//目前在单词中
            }
            else
            {
                if(str[i]!=' ')
                    still=true;
                else
                    still=false;
                new_w=false;
            }
        }
        cout<<count<<endl;
    }
    return 0;
}
/*输入:             you              are     my  friend               */
/*输出:4           
  • 最大公约数(易错)
//辗转相除法
int gcd(int n,int m)
{
        return gcd(m,n%m);
}
  • 最小公倍数(易错)
int lcm(int n,int m)
{ 
    int res=gcd(n,m);
    return m*n/res;
}
  • 将十进制数n转换为Q进制,结果存于数组z(易错)
#include<iostream>
#include<cstring>
using namespace std;
int z[100],num;
void changRadix(int n,int Q)
{
    num=0;
    memset(z,0,100);

    while(n!=0)
    {
        z[num++]=n%Q;
        n/=Q;
    }
}
int main()
{
    int n,Q;
    while(cin>>n>>Q)
    {
        if(n<0)
        {
            cout<<"-";
            n=-n;
        }
        changRadix(n,Q);
        for(int i=num-1; i>=0; i--)
        {
            if(z[i]>=10)
                cout<<char(z[i]-10+'A');
            else
                cout<<z[i];
        }
        cout<<endl;
    }
    return 0;
}
/*
输入:7 2
输出:111

输入:23 12
输出:1B

输入:-4 3
输出:-11
*/
  • 给定⼀个数值和⼀个进制,将它转化为10进制(易错)
#include <iostream>
#include<cctype>
#include<cstring>
#include<algorithm>
#include<math.h>
using namespace std;
int z[5]= {2,2,1,2,1};
int num=5;

//将z[]所存radix进制数转为10进制数(比如3进制数22121,则z[5]={2,2,1,2,1},convert(3)返回232)
/*注意用changRadix得到的z数组是逆序的,比如changRadix(23,2),得到的是2进制数是10111,但z[5]={1,1,1,0,1}
如果要将10111转换为十进制数,要先将z数组逆置回来

*/
int convert(int radix)
{
    int ans=0;
    for(int i=0; i<num; i++)
    {
        ans=ans*radix+z[i];
    }
    return ans;
}
int main()
{
    cout<<convert(3)<<endl;
    return 0;
}
  • 输出从数组num中从A到B的数;
    每 10 个数字占 1 行,其间以空格分隔;
    但行末不得有多余空格。(易错)
/*
11 13 17 19 23 29 31 37 41 43
47 53 59 61 67 71 73 79 83 89
97 101 103
*/
for(int i=A-1;i<B;i++)
    {
    count++;
    count%=10;
    if(count!=0)
    {
        if(count!=1)
            cout<<" ";
        cout<<num[i];
    }
    else
        cout<<" "<<num[i]<<endl;
    }
  • 错排(2048,2049)
    错排公式:Dn=(n-1)(Dn-1+Dn-2),其中D0=0,D1=0,D2=1,D3=2,
    错排概率:Dn/n!
//2048
#include<iostream>
using namespace std;
int main()
{
    long long a[51];
    a[0]=0;a[1]=0;a[2]=1;a[3]=2;
    for(int i=4; i<=50; i++)
    {
        a[i]=(i-1)*(a[i-1]+a[i-2]);
    }
    int T;
    cin>>T;
    for(int j=0;j<T;j++)
    {
     int n;
     cin>>n;
     long long m=1;
     for(long long i=2;i<=n;i++)//计算n!
     {
         m*=i;
     }
     printf("%.2f",a[n]*1.00/m*100);
     printf("%\n");
    }
    return 0;
}
  • 输入输出十六进制数
#include<iostream>
using namespace std;
int main()
{
    long long a,b,sum;
    while(scanf("%I64X%I64X",&a,&b))
    {
        sum=a+b;
        if(sum>=0)
            printf("%I64X\n",sum);
        else
            printf("-%I64X\n",-sum);
    }
    return 0;
}
/*
输入:
+A -A
1A -9
-1A -12
1A -AA
输出:
0
11
-2C
-90
*/
  • 四舍五入为整数
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
    int res=round(4.8);
    cout<<res<<endl;
    return 0;//5
}
  • 向上/下取整
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
   int res1=floor(5.6);
   printf("%d ",res1);

   int res2=ceil(5.6);
   printf("%d\n",res2);
   return 0;
}
/*输出:5 6*/

str[i]类型判断

#include<cctype>

if(isdigit(str[i]))//str[i]为数字
if(isalpha(str[i]))//str[i]为字母(不区分大小写)
if(islower(str[i]))//str[i]为小写字母
if(isupper(str[i]))//str[i]为大写字母
  • 字符串,数组逆置
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
string str="abcde";
reverse(str.begin(), str.end());
int arr[4]={2,3,1,4};
reverse(arr, arr+4);
cout<<str<<endl;//edcba
for(int i=0;i<4;i++)
{
    cout<<arr[i]<<" ";////4132
}
return 0;
}

字符串,查找子串

#include<iostream>
#include<string>
#include<stdio.h>
#include<algorithm>
using namespace std;
int main()
{
    string str="abcdefgh";
    cout<<str.find("bc")<<endl;//1
    cout<<str.find("poi")<<endl;//4294967295,大于str.size()的一个值
    return 0;
}
  • 大整数相加(易错)
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
string add(string s1, string s2) {
 string s = s1;//这一句是为了让s拥有和s1相同的长度
 int carry = 0;//carry表示进位
 for (int i = s1.size() - 1; i >= 0; i--) {
 s[i] = (s1[i] - '0' + s2[i] - '0' + carry) % 10 + '0';
 carry = (s1[i] - '0' + s2[i] - '0' + carry) / 10;
 }
 if (carry > 0)//如果最高位相加有进位
    s = "1" + s;
 return s;
}
int main()
{
    string A;
    cin>>A;
    string B=A;
    reverse(A.begin(),A.end());
    cout<<add(A,B)<<endl;
    return 0;
}
/*输入:9865298697593927335572439430173
输出13575648040349264629530408355862*/
  • vector复制
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> v1,v2;
int main()
{
    for(int i=9; i>0; i--)
    {
        v1.push_back(i);
    }

    v2=v1;

    for(int i=0;i<v2.size();i++)
    {
        cout<<v2[i]<<" ";//9 8 7 6 5 4 3 2 1
    }

    return 0;
}
  • 一维数组复制
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
    int A[3];
    int B[3];

    for(int i=0; i<3; i++)
    {
        int num;
        cin>>num;
        A[i]=num;
    }

    memcpy(B,A,sizeof(A));
    for(int i=0; i<3; i++)
    {
        cout<<B[i]<<" ";
    }
    return 0;
}
/*输入:1 2 3
输出: 1 2 3*/
  • 二维数组复制
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
    int A[3][3];
    int B[3][3];

    for(int i=0;i<3;i++)
    {
        for(int j=0;j<3;j++)
        {
            int num;
            cin>>num;
            A[i][j]=num;
        }
    }

    memcpy(B,A,sizeof(A));
    for(int i=0;i<3;i++)
    {
        for(int j=0;j<3;j++)
        {

            cout<<" "<<B[i][j];
        }
        cout<<endl;
    }
    return 0;
}
/*输入:1 2 3 4 5 6 7 8 9
输出: 1 2 3
      4 5 6
      7 8 9*/
  • 插入char数组
#include<iostream>
#include<cstring>
using namespace std;
int n,m,mat[101][101];
int main()
{
     cin>>n>>m;


    for(int i=0; i<n; i++)
    {
        char c=getchar();
        for(int j=0; j<m; j++)
        {
            cin>>c;
            if(c=='*')
                mat[i][j]=0;
            else
                mat[i][j]=1;
        }
    }

     for(int i=0; i<n; i++)
    {
        for(int j=0; j<m; j++)
        {
          cout<<mat[i][j]<<" ";
        }
        cout<<endl;
    }
    return 0;
}
/*
输入:
5 5
.....
.*.*.
.*S*.
.***.
...T*

输出:
1 1 1 1 1
1 0 1 0 1
1 0 1 0 1
1 0 0 0 1
1 1 1 1 0
*/
  • 如何生成一个随机三位数
int randnum=rand()%900+100;
  • 判断矩阵旋转角度
/*顺时针90:(i,j)与(j,n-1-i)
  顺时针180:(i,j)与(n-1-i,n-1-j)
  顺时针270:(i,j)与(n-j-1,i)
*/

#include <iostream>
#include <string>
using namespace std;
const int MAXV=101;
int a[MAXV][MAXV],b[MAXV][MAXV];
int main()
{
    int n;
    cin>>n;
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<n; j++)
        {
            cin>>a[i][j];
        }
    }
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<n; j++)
        {
            cin>>b[i][j];
        }
    }
    bool flag[4]= {true,true,true,true};
    int angle[4]= {0,90,180,270};
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<n; j++)
        {
            if(a[i][j]!=b[i][j])
                flag[0]=false;
            if(a[i][j]!=b[n-1-i][n-1-j])
                flag[1]=false;
            if(a[i][j]!=b[i][j])
                flag[2]=false;
            if(a[i][j]!=b[n-j-1][i])
                flag[3]=false;
        }
    }
    if(!flag[0]&&!flag[1]&&!flag[2]&&!flag[3])
        cout<<-1<<endl;
    else
    {
        for(int i=0; i<4; i++)
        {
            if(flag[i])
                cout<<angle[i]<<endl;
        }
    }
        return 0;
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,245评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,749评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,960评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,575评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,668评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,670评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,664评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,422评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,864评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,178评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,340评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,015评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,646评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,265评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,494评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,261评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,206评论 2 352

推荐阅读更多精彩内容

  • 原文 https://www.kancloud.cn/dennis/tgjavascript/241852 一、节...
    LuckyS007阅读 852评论 0 0
  • 最近学习到第 23 天了,还有 4 天时间我的 JavaSE 课程就要结束了,之后会有一个考试,需要复习一下,正好...
    SawyerZh阅读 1,042评论 0 11
  • 整理归纳在Python中使用对数据处理的常用方法,包括与HDFS文件的读写,主要是怕用的时候记不住,容易搞混,再搜...
    shohokuooo阅读 4,194评论 0 50
  • 注意:左对齐单个词对其方法向上结构 object(女娲) 每个类直接或者简介的继承了object 重写调用 pu...
    beatsl阅读 410评论 0 0
  • 感觉自己的文笔提不上去了,写来写去就是这样,刚才在首页看到一位刚结束365写作训练营的人写的文章,突然间我也想报个...
    立青日辰阅读 199评论 2 0