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;
}