HangmanJudgeUVa489
自写:
#include<stdio.h>
#include<string.h>
int main(){
int n, fault , trueNum , length,k;
bool x;
char a[100];
char b[100];
end:while(scanf("%d",&n)!=EOF&&n!=-1){
scanf("%s%s",a,b);
int length = strlen(a);
fault = 0;
trueNum = 0;
x = false;
for(int i = 0 ; i < strlen(b) ; i++){
x=false;
for(int j = 0 ; j<length ; j++){
if(b[i]==a[j])
{
trueNum++;
a[j] = ' ';
// printf("此时正确的字符数字为%d,字符长度为%d,第a[%d]的字符变为空格\n",trueNum,length,j);
x=true;
if(fault>=7) {
printf("Round %d\nYou lose.\n",n);
goto end;
}
if(trueNum==length){
printf("Round %d\nYou win.\n",n);
goto end;
}
}
}
if(x==false) fault++;
if(fault>=7) {
printf("Round %d\nYou lose.\n",n);
goto end;
}
if(trueNum>=length){
printf("Round %d\nYou win.\n",n);
goto end;
}
}
printf("Round %d\nYou chickened out.\n",n);
}
return 0;
}
/*
1. int n 第n个测试 ,char a[]存放正确的字符串,char b[] 存放猜测的字符串,
int fault 存放猜测错误的次数,int trueNum 存放猜对了几个字符,
int length a字符串的长度,bool x ;
2.输入n,输入a[],输入b[],int length = strlen(a),fault = 0 ,trueNum = 0,x=false;
3.for(int i = 0 ; i < strlen(b) ; i++){
x=false;
for(int j = 0 ; j<length ; j++){
if(b[i]==a[j])
{
trueNum++;
a[j] = ' ';
f(fault,trueNum,length,n);
x=true;
}
}
if(x==false) fault++;
f(fault,trueNum,length,n);
}
printf("Round %d\nYou chickened out.\n",n);
4.写一个判断函数//过于麻烦且不好回到开始的状态,所以去掉函数
void f(int fault , int true,int length,int n){
if(fault>=7) {
printf("Round %d\nYou lose.\n",n);
exit(0);
}
if(true==length){
printf("Round %d\nYou chickened out.\n",n);
exit(0);
}
}
*/
例题代码:
#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;
}
MessageDecodingUVa213
自写:
#include<stdio.h>
#include<string.h>
#include<math.h>
#define Maxn 100000
char ch[Maxn];
int Sequence[100000];
int Binary[8][10000];
int k = 0;
int readint(int n){
int sum = 0;
int k;
char cha;
while(n&&(cha = getchar())!=EOF){
if(cha!='\r'&&cha!='\n'){
n--;
k = cha-'0';
sum = sum+k*(int)pow(2,n);
}
}
return sum;
}
int main()
{
F:if(k>0) getchar();
while(gets(ch)){
int len=0 , XiaBiao=0 , X=0;
int Figure = 0, num = 0;
memset(Sequence,-1,sizeof(Sequence));
memset(Binary, -1 ,sizeof(Binary));
re: len = readint(3);
if(len == 0) {
for(int i = 0 ; Sequence[i]!=-1;i++){
printf("%c",ch[Sequence[i]]);
}
printf("\n");
k = 1;
goto F;
}
for(int i = 0; ;){
X = readint(len);
if(X!=pow(2,len)-1){
Binary[len][i] = X;
XiaBiao = pow(2,len) -1 - len + Binary[len][i]; //等比公式
Sequence[num] = XiaBiao;
num++;
i++;
}
if(X==pow(2,len)-1){
goto re;
}
}
}
}
/*
1.设置 int len, XiaBiao, 分别表示二进制长度,最后的输出下标
2.读取一行字符串 char ch[100000]; 读取二进制数int Binary[8][100000]; 行表示二进制数长度,数组内存储对应的
十进制数。并在存储时,将计算好的下标存储在Sequence中。(核心)
问题:1.如何读取一行字符串?
解决方法:gets,fgets 在使用中仍有读取多余空格字符的情况,需要注意。
关于字符串:
问题:1.如何将字符与相应的编码对应,因为不同长度的二进制可能会代表
相同的十进制数字
解决办法:利用等比求和公式,求出对应下标XiaBiao。
关于二进制数的存储:
问题:1.如何将二进制数输入的长度与其字段还有末尾的结束字段分开存储
解决办法:1.首先的三个字符为接下来的编码分段长度,且将首先的三个字符转换为十进制并存储(len)
2.按len将二进制转换为十进制存储
3.遇到len长度的连续1即pow(2,len) - 1 的十进制时停止
3.将字符串与二进制数对应:
输出ch[Sequence[i]];
*/
/*
注意:1.sizeof(buffer)给出的字节数
2.memset()只能赋值初始化0或者-1;
致命逻辑bug:字符串与二进制数不一定按从大到小的顺序数据对应。(致命,导致差点要推翻重写)
*/
例题代码:
#include<stdio.h>
#include<string.h>
#define Maxn 100000
int readchars() {
int ch;
for(; ;){
ch = getchar();
if(ch!='\n' && ch!='\r') return ch;
}
}
int readint(int c){
int v = 0;
while(c--) v = v*2 + readchars() - '0';
return v;
}
int Binary[8][1<<8]; //将1左移八位 1*pow(2,8);
int readcodes(){
memset(Binary, 0 , sizeof(Binary));
Binary[1][0]=readchars();
for(int len = 2; len <= 7; len++){
for(int i = 0 ; i< (1<<len)-1; i++){ //表示1的二进制左移len位。每一个长度有的十进制数与长度有关
int ch = getchar();
if(ch == EOF) return 0;
if(ch =='\n' || ch == '\r') return 1;
Binary[len][i] = ch;
}
}
}
int main()
{
while(readcodes()){
for(; ; ){
int len = readint(3);
if(len == 0) break;
for(; ;){
int v = readint(len);
if(v == (1<<len)-1) break;
putchar(Binary[len][v]);
}
}
putchar('\n');
}
}
ZhiZhenSum
#include<stdio.h>
#include<math.h>
/*
int sum (int *a , int b)
{
int ans = 0;
for(int i = 0 ; i<b ; i++){
ans += a[i];
}
return ans;
}
*/
/*
int sum(int * begin,int * end){
int n = end - begin;
int ans = 0;
for(int i = 0; i<n ; i++)
ans += begin[i];
return ans;
}
*/
int sum(int * begin,int * end){
int *p = begin;
int ans = 0;
for(int *p = begin; p!=end; p++)
ans += *p;
return ans;
}
int main(){
int a[] = {1,2,3,4};
//printf("%d\n",sum(a+1,3));
//printf("%d\n",sum(a,a+3));
printf("%d\n",sum(a,a+4));
return 0;
}
ZuHeShu
#include<stdio.h>
#include<math.h>
long long last(int n , int m){
if(m<n-m) m = n-m ; //使运算次数减少
int ans = 1;
for(int i = m+1 ; i<= n ; i++) ans *= i;
for(int i = i ; i<=n-m ; i++) ans /= i;
return ans;
}
int main()
{
printf("%I64d\n",last(21,1));
}
/*
1.根据组合公式,实际上 last(21,1)==last(21,21-1);
2. n!/m! = (m+1)(m+2)(m+3)...(n-1)n;
*/
ExampleTheDoleQueueUVa133
自写(TimeLimited)
#include<stdio.h>
#include<string.h>
int beginA = 1;
int beginB;
int N ;
void startf(int *a , int k , int m , int length){
for( int j = k ; ; ){
if(a[beginA]!=0){
j--;
}
beginA++;
if(beginA == length+1) beginA = 1;
if(a[beginA]!=0&&j==1){
printf("%3d",a[beginA]);
N--;
a[beginA] = 100;
break;
}
}
for(int j = m ; ; ){
if(a[beginB]!=0){
j--;
}
beginB--;
if(beginB == 0) beginB = length;
if(j==1&&a[beginB]!=0){
if(a[beginB]!=100) {
printf("%3d",a[beginB]);
N--;
}
break;
}
}
a[beginB] = 0;
a[beginA] = 0;
if(N>0) printf(",");
}
int main()
{
int length,k , m;
int a[21];
while(scanf("%d%d%d",&N,&k,&m)==3 && N!=0&&k!=0&&m!=0){
beginB = N;
length = N;
for(int i = 1 ; i<=length ; i++){
a[i] = i;
}
while(N>0){
startf(a,k,m,length);
}
printf("\n");
}
return 0;
}
/*
全局变量 int beginA , int beginB;
1.输入N,k,m 分别代表人数,第一个官员A抽的人数间隔,第二个官员B抽的人数间隔.
2.int N , k , m 并输入,当三者都为0时结束.
int a[20] 放入各项数字
3. 新建一个方法. 传入数组头指针. 传入全局变量beginA,beginB. 传入k. 传入m
根据循环的方式,将A首先选中的人的数组变为数字100(N<=20)
当B最后选中的人是A选中的100时将beginB顺时针减一(注意在一头一尾的情况)
4.
*/
例题代码:
#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+n+d-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,m);
p2 = go(p2,-1,k);
printf("%3d",p1); left--;
if(a[p2]!=a[p1]){
printf("%3d",p2);
left--;
}
a[p1] = a[p2] = 0;
if(left) printf(",");
}
}
return 0;
}