AOJ.综合训练.2016-12-8
来源:互联网 发布:oracle linux安装教程 编辑:程序博客网 时间:2024/04/28 12:42
提示:多个题目的代码采用了C ++的写法,对应编译器选择G ++,请不要直接复制代码。
下周实验考试,GOOD LUCK! 感谢汪神提供E题C语言代码
所有题目已更新为C语言写法
所有题目已更新为C语言写法
所有题目已更新为C语言写法
题目总览
A.整数移位 2
题意分析
模拟循环移位n次。这题AC rate 相当高,分析省(偷懒ing)。
代码总览
#include <stdio.h>#include <string.h>#define max 1005void get(char* str){ int len = strlen(str); int i; if(len <= 1) return; char temp = str[len-1]; for(i=len-1; i>= 1; i--) str[i] = str[i-1]; str[0] = temp;}void getn(char* str, int n){ int i; if(!str) return; for(i=1; i<= n; i++) get(str);}int main(){ char str[max]; int n; while(scanf("%s %d",str,&n) !=EOF){ getn(str,n); printf("%s\n",str); } // shift_n(str,2); // printf("%s",str); return 0;}
B.约瑟夫环
题意分析
给出人数n和每m个人出局,几个人来回报数,报到m的话那个人出局,并且从1接着开始报数。求这几个人出局的顺序。模拟报数即可。
用一个for循环来模拟报数,并且有计数器cnt,数组a,数组a用来模拟谁出局了,没出局a[i]=0,出局了a[i] = 1;每当找到一个a[i] = 0的时候,cnt++,表示1个人报数。直到cnt = m的时候,说明当前的人该出局了,将a[i]置为1,cnt初始化为0,输出i+1这个数字,并且将num++。每次循环先判断一下i是否等于n-1,若是表明该从第0个元素开始下一轮报数了;然后判断一下num是否等于n,若是,说明游戏里n个人都出局了,游戏结束。
因为测试数据有多组,写一个empty函数,把数组归零。
(这题是循环队列)
代码总览
#include <stdio.h>#define max 105int a[max];void empty(int a[],int n){ int i; for(i = 0;i<n;i++){ a[i] = 0; }}int main(){ int n,m; while(scanf("%d %d",&n,&m) != EOF){ int i,cnt = 0,num = 0,flag = 0; for(i = 0;i<n;i++){ if(a[i] == 0){ cnt++; } if(cnt == m){ if(a[i] == 0){ if(flag == 0){ flag = 1; printf("%d",i+1); }else{ printf(" %d",i+1); } num++; a[i] = 1; } cnt = 0; } if(i == n-1){ i=-1; } if(num == n){ printf("\n"); break; } } empty(a,n); } return 0;}
C.重排字符
题意分析
已更新C语言写法
已更新C语言写法
已更新C语言写法
给出2个字符串,判断前一个是否为后一个的乱序。
对2个字符串按ASCII排序(升序降序均可),然后比较,若相同则输出Yes,否则输出No.
C语言:
①首先读入2个字符串
②通过sort函数分别对这2个字符串按照ASCII大小进行冒泡排序(当然这里也可以换成别的排序方法,插入排序,选择排序均可)。
③用strcmp函数比较这可两个字符串是否相等,若相等的话说明前一个即为后一个的乱序,否则就不是。注意,若相等strcmp函数返回值为0,否则为第一个不相等字符的ASCII之差。
C++:
使用string容器,用algorithm库里面的sort对每个字符排序,然后比较,判断即可。
代码总览
C语言版
#include <stdio.h>#include <stdlib.h>#include <string.h>#define max 500void sort(char * s)//②{ int len = strlen(s); int i,j; for(i = 0;i<len-1;i++){ for(j = 0;j<len-1-i;j++){ if(s[j]>s[j+1]){ swap(&s[j],&s[j+1]); } } }}void swap(char *a,char*b){ char t; t = *a; *a = *b; *b = t;}int main(){ char s1[max],s2[max]; while(scanf("%s %s",s1,s2) != EOF){//① sort(s1); sort(s2); if(strcmp(s1,s2) == 0){//③ printf("Yes\n"); }else{ printf("No\n"); } } return 0;}
C++版
#include <iostream>#include <string>#include <algorithm>using namespace std;string s1,s2;int main(){ cin.sync_with_stdio(false); cin.tie(0); while(cin>>s1>>s2){ sort(s1.begin(),s1.end()); sort(s2.begin(),s2.end()); if(s1.compare(s2) == 0){ cout<<"Yes"<<endl; }else{ cout<<"No"<<endl; } } return 0;}
D.字符串
题意分析
已更新C语言写法
已更新C语言写法
已更新C语言写法
C写法参考汪神的思路
给出2个字符串,判断他们是否有相同的字符构成。
C语言:
①分别读入2个字符串
②通过get函数来统计他们的ASCII是否出现过,这里我还开了2个list数组,来记录他们的ASCII,若没出现过则为1,否则为0 (这里有优化的余地,因为ASCII 1-31均为控制字符,且32为空格,用%s是无法读入空白字符的,所以这里开128-32的数组就足够了,并且处理 的时候写s[i]-32即可,大家可以一试)
③通过judge函数来比对两个list是否每一位都相等,是的话说明他们均出现过,若有一位不相等,则说明他们有不同的字符。利用judge函数的返回值来输出对应结果。
④有多组数据,写clear函数清空2个list。
C++:
直接用map容器,对字符串每一个字符处理,处理完成后比对,如果查找的时候返回0说明不同,若查找均能找到,比较一下2个容器的size,size相同的话说明一定有相同字符构成。按照题目要求输出结果即可。
代码总览
C语言版
#include <stdio.h>#include <stdlib.h>#include <string.h>#define max 505#define lmax 128//②int list1[lmax],list2[lmax];//②void get(char*s,int list[])//②{ int len = strlen(s); int i; for(i = 0;i<len;i++){ list[s[i]] = 1; }}int judge(int list1[],int list2[])//③{ int i,flag = 1; for(i = 0;i<lmax;i++){ if(list1[i] != list2[i]){ flag = 0; break; } } return flag;}void clear(int list1[],int list2[])//④{ int i; for(i = 0;i<lmax;i++){ list1[i] = list2[i] = 0; }}int main(){ char s1[max],s2[max]; while(scanf("%s %s",s1,s2) != EOF){//① get(s1,list1); get(s2,list2);//② if(judge(list1,list2)){//③ printf("Yes\n"); }else{ printf("No\n"); } clear(list1,list2);//④ } return 0;}
C++版
#include <iostream>#include <map>#include <stdio.h>#include <string.h>#define max 505using namespace std;typedef map<char,int> mp;mp p,q;int main(){ char s1[max],s2[max]; while(scanf("%s %s",s1,s2)!= EOF){ int len = strlen(s1),i,flag = 0; for(i = 0;i<len;i++){ p[s1[i]]++; } len = strlen(s2); for(i = 0;i<len;i++){ q[s2[i]]++; } for(i = 0;i<len;i++){ if(p.count(s2[i]) == 0){ flag = 1; break; } } if(p.size() != q.size()){ flag = 1; } if(flag == 0){ printf("Yes\n"); }else{ printf("No\n"); } p.clear(); q.clear(); } return 0;}
E.生成全排列
题意分析
已更新C语言写法
已更新C语言写法
已更新C语言写法
无奈又用了STL。汪神太强了,感谢汪神分享C的写法
(本蒟蒻要好好学习一下了,等我拿个本先记上)
代码总览
C语言版
#include<stdio.h>int n;int f[10],s[10];void make(int k){ if(k>n) { int i; for(i=1;i<n;++i) printf("%d ",s[i]); printf("%d\n",s[n]); return ; } int i; for(i=1;i<=n;++i) if(!f[i]) { s[k]=i; f[i]=1; make(k+1); f[i]=0; }}int main(){ while(scanf("%d",&n)!=EOF) { int i; for(i=0;i<10;++i) s[i]=f[i]=0; make(1); } return 0;}
C++版
#include <iostream>#include <stdio.h>#include <string>#include <algorithm>#define max 10using namespace std;int a[10];int main(){ cin.sync_with_stdio(false); cin.tie(0); int n; while(cin>>n){ int i; for(i = 0;i<n;i++){ a[i] = i+1; } for(i = 0;i<n;i++){ if(!i){ printf("%d",a[i]); }else{ printf(" %d",a[i]); } } printf("\n"); while(next_permutation(a,a+n)){ for(i = 0;i<n;i++){ if(!i){ printf("%d",a[i]); }else{ printf(" %d",a[i]); } } printf("\n"); } } return 0;}
F.数组旋转
题意分析
先按题目给出n保存到一个二维数组里,然后按二维数组从右到左,从上到下的顺序输出数组即可。
代码总览
#include <stdio.h>#define max 101int a[max][max];int main(){ int n; while(scanf("%d",&n) != EOF){ int i,j; for(i = 0;i<n;i++){ for(j = 0;j<n;j++){ scanf("%d",&a[i][j]); } } for(i = n-1;i>=0;i--){ for(j = 0;j<n;j++){ if(j == 0){ printf("%3d",a[j][i]); }else{ printf("%3d",a[j][i]); } } printf("\n"); } } return 0;}
G.对称数
题意分析
给出n,求出[1,n]中的满足下列要求的整数:这个数的平方本身是回文数。
(回文数 比如 121,131,1331,123321,12321等等)
数据范围不大int即可(我还是使用了 long long),把这个数的平方算出来,并且把他的每一位保存到数组里。对数组进行回文串判断,并设置标志变量flag。根据flag判断是否为回文串。
代码总览
#include <stdio.h>#define max 1001int a[max];int main(){ long long temp,temp1; int n; while(scanf("%d",&n)!= EOF){ int i; for(i = 1;i<=n;i++){ temp1 = temp = i * i; int k = 0,j,judge = 0; while(temp1){ a[k] = temp1%10; temp1/= 10; k++; } for(j = 0;j<k/2;j++){ if(a[j] != a[k-1-j]){ judge = 1; break; } } if(!judge){ printf("%2d%11lld\n",i,temp); } } } return 0;}
- AOJ.综合训练.2016-12-8
- AOJ.综合训练.2016-12-1
- AOJ.综合训练.2016-11-24
- java文件综合训练
- 结构体综合训练
- java基础 - 综合训练
- Layout组件综合训练
- SQL综合训练
- AOJ
- Aoj
- Delphi程序设计综合训练任务书
- 硬件综合训练中期总结
- java基础 - 综合训练二
- SQL之CRUD综合训练
- HHU ACM 综合训练2
- PyQt5+OpenCV+Matplotlib综合训练
- AOJ 12 box of bricks
- 臀大肌(07):综合训练方法
- 微信小程序获取textarea的值详解
- 集群问题
- oracel循环插入数据
- 通过Fule9.0推送的OpenStack环境管理BareMetal设备
- 常用的三种异步写法
- AOJ.综合训练.2016-12-8
- java FineReport 数据集的坑
- [编程题]进制转换
- 前端-酷炫上传控件
- Django 安装使用基础
- Java学习路程之File
- 绘制平滑线条的winform窗体
- Ext4使用总结(十) 如何在Ext4 的grid中显示精确到秒的时间
- [真格邦]Myeclipse常用注释模板设置