PAT乙级(C++)1016-1020

来源:互联网 发布:手机对比平台软件 编辑:程序博客网 时间:2024/06/06 07:22

1016. 部分A+B

正整数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 <iostream>using namespace std; int main(){    string s1,s2;    int d1,d2;    long sum1=0,sum2=0;    cin>>s1>>d1>>s2>>d2;    for(int i=0;i<s1.length();i++){        if(s1[i]-'0'== d1){            sum1=sum1*10+d1;        }    }    for(int i=0;i<s2.length();i++){        if(s2[i]-'0'==d2){            sum2=sum2*10+d2;        }    }    cout<<sum1+sum2;    return 0;}

1017. A除以B

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

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

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

输入样例:
123456789050987654321 7
输出样例:
17636684150141093474 3


思路:少于1000位的正整数显然不能用int,long类型进行计算,string类型存储数据,模拟做除法的过程即可。


#include <iostream>using namespace std;int main(){    string s1,result1="";//result1为商    long d,temp=0;//temp为余数    cin>>s1>>d;    for(int i=0;i<s1.length();i++){        temp = temp*10+s1[i]-'0';        if(temp>=d){            char c = temp/d+'0';            result1 = result1+ c;            temp = temp%d;        }        else if(result1.length()!=0){            result1 = result1+'0';        }    }    if(result1.length()==0)        result1 = "0";    cout<<result1<<" "<<temp;       return 0;}

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


#include <iostream>using namespace std;int main(){    int N=0;    char jiw,yi;    int result[2][6] ={0};    cin>>N;    for(int i=0;i<N;i++){        cin>>jiw>>yi;        if(jiw=='B'){            if(yi=='B'){                result[0][1]++;                result[1][1]++;            }            else if(yi=='C'){                result[0][0]++;                result[1][2]++;                result[0][3]++;            }            else{                result[0][2]++;                result[1][0]++;                result[1][5]++;            }        }         else if(jiw=='C'){            if(yi=='C'){                result[0][1]++;                result[1][1]++;            }            else if(yi=='J'){                result[0][0]++;                result[0][4]++;                result[1][2]++;            }            else{                result[0][2]++;                result[1][0]++;                result[1][3]++;            }        }        else{            if(yi=='J'){                result[0][1]++;                result[1][1]++;            }            else if(yi=='B'){                result[0][0]++;                result[1][2]++;                result[0][5]++;            }            else{                result[0][2]++;                result[1][0]++;                result[1][4]++;            }        }    }     cout<<result[0][0]<<" "<<result[0][1]<<" "<<result[0][2]<<"\n";    cout<<result[1][0]<<" "<<result[1][1]<<" "<<result[1][2]<<"\n";    int index1=0,index2=0,num1=-1,num2=-1;    for(int i=3;i<6;i++){        if(result[0][i]>num1){            index1=i;            num1 = result[0][i];        }           if(result[1][i]>num2){            index2=i;            num2 = result[1][i];        }    }    if(index1 == 3)        cout<<'B'<<' ';    else if(index1==4)        cout<<'C'<<' ';    else        cout<<'J'<<' ';    if(index2 == 3)        cout<<'B';    else if(index1==4)        cout<<'C';    else        cout<<'J';      return 0;}

1019. 数字黑洞

给定任一个各位数字不完全相同的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


注意1:当输入0的时候,是没有输出的
注意2:当输入6174的时候,是有输出的7641 - 1467 = 6174


#include <stdio.h>#include <algorithm> using namespace std;int cmp(int a,int b){    return a>b;}int main(){    int d1[4],num;    int maxsum, minsum;    scanf("%d",&num);    while(num!=0){        int temp =num;        d1[0] = temp%10;        temp = (temp - temp%10)/10;         d1[1] = temp%10;        temp = (temp - temp%10)/10;         d1[2] = temp%10;        temp = (temp - temp%10)/10;         d1[3] = temp%10;            sort(d1,d1+4,cmp);        maxsum = d1[0]*1000+d1[1]*100+d1[2]*10+d1[3];        minsum = d1[0]+d1[1]*10+d1[2]*100+d1[3]*1000;        num = maxsum-minsum;        printf("%04d - %04d = %04d\n",maxsum,minsum,num);        if(num==0 || num==6174)            break;          }       return 0;}

1020. 月饼

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

注意:销售时允许取出一部分库存。样例给出的情形是这样的:假如我们有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 <iostream>#include <stdio.h>#include <algorithm> using namespace std;struct mooncake{    float value;    float weight; };int cmp(mooncake a,mooncake b){    float yb1 = a.value/a.weight;    float yb2 = b.value/b.weight;    return  yb1>yb2; }int main(){    int N,All;    float maxValue;    cin>>N>>All;    mooncake *allGoods = new mooncake[N];    for(int i=0;i<N;i++){        cin>>allGoods[i].weight;    }    for(int i=0;i<N;i++){        cin>>allGoods[i].value;    }    sort(allGoods,allGoods+N,cmp);    int sum = 0,j=0;    float meanValue;     while(true){        if(j==N)            break;          if((sum + allGoods[j].weight)>All){            meanValue = allGoods[j].value/allGoods[j].weight;             maxValue = maxValue + (All-sum)*meanValue;            break;        }        else{            sum = sum + allGoods[j].weight;            maxValue = maxValue +allGoods[j].value;            if(sum == All)                break;            j++;        }       }    printf("%.2f",maxValue);    return 0;   }

0 0
原创粉丝点击