UESTC ACM训练题一(总结)

UESTC ACM训练题一(总结)C 最大公约数与最小公倍数 Problem ID 1890 数学 Note 用辗转相除法求最大公约数之后即可求出最小公倍数 Code include cstdio using namespace std int gcd int a int b if b while cstdio

大家好,我是讯享网,很高兴认识大家。

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; } 
小讯
上一篇 2025-04-04 22:09
下一篇 2025-01-08 13:05

相关推荐

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