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.给三点坐标 求外心坐标
根据外心到三点距离相等 列出两个等式 即
(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;符合 A1 * x+B1 * y = C1; A2 * x+B2 * y = C2;
令 A1=2(x2-x1);
B1=2(y2-y1);
C1=(x2x2+y2y2-x1x1-y1*y1);
A2=2(x3-x2);
B2=2(y3-y2);
C2=(x3x3+y3y3-x2x2-y2*y2;最后根据克拉默法则得出方程组答案:
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。

京公网安备 11010502036488号