浙大PAT basic level 解题1016-10120

1016. 部分A+B (15)


正整数A的“DA(为1位整数)部分”定义为由A中所有DA组成的新整数PA。例如:给定A = 3862767,DA = 6,则A的“6部分”PA是66,因为A中有2个6。

现给定A、DA、B、DB,请编写程序计算PA + PB

输入格式:

输入在一行中依次给出A、DA、B、DB,中间以空格分隔,其中0 < A, B < 1010

输出格式:

在一行中输出PA + PB的值。

输入样例1:
3862767 6 13530293 3
输出样例1:
399
输入样例2:
3862767 1 13530293 8
输出样例2:
0
#include<stdio.h>
int main()
{
	char a[11]={'\0'},b[11]={'\0'};
	int A,B;
	char c;
	int n1=0,n2=0,i;
	long num1=0,num2=0;
	scanf("%s",a);
	scanf("%d",&A);
	scanf("%s",b);
	scanf("%d",&B);
	n1=strlen(a);
    n2=strlen(b);	
    for(i=0;i<n1;i++)
		if(a[i]-48==A)
			num1=num1*10+A; 
	for(i=0;i<n2;i++)
	  if(b[i]-48==B)
	  	num2=num2*10+B;
	printf("%ld",num1+num2);
	system("pause");
	return 0;
}

1017. A除以B (20)

本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数。你需要输出商数Q和余数R,使得A = B * Q + R成立。

输入格式:

输入在1行中依次给出A和B,中间以1空格分隔。

输出格式:

在1行中依次输出Q和R,中间以1空格分隔。

输入样例:
123456789050987654321 7
输出样例:
17636684150141093474 3
#include<stdio.h>
#define MAX 1000
int main()
{
    char num[MAX+1]={'\0'},Q[MAX+1]={'\0'};
    int x,R;
    int i,j=0,k=0;
    int temp;
    scanf("%s",num);
    scanf("%d",&x);
    for(i=0;i<=strlen(num)-1;i++)
    {
       if(i==0)
       {
          if(num[i]-48>=x)  
          {
             temp=num[i]-48;
             for(j=9;temp-j*x<0||temp-j*x>=x;j--);
             Q[k++]=48+j;
             num[i]=temp-x*j+48; 
          }
          else
             Q[k++]=48;
          if(i==strlen(num)-1)  R=num[i]-48;
          continue;
       }
       temp=(num[i-1]-48)*10+num[i]-48;
       for(j=9;temp-j*x<0||temp-j*x>=x;j--);
       Q[k++]=j+48;
       num[i]=temp-x*j+48; 
       if(i==strlen(num)-1)  R=num[i]-48;
    }   
    i=0;
    while(i<strlen(Q)&&Q[i]==48) i++;
    for(;i<strlen(Q);i++)
       printf("%c",Q[i]);
    if(strlen(num)==1&&num[0]-48<x)  printf("0");
    printf(" ");
    printf("%d",R);
    system("pause");
    return 0;
}

1018. 锤子剪刀布 (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<stdio.h>
#define MAX 100000
int main()
{
	char a[MAX+1],b[MAX+1],temp,c;
	int n;
	int i=0;
	int timesa[3]={0},timesb[3]={0},result[3]={0};
	scanf("%d",&n);
	//fflush(stdin);
	scanf("%c",&temp);
	while(i!=n)
	{
	    scanf("%c%c%c",&a[i],&c,&b[i]);
	    //fflush(stdin);
	    scanf("%c",&temp);
	    i++;
	}
	for(i=0;i<n;i++)
        if(a[i]=='B'&&b[i]=='C'||a[i]=='C'&&b[i]=='J'||
	    a[i]=='J'&&b[i]=='B')
	    {
	   	  timesa[0]+=(a[i]=='B'?1:0);
	   	  timesa[1]+=(a[i]=='C'?1:0);
	   	  timesa[2]+=(a[i]=='J'?1:0);
	   	  result[0]++;
	    }
	    else if(b[i]=='B'&&a[i]=='C'||b[i]=='C'&&a[i]=='J'||
	   	b[i]=='J'&&a[i]=='B')
	    {
	   	  timesb[0]+=(b[i]=='B'?1:0);
	   	  timesb[1]+=(b[i]=='C'?1:0);
	   	  timesb[2]+=(b[i]=='J'?1:0);
	   	  result[2]++;
	    }
	    else result[1]++;
	printf("%d %d %d\n",result[0],result[1],result[2]);
	printf("%d %d %d\n",result[2],result[1],result[0]);
	temp='B';
	if(timesa[0]<timesa[1])
	{
		temp='C';
		if(timesa[1]<timesa[2])
			temp='J';
	}
	else
		if(timesa[0]<timesa[2])
			temp='J';
	printf("%c ",temp);
	temp='B';
	if(timesb[0]<timesb[1])
	{
		temp='C';
		if(timesb[1]<timesb[2])
			temp='J';
	}
	else
		if(timesb[0]<timesb[2])
			temp='J';
	printf("%c",temp);
	system("pause");
	return 0;
}

1019. 数字黑洞 (20)

给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第1个数字减第2个数字,将得到一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞”之称的6174,这个神奇的数字也叫Kaprekar常数。

例如,我们从6767开始,将得到

7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
7641 - 1467 = 6174
... ...

现给定任意4位正整数,请编写程序演示到达黑洞的过程。

输入格式:

输入给出一个(0, 10000)区间内的正整数N。

输出格式:

如果N的4位数字全相等,则在一行内输出“N - N = 0000”;否则将计算的每一步在一行内输出,直到6174作为差出现,输出格式见样例。注意每个数字按4位数格式输出。

输入样例1:
6767
输出样例1:
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
输入样例2:
2222
输出样例2:
2222 - 2222 = 0000
#include<stdio.h>
int cmp(const void *a,const void *b)
{
    return *(char *)a-*(char *)b;
}
int main()
{
    char number[5]={'\0'},c;
    int i,max=0,min=0;
    scanf("%s",number);
    for(i=strlen(number);i<4;i++)
       number[i]=48;
    if(number[0]==number[1]&&number[1]==number[2]&&number[2]==number[3])
       printf("%c%c%c%c - %c%c%c%c = 0000",number[0],number[1],number[2],number[3],
         number[0],number[1],number[2],number[3]);
    else
    {
       while(1)
       {
          max=0;min=0;
          qsort(number,4,sizeof(char),cmp);
          //printf("%s\n",number);
          for(i=3;i>=0;i--)
             max=max*10+number[i]-48;
          for(i=0;i<=3;i++)
             min=min*10+number[i]-48;
          printf("%d - %c%c%c%c = ",max,number[0],number[1],number[2],number[3]);
          number[0]=(max-min)/1000+48;
          number[1]=(max-min)%1000/100+48;
          number[2]=(max-min)%1000%100/10+48;
          number[3]=(max-min)%10+48;
          printf("%c%c%c%c",number[0],number[1],number[2],number[3]);
          if(max-min==6174)
             break;
          printf("\n");
          //c=getchar();
       }
    }
    system("pause");
    return 0;
}

1020. 月饼 (25)

月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量,请你计算可以获得的最大收益是多少。

注意:销售时允许取出一部分库存。样例给出的情形是这样的:假如我们有3种月饼,其库存量分别为18、15、10万吨,总售价分别为75、72、45亿元。如果市场的最大需求量只有20万吨,那么我们最大收益策略应该是卖出全部15万吨第2种月饼、以及5万吨第3种月饼,获得 72 + 45/2 = 94.5(亿元)。

输入格式:

每个输入包含1个测试用例。每个测试用例先给出一个不超过1000的正整数N表示月饼的种类数、以及不超过500(以万吨为单位)的正整数D表示市场最大需求量。随后一行给出N个正数表示每种月饼的库存量(以万吨为单位);最后一行给出N个正数表示每种月饼的总售价(以亿元为单位)。数字间以空格分隔。

输出格式:

对每组测试用例,在一行中输出最大收益,以亿元为单位并精确到小数点后2位。

输入样例:
3 20
18 15 10
75 72 45
输出样例:
94.50

#include<stdio.h>
#define MAX 1000
typedef struct{
	double  store;
	double  value;
	double  price;
	}GOODS;
int cmp(const void *a,const void *b)
{
	return (*(GOODS *)b).price<(*(GOODS *)a).price?-1:1;
}
int main()
{
	int kind;
	double need;
	GOODS goods[MAX];
	int i=0;
	double sum=0.0;
	scanf("%d%lf",&kind,&need);
	while(i!=kind)
	   scanf("%lf",&(goods[i++].store));
	i=0;
	while(i!=kind)
	   scanf("%lf",&(goods[i++].value));
    i=0;
   	while(i!=kind)
   	{
	   goods[i].price=goods[i].value/goods[i].store;
	   i++;
    }
    for(i=0;i<kind;i++)
       sum+=goods[i].store;
    if(sum<=need)
    {
       for(sum=0,i=0;i<kind;i++)
          sum+=goods[i].value;
       printf("%0.2f",sum);
    }
    else
    {
      sum=0.0;
	  qsort(goods,kind,sizeof(GOODS),cmp);
	  for(i=0;i<kind;i++)
	  {
		if(need<=goods[i].store)
		{
			sum+=need*goods[i].price;
			printf("%0.2f",sum);
			break;
		}
		else
		{
			sum+=goods[i].value;
			need-=goods[i].store;
		}
		
	   }
    }
	system("pause");
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值