11月13日 - 11月19日(H12 拱猪计分, H13 高精度加减法)

H12【选做▪游戏】拱猪计分

题目描述

014a50852c8c406a8b6a5ad217373daf.png13fe44d9f60449d3b12771de68f30015.png

思路 

就是根据题目意思模拟相应的情况就行

代码实现

#include <stdio.h>  
#include <string.h> 
//判断某玩家手里是否存在某张牌 
int isPoker(char pokers[56][4],int n,char poker[4]){  
    for(int i=0;i<n;i++){  
        if(strcmp(pokers[i],poker)==0) return 1;  
    }  
    return 0;  
}  
//判断红心牌是否在同一人手里,如果是则返回这个人对应下标 
int isSame(char poker[4][56][4],int nums[4]){  
    int heart=-1;  
    for(int i=0;i<4;i++){  
        for(int j=0;j<nums[i];j++){  
            if(poker[i][j][0]=='H'){  
                if(heart!=-1 && heart!=i){  
                    return -1;  
                }else if(heart==-1){  
                    heart=i;  
                }  
            }  
        }  
    }  
    return heart;  
}  
int main(){   
    int nums[4]={0,},heartScore[13]={-50,-2,-3,-4,-5,-6,-7,-8,-9,-10,-20,-30,-40},playerScores[4]={0,};  
    char poker[4][56][4]={0,}; //表示四个人手里的牌 
    while(1){  
        for(int i=0;i<4;i++){  
            playerScores[i]=0;//初始化玩家的分数  
            scanf("%d",&nums[i]);  
            for(int j=0;j<nums[i];j++){  
                scanf("%s",poker[i][j]);  
            }  
        }  
        if(nums[0]==0 && nums[1]==0 && nums[2]==0 && nums[3]==0) //如果四名玩家手上牌数皆为零,跳出循环 
            break;  
        if(isSame(poker,nums)!=-1){ //如果红心牌在同一人手里 
            if(nums[0]!=16 && nums[1]!=16 && nums[2]!=16 && nums[3]!=16){  //同时不存在一玩家持有所有16张计分牌
                int heartPlayer=isSame(poker,nums),heartCount=0; 
                playerScores[heartPlayer]=200;  //红心牌以+200分计算
                //如果S12、D11皆在吃下所有红心牌之一家 
                if(isPoker(poker[heartPlayer],nums[heartPlayer],"S12") && isPoker(poker[heartPlayer],nums[heartPlayer],"D11")){  
                    playerScores[heartPlayer]+=500;  
                }  
            }else{ //一玩家持有所有 16 张计分牌,得 +1000分,其余三家均得零分
                for(int i=0;i<4;i++){  
                    if(nums[i]==16) playerScores[i]=1000;  
                }  
            }  
        }else{ //如果红心牌不在同一人手里 ,按照规则计算红心牌的分数 
            for(int i=0;i<4;i++){  
                for(int j=0;j<nums[i];j++){  
                    if(poker[i][j][0]=='H'){  
                        if(strlen(poker[i][j])==2){  
                            playerScores[i]+=heartScore[poker[i][j][1]-'0'-1];  
                        }else{  
                            playerScores[i]+=heartScore[poker[i][j][2]-'0'+9];  
                        }  
                    }  
                }  
            }  
        }  
        //计算S12,D11牌的分数(虽然若红心牌在同一家且S12、D11皆在吃下所有红心牌之一家其记分规则有所不同但一加一减刚好抵消)
		//在这里说一下,题目中其实并没有交代如果红心牌在同一家,但S12、D11不全在红心牌那家时 ,S12,D11牌的分数,但根据测试案例来看,是与红心牌不在同一家记分规则相同的 
        for(int i=0;i<4;i++){  
            if(isPoker(poker[i],nums[i],"S12")){  
                playerScores[i]-=100;  
            }  
            if(isPoker(poker[i],nums[i],"D11")){  
                playerScores[i]+=100;  
            }  
        }  
        //计算C10的分数 
        for(int i=0;i<4;i++){  
            if(isPoker(poker[i],nums[i],"C10") && nums[i]!=16){  
                playerScores[i]=playerScores[i]==0?50:playerScores[i]*2;  
            }  
        }  
        for(int i=0;i<4;i++){  
            if(playerScores[i]==0){  
                printf("0");  
            }else{  
                printf("%+d",playerScores[i]);  
            }  
            if(i!=3) printf(" ");  
        }  
        printf("\n");  
    }  
    return 0;   
}  

                           H13【选做▪大学】高精度加减法

题目描述

3076285793844e44877eaea00ca475b5.png

思路

1.以字符串形式输入数据,将其转化为倒序的数组形式(便于后面进行加减法操作)

2.判断符号位置及种类,后将符号改为0(将原字符串分割为两个字符串)

3.进行对应的加法或减法操作

(加法实现:将和的位上数字初始化为前一位进位数,再加上两加数对应位上数字之和,判断和该位上数字是否大于9,同时根据结果对和的下一位上数字进行初始化,不断重复此操作。

   减法实现:判断两数大小,如果被减数小于减数,则将二者调换,同时标记差为负数。当被减数不小于减数时,将差的位上数字初始化为前一位退位数,再加上两加数对应位上数字之差,判断差该位上数字是否小于0,同时根据结果对差的下一位上数字进行初始化,不断重复此操作)

代码实现 

#include <stdio.h>  
#include <string.h>
void init(char str[],int nums[]){
	nums[0]=strlen(str);
	for(int i=1;i<=strlen(str);i++){
		nums[i]=str[nums[0]-i]-'0';
	}
}
int numscmp(int num1[],int num2[]){
	if(num1[0]<num2[0]) return -1;
	if(num1[0]>num2[0]) return 1;
	for(int i=num1[0];i>0;i--){
		if(num1[i]<num2[i]) return -1;
		if(num1[i]>num2[i]) return 1;
		if(i==1) return 0;
	}
}
void add(int num1[],int num2[],int sum[]){
	for(int i=1;i<=(num1[0]>num2[0]?num1[0]:num2[0])+1;i++){
		sum[i]+=num1[i]+num2[i];
		sum[i+1]=sum[i]>=10?1:0;
		sum[i]=sum[i]>=10?sum[i]-10:sum[i];
		if(sum[i]!=0) sum[0]=i;
	}
}
void sub(int num1[],int num2[],int del[]){
	if(numscmp(num1,num2)<0){
		sub(num2,num1,del);
		del[0]=-del[0];
	}else{
		for(int i=1;i<=num1[0];i++){
			del[i]+=num1[i]-num2[i];
			del[i+1]=del[i]<0?-1:0;
			del[i]=del[i]<0?del[i]+10:del[i];
			if(del[i]!=0) del[0]=i;
		}
	}
}
void restore(char str[],int nums[]){
	int isNegative=nums[0]>0?0:1;
	nums[0]=nums[0]>0?nums[0]:-nums[0];
	if(isNegative) str[0]='-';
	for(int i=isNegative;i<nums[0]+isNegative;i++){
		str[i]=nums[nums[0]+isNegative-i]+'0';
	}
	str[nums[0]+isNegative]=0;
}
int main(){
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		char str[1010]={0,};
		int num1[600]={1,},num2[600]={1,},answer[600]={1,0,},operation=0,signIndex=0;
		scanf("%s",str);
		for(signIndex=0;signIndex<strlen(str);signIndex++){
			if(str[signIndex]=='+') operation=1;
			if(str[signIndex]=='-') operation=-1;
			if(operation!=0) break;
		}
		str[signIndex]=0;
		init(str,num1);
		init(&str[signIndex+1],num2);
		if(operation==1) add(num1,num2,answer);
		if(operation==-1) sub(num1,num2,answer);
		restore(str,answer);
		printf("%s\n",str);
	}
    return 0;   
}  

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值