/*
*时间:2018年4月2日08:19:04-2018年4月2日08:50:17
*题号:1008. 数组元素循环右移问题
*语言:C++ (g++ 4.7.2)
*分数:20
*题目描述:
一个数组A中存有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(M>=0)个位置,
即将A中的数据由(A0 A1……AN-1)变换为(AN-M …… AN-1 A0 A1……AN-M-1)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?
输入格式:每个输入包含一个测试用例,第1行输入N ( 1<=N<=100)、M(M>=0);第2行输入N个整数,之间用空格
分隔。
输出格式:在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。
输入样例:
6 2
1 2 3 4 5 6
输出样例:
5 6 1 2 3 4
*/
#include <iostream>
using namespace std;
int main ()
{
int A[200]; //建立A,由于A的容量N小于100,循环的M%N的余数小于100,所以循环后不会超过200
int N, M;
cin>>N>>M;
int i;
for (i=0; i<N; i++) //输入数组A,下表上限是N-1
{
cin>>A[i];
}
M = M % N;
for (i=N-1; i>=0; i--) //先整体右移M位
{
A[i+M] = A[i];
}
for (i=0; i<M; i++) //前M位赋值为溢出的M位
{
A[i] = A[N+i];
}
for (i=0; i<N-1; i++) //只输出数组前N个,达到题目要求即可
{
cout<<A[i]<<" ";
}
cout<<A[N-1]<<endl; //单独输出A[N-1]由于其后面无空格
return 0;
}
/*
*这题有点钻空子了,并没有让数组达到右移的目的,只是让结果满足要求,其实只要从N-M输出到M再
*从0输出到N-M-1更简便。
*那么如何真正改变数组呢?
*/
/*
*时间:2018年4月2日19:38:58-2018年4月2日2018年4月2日20:48:31
*题号:1012. 数字分类
*语言:C++ (g++ 4.7.2)
*分数:20
*题目描述:
给定一系列正整数,请按要求对数字进行分类,并输出以下5个数字:
A1 = 能被5整除的数字中所有偶数的和;
A2 = 将被5除后余1的数字按给出顺序进行交错求和,即计算n1-n2+n3-n4...;
A3 = 被5除后余2的数字的个数;
A4 = 被5除后余3的数字的平均数,精确到小数点后1位;
A5 = 被5除后余4的数字中最大数字。
输入格式:
每个输入包含1个测试用例。每个测试用例先给出一个不超过1000的正整数N,随后给出N个不超过1000的待分类的
正整数。数字间以空格分隔。
输出格式:
对给定的N个正整数,按题目要求计算A1~A5并在一行中顺序输出。数字间以空格分隔,但行末不得有多余空格。
若其中某一类数字不存在,则在相应位置输出“N”。
输入样例1:
13 1 2 3 4 5 6 7 8 9 10 20 16 18
输出样例1:
30 11 2 9.7 9
输入样例2:
8 1 2 4 5 6 7 9 16
输出样例2:
N 11 2 N 9
*/
#include <iostream>
#include <math.h>
#include <stdio.h>
using namespace std;
int main()
{
int N;
cin>>N;
int S[N];
int i;
int A1 = 0;
int A2 = 0;
int A3 = 0;
double A4 = 0;
int A5 = 0;
int count_A2 = 0;
double count_A4 = 0;
for (i=0; i<N; i++)
{
cin>>S[i];
}
for (i=0; i<N; i++)
{
if (S[i]%10 == 0) //10的倍数
{
A1 += S[i];
}
else if (S[i]%5 == 1) //(-1)^i * ni
{
A2 += pow(-1, count_A2) * S[i];
count_A2++;
}
else if (S[i]%5 == 2)
{
A3++;
}
else if (S[i]%5 == 3)
{
A4 += S[i];
count_A4++;
}
else if (S[i]%5 == 4)
{
A5 = (S[i] > A5)? S[i]: A5;
}
}
A4 = ((A4 == 0)? 0: (A4/count_A4));
if (A1 == 0)
cout<<"N"<<" ";
else
cout<<A1<<" ";
if (count_A2 == 0)
cout<<"N"<<" ";
else
cout<<A2<<" ";
if (A3 == 0)
cout<<"N"<<" ";
else
cout<<A3<<" ";
if (A4 == 0)
cout<<"N"<<" ";
else
printf("%.1f ", A4);
if (A5 == 0)
cout<<"N";
else
cout<<A5;
return 0;
}
/*
*19分,还没检查出错误
*把A1-A5包装成数组会稍微好一点
*/
/*
*时间:2018年4月2日21:23:30-2018年4月2日22:00:38
*题号:1018. 锤子剪刀布
*语言:C++ (g++ 4.7.2)
*分数:20
*题目描述:
大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:
现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。
输入格式:
输入第1行给出正整数N(<=105),即双方交锋的次数。随后N行,每行给出一次交锋的信息,即甲、乙双方同
时给出的的手势。C代表“锤子”、J代表“剪刀”、B代表“布”,第1个字母代表甲方,第2个代表乙方,中间有1个
空格。
输出格式:
输出第1、2行分别给出甲、乙的胜、平、负次数,数字间以1个空格分隔。第3行给出两个字母,分别代表甲、
乙获胜次数最多的手势,中间有1个空格。如果解不唯一,则输出按字母序最小的解。
输入样例:
10
C J
J B
C B
B B
B C
C C
C B
J B
B C
J J
输出样例:
5 3 2
2 3 5
B B
*/
#include <iostream>
using namespace std;
int main()
{
int n;
cin>>n;
char J[n]; //甲乙的手势
char Y[n];
int i;
for (i=0; i<n; i++)
{
cin>>J[i]>>Y[i];
}
int count_JS = 0; //甲乙胜利的次数和平局次数
int count_YS = 0;
int count_P = 0;
int handJ[3] = {0}; //甲乙胜利时的手势
int handY[3] = {0};
for (i=0; i<n; i++)
{
if (J[i] == Y[i]) //平局直接跳过,下面用的是else,所以加不加continue一样
{
count_P++;
//continue;
}
else if (J[i] == 'C') //甲出锤子时
{
if (Y[i] == 'J') //乙出剪刀,甲胜利次数加1,甲的手势为锤子加1
{ //hand[0]-hand[2]分别代表锤子、剪刀、布
count_JS++;
handJ[0]++;
}
else
{
count_YS++;
handY[2]++;
}
}
else if (J[i] == 'J')
{
if (Y[i] == 'B')
{
count_JS++;
handJ[1]++;
}
else
{
count_YS++;
handY[0]++;
}
}
else
{
if (Y[i] == 'C')
{
count_JS++;
handJ[2]++;
}
else
{
count_YS++;
handY[1]++;
}
}
}
cout<<count_JS<<" "<<count_P<<" "<<count_YS<<endl; //先输出甲乙的胜利次数和平局次数
cout<<count_YS<<" "<<count_P<<" "<<count_JS<<endl;
//注意:如果B,C,J的次数有相同,按照字母顺序决定打印的手势,所以把输出B的放到最前面,其次是C
if (handJ[2] >= handJ[0] && handJ[2] >= handJ[1]) cout<<"B"<<" ";
else if (handJ[0] >= handJ[1] && handJ[0] >= handJ[2]) cout<<"C"<<" ";
else cout<<"J"<<" ";
if (handY[2] >= handY[0] && handY[2] >= handY[1]) cout<<"B";
else if (handY[0] >= handY[1] && handY[0] >= handY[2]) cout<<"C";
else cout<<"J";
return 0;
}
【PAT】1008/1012/1018
最新推荐文章于 2018-05-06 23:02:47 发布