1.十进制整数任意转化成2-36进制数(10-36位a-z)(itoa函数)

#include <stdio.h>
#include <string.h>
int main()
{
    int n,m;    //n为十进制下的数,m为你需要转换的进制数
    char b[100]    //要存放的字符数组。
    scanf("%d",&n)
    itoa (n,b,m);
    printf("%s\n",b);
    return 0;
}

(常规)

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
#define MAX 10000

int main(){
    int n,m,a;
    int x[MAX],index=0;
    scanf("%d%d",&n,&m);  //n为2进制   m进制
    printf("%d=",n);
    while(n!=0){
        a=n%m;
        n/=m;
        if(a<0){
            a=a-m;//注意负数余数转换的时候,余数-进制,被取数+1.
            n+=1;
            x[index++]=a;
        }
        else
            x[index++]=a;
    }
    for(int i=index-1;i>=0;i--){
        if(x[i]==10) printf("A");
        else if(x[i]==11) printf("B");
        else if(x[i]==12) printf("C");
        else if(x[i]==13) printf("D");
        else if(x[i]==14) printf("E");
        else if(x[i]==15) printf("F");
        else if(x[i]==16) printf("G");
        else if(x[i]==17) printf("H");
        else if(x[i]==18) printf("I");
        else if(x[i]==19) printf("J");
        else printf("%d",x[i]);
    }
    printf("(base%d)",m);
    return 0;
}

2.桶排序

第一行输入N(0<=N<=1000)表示下一行要输入N个整数(整数范围在0~100000),请将这N个整数升序排列。

#include <stdio.h>
int a[100005];   //数组范围为整数的范围
int main()
{
    int n,i,x,num=1;
    scanf("%d",&n);  
    for(i = 0;i < n;i++)
    {
        scanf("%d",&x); //读取一个数就让对应下标的数组元素+1
        a[x]++;
    }
    for(i = 0;i < 100005;i++) //从0开始是升序从最大开始就降序
    {
        while(a[i]) //一旦数组元素>0,输出下标(数组元素里面存了整数的个数)
        {
            if(num == 1)
              printf("%d",i);
            else
              printf(" %d",i);
            a[i]--;
            num=0;
        }
    }
 printf("\n");
}

3.大数相加

#include <stdio.h>
#include <string.h>
int main()
{
    char str1[1010],str2[1010];
    int num1[1010] = {0},num2[1010] = {0},len1,len2,lenmax,i,j;

    scanf("%s",str1);
    scanf("%s",str2);

    len1 = strlen(str1);    len2 = strlen(str2);
    lenmax = len1;
    if(lenmax < len2)
        lenmax = len2;

    for(i = 0,j = len1 - 1;i < len1;i++,j--)
    {
        num1[i] = str1[j] - '0';
    }

    for(i = 0,j = len2 - 1;i < len2;i++,j--)
    {
        num2[i] = str2[j] - '0';
    }

    for(i = 0;i < lenmax;i++)
    {
        num1[i] = num1[i] + num2[i];
        if(num1[i] > 9)
        {
            num1[i] %= 10;
            num1[i+1]++;
        }
    }
    if(num1[lenmax]==1)
        printf("%d",num1[lenmax]);
    for(i = lenmax - 1;i >= 0;i--)
    {
        printf("%d",num1[i]);
    }
    printf("\n");

}

4.大数减法

#include <stdio.h>
#include <string.h>
int main()
{
    char str1[1010],str2[1010],temp[1010];
    int num1[1010] = {0},num2[1010] = {0},len1,len2,i,j,sign = 1,tmp;

    scanf("%s%s",str1,str2);
    len1 = strlen(str1);   len2 = strlen(str2);
    if((len1<len2)||(len1==len2)&&(strcmp(str1,str2)<0))
    {
        strcpy(temp,str1);
        strcpy(str1,str2);
        strcpy(str2,temp);
        tmp = len1;
        len1 = len2;
        len2 = tmp;
         sign = 0;
    }

    for(i = 0,j = len1 - 1;i < len1;i++,j--)
    {
        num1[i] = str1[j] - '0';
    }

    for(i = 0,j = len2 - 1;i < len2;i++,j--)
    {
        num2[i] = str2[j] - '0';
    }

    for(i = 0;i < len1;i++)
    {
        if(num1[i]<num2[i])
        {
            num1[i] += 10;
            num1[i+1]--;
        }
        num1[i] = num1[i] - num2[i];

    }
    if(sign == 0)
        printf("-");
    sign = 0;
    if(strcmp(str1,str2) == 0)
    {
        printf("0");
    }
    else
    for(i = len1-1;i >= 0;i--)
    {
        if(num1[i] != 0)
        {
           sign = 1;
        }
        if(sign)
        printf("%d",num1[i]);

    }
    printf("\n");
}

5.全排列 头文件algorithm里的next_permutation()函数

输出字符串的所有排列方式,每行一个排列。要求字母序比较小的排列在前面。字母序如下定义

输入 abc

输出 abc acb bac bca cab cba

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
    string a;
    int num=0;                    //用于控制最后一个输出没有回车
    cin >> a;                      //中间没有空格
    sort(a.begin(),a.end());             //先升序排序一下
    do
    {
        if(num)
        {
            cout << a;
            num = 1;
        }
        else
            cout << endl << a;

    }while(next_permutation(a.begin(),a.end()));

    return 0;

}

6.给三点坐标 求外心坐标

根据外心到三点距离相等 列出两个等式 即

  1. (x1-x)(x1-x)+(y1-y)(y1-y)=(x2-x)(x2-x)+(y2-y)(y2-y);
    (x2-x)(x2-x)+(y2-y)(y2-y)=(x3-x)(x3-x)+(y3-y)(y3-y);

    2.化简得 2 * (x2-x1) * x+2 * (y2-y1) * y =x2^2+y2^2-x1^2-y1^2;
    2 * (x3-x2) * x+2 * (y3-y2) * y=x3^2+y3^2-x2^2-y2^2;

  2. 符合 A1 * x+B1 * y = C1; A2 * x+B2 * y = C2;

  3. 令 A1=2(x2-x1);
    B1=2
    (y2-y1);
    C1=(x2x2+y2y2-x1x1-y1*y1);
    A2=2
    (x3-x2);
    B2=2(y3-y2);
    C2=(x3
    x3+y3y3-x2x2-y2*y2;

  4. 最后根据克拉默法则得出方程组答案:
    x=((C1 * B2)-(C2 * B1)) / ((A1 * B2)-(A2 * B1));
    y=((A1 * C2)-(A2 * C1)) / ((A1 * B2)-(A2 * B1));

7.寻找m~n内具有最多因子的数

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#define N 100001
using namespace std;
int num=0,ans=0,minn,anx,yes[N],no[N];
void xs()
{
    memset(yes,0,sizeof(yes));
    memset(no,0,sizeof(no));
    no[0]=no[1]=1;
    for (int i=2; i<N; i++)
    {
        if (!no[i]) yes[num++]=i;
        for (int j=0; j<num && i*yes[j]<N; j++)
        {
            no[i*yes[j]]=1;
            if (!(i%yes[j])) break;
        }
    }
}
void work(int start,int s,int x,int L,int R)
{
    if (x>=minn)
    {
        if ((s>ans) || (s==ans && x<anx))
            ans=s,anx=x;
    }
    if ((L==R) && (L>x))
        work(start,s<<1,x*L,1,1);
    for (int i=start; i<num; i++)
    {
        if (yes[i]>R) return;
        int j=yes[i],ll=L-1,l=L,r=R,y=x,ss=s,m=1;
        while (1){
            m++; ss+=s; ll/=j; l/=j; r/=j;
            if (ll==r) break; y*=j;
            work(i+1,ss,y,l,r);
        }
        m=1<<m;
        if (s<(ans/m)) return;
    }
}
int main()
{
    int l,r;
    scanf("%d%d",&l,&r);    
    xs();
    if (l==1 && r==1) ans=1,anx=1;
    else {
        minn=l,ans=2,anx=l;
        work(0,1,1,l,r);
    }
    printf("Between %d and %d, %d has a maximum of %d divisors.\n",l,r,anx,ans);
    return 0;
}

8.移掉K位数字(单调栈)

给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。

注意:

​ num 的长度小于 10002 且 ≥ k。
​ num 不会包含任何前导零。

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstring>
using namespace std;
class Solution
{
public:
    string removeKdigits(string num, int k)
    {
        string s;
        int lnum = num.size(), ls = lnum - k, i;

        for (i = 0;i < lnum; i++)  //遍历一遍,依次写入string s 中     
        {
            while (k && s.size() && s.back() > num[i])  //当字符串s不为空时,将比较代写入数字(右侧)与字符串最后数字的大小(左侧),左侧如果大,删除它,再与左侧比较,保持单调
            {
                k--;
                s.pop_back();

            }
            s.push_back(num[i]);
        }
        s.resize(ls);   //重整长度
        while (!s.empty() && s[0] == '0')  //删除多余的前导0
            s.erase(s.begin());     //删除开头
        return s.empty() ? "0" : s;

    }

}m;

int main()
{
    string num;
    int k;
    cin >> num >> k;
    cout << m.removeKdigits(num, k);

    return 0;

}

9.使用map(寻找含k个相同字符的最短子串长度)

eli拿到了一个仅由小写字母组成的字符串。 她想截取一段连续子串,这个子串包含至少 k个相同的某个字母。 她想知道,子串的长度最小值是多少?

注:所谓连续子串,指字符串删除头部和尾部的部分字符(也可以不删除)剩下的字符串。例如:对于字符串"areaea" 而言"arc","reae" 都是其子串。而"car", "aa" 不是。

输入: 第一行输入两个正整数 n 和 k( 1 <= k <= n <= 200000)
输入仅有一行,为一个长度为 n 的、仅由小写字母组成的字符串。

输出: 如果无论怎么取都无法满足条件,输出 -1。
否则输出一个正整数,为满足条件的子串长度最小值。

示例: 输入 5 2 abeba 输出 3

#include<iostream>
#include<string>
#include<map>
using namespace std;
int main()
{
    int n,k;
    string s;
    map<char,int> mp;
    int ans=-1,l=0;
    cin>>n>>k>>s;

    for(int i=0;i<n;i++)
    {
        char c=s[i];
        mp[c]++;
        while(mp[c]==k)
        {
            if(ans==-1)
                ans=i-l+1;
            else
                ans=min(i-l+1,ans);
            mp[s[l]]--;      //依次删除头位置字母的出现次数
            l++;             //当l等于本轮while字母的首次出现的位置时,再循环最后一次算出长度 并减掉一次本轮while字母的出现次数,从而跳出循环
        }

    }
    cout<<ans<<endl;
}

小菜鸡的小收获QAQ。