P79 侩子手问题
#include<stdio.h>
#include<string.h>
#define maxn 100
int left, chance;
char s[maxn], s2[maxn];
int win, lose;
void guess(char ch){
int bad = 1;
for(int i = 0; i < strlen(s); i++){
if(s[i] == ch){
left--;
s[i] = ' ';
bad = 0;
}
}
if(bad) --chance;
if(!chance) lose = 1;
if(!left) win = 1;
}
int main(){
int rnd;
while(scanf("%d%s%s", &rnd, s, s2) == 3 && rnd != -1){
printf("Round %d\n", rnd);
win = lose = 0;
left = strlen(s);
chance = 7;
for(int i = 0; i < strlen(s2); i++){
guess(s2[i]);
if(win || lose) break;
}
if(win) printf("You win.\n");
else if(lose) printf("You lose.\n");
else printf("You chickened out.\n");
}
return 0;
}
P82 救济金发放
n个人站一圈,逆时针编号为1~n。有两个官员,A从1开始逆时针数,B从n开始顺时针数。在每一轮中,官员A数k个就停下来,官员B数m个就停下来(注意有可能停在同一个人身上)。接下来被选中的官员(1个或2个)离开队伍。 输入n,k,m输出每轮里被选中的人的编号。
#include<stdio.h>
#define maxn 25
int n, k, m, a[maxn];
int go(int p, int d, int t){
while(t--){
do{
p = (p+d+n-1) % n + 1;
}while(a[p] == 0);
}
return p;
}
int main(){
while(scanf("%d%d%d", &n, &k, &m) == 3 && n){
for(int i = 1; i <= n; i++) a[i] = i;
int left = n;
int p1 = n, p2 = 1;
while(left){
p1 = go(p1, 1, k);
p2 = go(p2, -1, m);
printf("%3d", p1);left--;
if(p2 != p1) {
printf("%3d", p2);left--;
}
a[p1] = a[p2] = 0;
if(left) printf(",");
}
printf("\n");
}
return 0;
}
第五章 C++与STL入门
C++版框架
C++版的“a+b程序”
#include<cstdio>
int main(){
int a, b;
while(scanf("%d%d", &a, &b) == 2) printf("%d\n", a+b);
return 0;
}
考虑这样的题目,输入数据每行包含若干个以空格隔开的整数,输出每行中所有整数之和
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
int main(){
string line;
while(getline(cin, line)){
int sum = 0, x;
stringstream ss(line);
while(ss >> x) sum += x;
cout << sum << "\n";
}
return 0;
}
首先用getline函数读一行数据(相当于C语言中的fgets,但由于使用了string类,无须指定字符串最大长度),然后用这一行创建一个“字符串流”——ss。接下来只需像读取cin一样读取ss即可。
|