路之后,才豁然开朗,这其实就是我们平时最最常用的
笔算除法模拟。以字符串的形式存储A,然后访问它的每一个字符,转换为对应数值,作为被除数除以B得到商(可为0)和余数,商存入另一个字符串余数乘以10加上下一位数(下一个字符)作为下一次的被除数。唯一需要注意的是,
数字一开始是不存在0的,所以万一一开始是0,要去除0。
源代码:
#include
#include
using namespace std; int main() { string A,Q; int B,R = 0; cin >> A >> B; int lenth = A.size(); int temp = 0; //用于存储上一位的余数用于存储下一位的 int temp1 = 0; //实际每一次的被除数 for(int i = 0;i
1) { //Q.erase(Q[0],Q.size());//为什么会数组越界 Q.erase(Q.begin()); } cout << Q << " " << R <
1018 锤子剪刀布 题目要求:
现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。
输入格式:
输入第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
解题思路: 废话了半天题目,就是两个要求:1.根据输入分别求出甲和乙胜,平,输的场次;2.分别求出甲和乙胜场最多出的是什么,如果相同,优先级分别是B,C,J。所以只需要根据条件,写判断语句就可以,可以用if else 也可以用switch,但是不要漏掉条件。设置9个标志位,3个表示甲的胜,平,输场数(乙与之对应);3个表示甲获胜的手势的个数;3个表示乙获胜的手势的个数。我却一直通不过,后来一想才发现,
甲输的手势不是乙胜利的手势,所以重新修改参数。逻辑计较简单,但是不能弄错,最简单也是最搓的办法多设标志位计数。
源代码:
#include
using namespace std;
char getY(int a,int b,int c)//a = B,b = C ,C = J
{
if(a >= b && a >= c)
return 'B';
if(b > a && b >= c)
return 'C';
if(c > a && c > b)
return 'J';
}
int main()
{
long int N;
int countY = 0,countP = 0,countS = 0;//记录赢平输的个数
int YC = 0 ,YJ = 0,YB = 0,SC = 0,SJ = 0,SB = 0;
cin >> N;
char A,B;
for(int i = 0;i < N;i++)
{
cin >> A >> B;
if(A == 'C')//出锤子的情况
{
if(B == 'C') //平
countP ++;
else if(B == 'J')
{ countY ++; YC ++; }//甲锤子胜场+1
else
{ countS ++; SC ++; }//乙布胜场+1
}
else if(A == 'J')//出剪刀的情况
{
if(B == 'J') //平
countP ++;
else if(B == 'B')
{ countY ++; YJ ++; }//甲剪刀胜场+1
else
{ countS ++; SJ ++; }//乙锤子胜场+1
}
else //出布的情况
{
if(B == 'B')
countP ++;
else if(B == 'C')
{ countY ++; YB ++; }//甲布胜场+1
else
{ countS ++; SB ++; }//乙剪刀胜场+1
}
}
cout << countY << " " << countP << " " << countS <