您的位置:首页 > 编程语言 > C语言/C++

PAT乙级(C++)1016-1020

2016-10-26 13:09 176 查看

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
;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: