AOJ.综合训练.2016-12-8
提示:多个题目的代码采用了C ++的写法,对应编译器选择G ++,请不要直接复制代码。
下周实验考试,GOOD LUCK! 感谢汪神提供E题C语言代码
所有题目已更新为C语言写法
所有题目已更新为C语言写法
所有题目已更新为C语言写法
题目总览
题号 | 题目 | 考察点 | 测试情况 |
---|---|---|---|
A | 整数移位 2 | 模拟 | AC 87 ms 464 KB |
B | 约瑟夫环 | 模拟 | AC 0 ms 492 KB |
C | 重排字符 | 排序 string.h使用 | AC 0 ms 492 KB ——> AC 0 ms 448 KB |
D | 字符串 | SET/MAP(STL)/数组 | AC 0 ms 496 KB ——> AC 0 ms 444 KB |
E | 生成全排列 | 递归/STL | AC 146 ms 492 KB——> AC 131 ms 444 KB |
F | 数组旋转 | 水题 | AC 277 ms 532 KB |
G | 对称数 | 回文串 | AC 14 ms 468 KB |
A.整数移位 2
题意分析
模拟循环移位n次。这题AC rate 相当高,分析省(偷懒ing)。
代码总览
#include <stdio.h>
#include <string.h>
#define max 1005
void 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 105
int 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 500
void 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 505
using 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 10
using 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 101
int 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 1001
int 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的更多相关文章
- mysql查询练习题-2016.12.16
>>>>>>>>>> 练习时间:2016.12.16 编辑时间:2016-12-20-->22:12:08 题: 涉及:多表查询.ex ...
- 关于2016.12.12——T1的反思:凸包的意义与应用
2016.12.12 T1 给n个圆,保证圆圆相离,求将圆围起来的最小周长.n<=100 就像上图.考场上,我就想用切线的角度来做凸包.以圆心x,y排序,像点凸包一样,不过用两圆之间的下切线角度 ...
- U3D笔记11:47 2016/11/30-15:15 2016/12/19
11:47 2016/11/30Before you can load a level you have to add it to the list of levels used in the gam ...
- rhel 7.0 配置centos yum源(2016/12/8),成功!
1.首先查看redhat 7.0系统本身所安装的那些yum 软件包: rpm -qa | grep yum #列出所有已安装的yum包 2.删除这些包: rpm -e *.rpm --nodeps # ...
- 更新日志(建议升级到2016.12.17) && 更新程序的方法
更新程序的方法: 1,在控制面板里点击备份当前数据库文件到磁盘,把当天获取的信息从内存写到磁盘/存储卡.2,下载最新版的源码 wget -O "infopi.zip" " ...
- Oracle中把一个DateTime的字符串转化成date类型。to_date('2016/12/8 18:55:43','yyyy/MM/dd hh24:mi:ss'),
Oracle中把一个DateTime或者该形态字符串转化成date类型. to_date('2016/12/8 18:55:43','yyyy/MM/dd hh24:mi:ss'), 或者: sele ...
- My latest news(--2016.12.31)
2016.12.31 前一天晚上看 “纪实新闻” ,白天看视频,晚上刷题,看电影<湄公河行动> 2016.12.30 18:36 昨天上午考完了本学期的最后一门课程,下午乒乓+值班,今天 ...
- AOJ.综合训练.2016-11-24
AOJ.综合训练 友情提示:不要复制粘贴,看完解析先自己尝试写一下.不行再看题解.这样才会有提高! A题 金字塔 题意分析 分别读入10个数,按照他给出的格式输出就行了.注意每有7个字符(包括空格). ...
- 读书笔记:《人有人的用处》------N.维纳. (2016.12.28)
读书笔记:<人有人的用处>------N.维纳 ·某些系统可以依其总能量而和其他系统区别开来. ·在某些情况下,一个系统如果保持足够长时间的运转,那它就会遍历一切与其能量相容的位置和动量的 ...
- 【读书笔记】2016.12.10 《构建高性能Web站点》
本文地址 分享提纲: 1. 概述 2. 知识点 3. 待整理点 4. 参考文档 1. 概述 1.1)[该书信息] <构建高性能Web站点>: -- 百度百科 -- 本书目录: 第1章 绪论 ...
随机推荐
- Appium安装教程
一.适用操作系统Win7 旗舰版Sp1 64位操作系统 或 32位操作系统二.所需软件jdk-7u45-windows-i586.exenode-v0.10.28-x86.msi (32位)下载地址: ...
- Java学习 · 初识 异常机制
异常机制 1. 程序中的异常 a) b) 面对异常如何解决 i. 由开发者通过if-else来解决 代码臃肿 程序员需要花费很大精力 ii. ...
- 记一次Log4j2日志无法输出的 心酸史
问题描述:部分日志无法输出到日志文件中. 项目中的代码: @Resource private ConfigInfo configInfo; private static final Logger lo ...
- Apache POI:Excel读写库
1)Apache POI 简介 Apache POI是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写 ...
- 《javascript模式--by Stoyan Stefanov》书摘--基本技巧
一.基本技巧 1,变量释放的副作用 a.使用var创建的全局变量(在函数外部创建)不能删除. b.不使用var创建的隐含全局变量(尽管在函数内部创建)可以删除. // 定义三个全局变量 var glo ...
- Python如何运行
Python是一种解释型语言,在执行Python的时,解释器将源代码source code翻译成字节码byte code,然后byte code交给Python虚拟机PVM去执行,整个流程如下图所示: ...
- 无法启动mysql服务 错误1067:进程意外中止
这个错误在前些周遇到过,没有解决,直接粗暴的卸载重装了,自己用的是wampserver集成环境,重装的后果是mysql里面的一些已有的数据库就没有了,有点小悲剧,不过幸好都是一些测试用的数据库,后面直 ...
- NSDate常用的日期操作
// 当前时间创建NSDate NSDate *myDate = [NSDate date]; NSLog(@"myDate = %@",myDate); //从现在开始的24小时 ...
- request.getRequestDispatcher不能实现页面跳转的原因
我在JS里面写了个Ajax,传值给servlet,然后利用request.getRequestDispatcher(),打算跳转至另外一个页面.但是没有跳转成功,运行之后没反应. 在网上搜了资料发现, ...
- 理解BitSet
先来看几道面试题: 1.统计40亿个数据中没有出现的数据,将40亿个不同数据进行排序. 2.现在有1千万个随机数,随机数的范围在1到1亿之间,要求写出一种算法,将1到1亿之间没有在随机数中的数求出来. ...