C-最大公约数与最小公倍数(Problem ID 1890 数学)
Note
- 用辗转相除法求最大公约数之后即可求出最小公倍数。
Code
#include <cstdio> using namespace std; int gcd(int a,int b) {
if(b) while((a%=b)&&(b%=a)); return a+b; } int main() {
int T,a,b,p,q; scanf("%d",&T); while(T--) {
scanf("%d%d",&a,&b); p=gcd(a,b); q=a/p*b; printf("%d %d\n",p,q); } return 0; }
讯享网
D-分数运算(Problem ID 1891 数学)
Note
- 除了加减乘除四种运算判断还要求最大公约数进行约分。
Code
讯享网#include <cstdio> #include <stdlib.h> #include <iostream> using namespace std; int gcd(int a,int b) {
if(b) while((a%=b)&&(b%=a)); return a+b; } int main() {
int a,b,c,d; int T,p,up,down; char m; scanf("%d",&T); while(T--) {
cin>>a>>b>>c>>d>>m; if(m=='+'||m=='-') {
if(m=='+') {
up=a*d+b*c; } else {
up=a*d-b*c; if(up==0) printf("%d/%d-%d/%d=%d\n",a,b,c,d,0); } down=b*d; p=gcd(abs(up),down); if(p==down) printf("%d/%d%c%d/%d=%d\n",a,b,m,c,d,up/down); else printf("%d/%d%c%d/%d=%d/%d\n",a,b,m,c,d,up/p,down/p); } if(m=='*'||m=='/') {
if(m=='*') {
up=a*c; down=b*d; } else {
up=a*d; down=b*c; } p=gcd(up,down); if(p==down) printf("%d/%d%c%d/%d=%d\n",a,b,m,c,d,up/down); else printf("%d/%d%c%d/%d=%d/%d\n",a,b,m,c,d,up/p,down/p); } } return 0; }
E-排列问题(Problem ID 1893 字符串处理)
Note
- 对字符串进行添加、排序、比较操作。
Code
#include <iostream> #include <cstdio> #include<algorithm> #include<string.h> using namespace std; bool cmp(char a,char b){
return a > b; } int main() {
int T,a_size,b_size,i; scanf("%d",&T); while(T--) {
char a[101]={
0},b[101]={
0}; scanf("%s",a); scanf("%s",b); a_size=strlen(a); b_size=strlen(b); sort(a,a+a_size,cmp); sort(b,b+b_size,cmp); if(a_size<b_size) {
for(i=0;i<b_size-a_size;i++) a[a_size+i]='0'; } else if(a_size>b_size) {
for(i=0;i<a_size-b_size;i++) b[b_size+i]='0'; } printf("%d\t%d\n",a_size,b_size); printf("%s\n%s\n",a,b); if(strcmp(a,b)) printf("No\n"); else printf("Yes\n"); } return 0; }
F-开灯问题(Problem ID 1906 简单枚举)
Note
- 用一个较大的数组记录灯的状态,从一个人开始算出他按的灯的序号改变对应的状态。
Code
讯享网#include <cstdio> #include<cstring> using namespace std; static int d[1001]; int main() {
int T,n,k; int i,j,p; scanf("%d",&T); while(T--) {
memset(d,1,sizeof(d)); scanf("%d%d",&n,&k); for(j=2;j<=k;j++) {
for(i=1;i<=n/j;i++) {
p=i*j; d[p]=!d[p]; } } for(i=1;i<=n;i++) {
if(d[i]) printf("%d ",i); } printf("\n"); } return 0; }
G-蛇形填数(Problem ID 1907 杂题)
Note
- 利用while循环和++i 语句可使代码更简洁。
Code
#include <cstdio> #include<cstring> using namespace std; static int a[20][20]; int main() {
int T,n,m; int i,j; scanf("%d",&T); while(T--) {
memset(a,0,sizeof(a)); scanf("%d",&n); m=a[i=0][j=n-1]=1; while(m<n*n) {
while(i+1<n&&!a[i+1][j]) a[++i][j]=++m; while(j-1>=0&&!a[i][j-1]) a[i][--j]=++m; while(i-1>=0&&!a[i-1][j]) a[--i][j]=++m; while(j+1<n&&!a[i][j+1]) a[i][++j]=++m; } for(i=0;i<n;i++) {
for(j=0;j<n;j++) {
printf("%4d",a[i][j]); } printf("\n"); } } return 0; }
H-数据大搜索(Problem ID 1914 字符串处理)
Note
- 用ASCII码进行判断。
Code
讯享网#include<bits/stdc++.h> using namespace std; int main() {
string a; int T,flag,len; int i,j; unsigned long long sum; char b[17]={
0}; cin>>T; getline(cin,a); while(T--) {
i=0; j=0; flag=0; sum=0; getline(cin,a); len=a.length(); while(i<len) {
while(a[i++]>47&&a[i-1]<58) {
flag=1; b[j++]=a[i-1]; } if(flag==1) {
// cout<<strtoull(b,NULL,10)<<endl; // cout<<sum<<endl; sum+=strtoull(b,NULL,10); flag=0; memset(b,0,sizeof(b)); j=0; } } cout<<sum<<endl; } return 0; }
I-旋转字符矩阵(Problem ID 1935 杂题)
Note
- 用二位字符数组存储和输出。
Code
#include<bits/stdc++.h> using namespace std; static char a[100][100]; int main() {
int T,n,i,j; scanf("%d",&T); while(T--) {
i=j=0; memset(a,0,sizeof(a)); scanf("%d",&n); while(i<n) scanf("%s",a[i++]); while(j++<n) {
while(i>0) printf("%c",a[--i][j-1]); printf("\n"); i=n; } printf("\n"); } return 0; }
J-猴子选大王(Problem ID 1937 杂题)
Notem
- 用a[m]数组记录每个猴子在或不在,不在的话要跳过,报数的过程中始终保证报完一轮又会到开始的那只猴子。
Code
讯享网#include <stdio.h> #define N 202 int main() {
int T; scanf("%d", &T); while(T--) {
int i, j = 0, n, m, cnt, a[N] = {
0}; scanf("%d%d", &m, &n); for(i = 1; i < m; i++) {
cnt = 0; while(cnt < n) {
if(j>m-1) j=0; while(a[j]) j = (j+1) % m; cnt++; j++; } a[j-1] = 1; } for(i = 0; i < m; i++) if(!a[i]) printf("%d\n", i+1); } return 0; }
K-颠倒句子中的单词(Problem ID 1945 字符串处理)
Note
- 搜索空格的位置并记录,然后以单词为单位逆向输出。
Code
#include<bits/stdc++.h> using namespace std; int main() {
int T,i,j=1; int a[1002]; string s; scanf("%d",&T); getline(cin,s); while(T--) {
j=1; getline(cin,s); int len=s.length(); a[0]=0; for(i=0;i<len;i++) if(s[i]==' ') a[j++]=i+1; a[j]=len+1; while(j--) {
for(i=a[j];i<a[j+1]-1;i++) printf("%c",s[i]); printf(" "); } printf("\n"); } return 0; }
M-能被3和11整除吗(Problem ID 1968 数学)
Note
- 根据同余定理,若一个从右往左将奇数位上的数和偶数位上的数分别加起来,其差是11的倍数,则这个数可以被11整除;其和是3的倍数,则这个数可以被3整除。
Code
讯享网#include<bits/stdc++.h> using namespace std; int main() {
int T,len,i; unsigned long long sum1,sum2; string s; scanf("%d",&T); getline(cin,s); while(T--) {
sum1=0;sum2=0; getline(cin,s); len=s.length(); for(i=len-1;i>=0;i-=2) sum1+=s[i]-'0'; for(i=len-2;i>=0;i-=2) sum2+=s[i]-'0'; // printf("%I64d %I64d \n",sum1,sum2); if((sum1+sum2)%3==0) printf("Yes "); else printf("No "); if((sum1-sum2)%11==0) printf("Yes\n"); else printf("No\n"); } return 0; }
N-整数的千位分隔(Problem ID 2013 字符串处理)
Note
- 利用string类的查找、插入、删除函数。
Code
#include<bits/stdc++.h> using namespace std; int main() {
int T,len,i; string s; scanf("%d",&T); getline(cin,s); while(T--) {
getline(cin,s); len=s.length(); int index=s.find(',',0); printf("%d\n",index); if(index<0) {
for(i=len-3;i>0;i-=3) s.insert(i,","); } else {
for(i=len-4;i>0;i-=4) s.erase(i,1); } cout<<s<<endl; } return 0; }
O-括号配对问题(Problem ID 2021 字符串处理)
Note
- 要用栈来进行操作,如果遇到左括号就入栈,遇到右括号就判断栈顶是否与之匹配,匹配则出栈,继续进行操作。当字符串遍历完之后,如果栈为空则匹配成功。
Code
讯享网#include<bits/stdc++.h> using namespace std; #define N 1001 int Match(char a, char b) {
if(a=='('&&b==')') return 1; else if(a=='['&&b==']') return 1; else if(a=='{'&&b=='}') return 1; else return 0; } int BracketMatch(char expre[]) {
std::stack<char> s; for(int i = 0; expre[i] != '\0'; i ++) {
if(expre[i] == '(' || expre[i] == '[' || expre[i] == '{')//如果是左括号就进栈 s.push(expre[i]); else if(expre[i] == ')' || expre[i] == ']' || expre[i] == '}') {
if(!s.empty() && Match(s.top(),expre[i])) s.pop(); else return 0; } } if(s.empty()) return 1; else return 0; } int main() {
int T; char expre[N] = {
0}; scanf("%d",&T); // getchar(); while(T--) {
//输入时自动关闭运行窗口添加memset初始化 memset(expre, 0 , sizeof(expre)); scanf("%s",expre); if(BracketMatch(expre)) printf("Yes\n"); else printf("No\n"); } }
P-易位法字符串加密(Problem ID 960 字符串处理)
Note
- 在密钥进行排序时要记住密钥原来的位置,才好输出。即对密钥和其下标同时进行排序,或者按照密钥的大小对下标进行排序。
Code
#include<bits/stdc++.h> using namespace std; void swapc(char *a,char *b) {
char temp; temp = *a; *a = *b; *b = temp; } void swapi(int *a,int *b) {
int temp; temp = *a; *a = *b; *b = temp; } void insertionSort(char s[],int size1,int arr[]) {
int i,j; for (i = 1; i < size1; i++) {
j = i; while (j > 0 && s[j] < s[j - 1]) {
swapc(s+j,s+j-1); swapi(arr+j,arr+j-1); j--; } } } int main() {
char key[21]={
0}; string word; int size1=0,size2=0; int i,j,pos; cin.getline(key,21); getline(cin,word); size1=strlen(key); size2=word.length(); cout<<key<<" "<<word<<" "<<size1<<endl; int a[size1]={
0}; for(i=0;i<size1;i++) a[i]=i; for(pos=size2;pos>=0;pos--) {
pos=word.rfind(' ',pos); if(pos>=0) word.erase(pos,1); } size2=word.length(); if(size2%size1) {
for(i=0;i<size1-size2%size1;i++) {
word.push_back('e'); } } size2=word.length(); for(i=0;i<size2;i++) {
word[i] = toupper(word[i]); } insertionSort(key,size1,a); for(i=0;i<size1;i++) {
for(pos=a[i];pos<size2;pos+=size1) printf("%c",word[pos]); } printf("%c",'\0'); return 0; }
Q-易位法字符串解密(Problem ID 969 字符串处理)
Note
- 将加密后的每一列挪到对应密钥在的列。
Code
讯享网#include<bits/stdc++.h> using namespace std; void swapc(char *a,char *b) {
char temp; temp = *a; *a = *b; *b = temp; } void swapi(int *a,int *b) {
int temp; temp = *a; *a = *b; *b = temp; } void insertionSort(char s[],int size1,int arr[]) {
int i,j; for (i = 1; i < size1; i++) {
j = i; while (j > 0 && s[j] < s[j - 1]) {
swapc(s+j,s+j-1); swapi(arr+j,arr+j-1); j--; } } } int main() {
int T; char key[21]={
0}; string word; int size1=0,size2=0; int i,j,hang,lie; scanf("%d",&T); cin.getline(key,21); while (T--) {
cin.getline(key,21); getline(cin,word); size1=strlen(key); size2=word.length(); int a[size1]={
0}; for(i=0;i<size1;i++) a[i]=i; insertionSort(key,size1,a); hang=size2/size1; char c[hang+1][size1+1]={
0}; for(i=0;i<size1;i++) {
for(j=0;j<hang;j++) {
lie=a[i]; c[j][lie]=word[i*hang+j]; } } for(i=0;i<hang;i++) {
for(j=0;j<size1;j++) {
printf("%c",c[i][j]); } } printf("\n"); } return 0; }
R-快乐的跳跃者(Problem ID 2063 字符串处理)
Note
- 将相邻元素差的绝对值存储在分配的动态内存中,用set容器进行判断是否满足jolly jumper 的条件。
Code
#include<bits/stdc++.h> using namespace std; int main() {
int T,n; scanf("%d",&T); while (T--) {
int i; scanf("%d",&n); int* p = new int[n]; int* q = new int[n-1]; for(i=0;i<n;i++) scanf("%d",p+i); for(i=0;i<n-1;i++) q[i]=abs(p[i]-p[i+1]); set<int> setp(q,q+n-1); if(*setp.begin()==1&&*setp.end()==n-1) {
if(setp.size()==n-1) printf("Jolly\n"); else printf("Not jolly\n"); } else printf("Not jolly\n"); delete []p; delete []q; } return 0; }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/67391.html