萌新的初始收获
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。