20200607做题整理
pat乙真题两道
部分A+B
链接:https://www.nowcoder.com/questionTerminal/fb581ea099a14f5d97c6149cbeee249f
来源:牛客网
正整数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
输出
399
#include<stdio.h>
#include<string.h>
long part(char a[],int num);
int main(void){
int DA,DB;
char A[11],B[11];
scanf("%s %d %s %d",A,&DA,B,&DB);
printf("%d\n",part(A,DA)+part(B,DB));
return 0;
}
long part(char a[],int num){
int len=strlen(a);
int i;
int cnt=0;
long ans=0;
for(i=0;i<len;i++){
if((a[i]-'0')==num)
cnt++;
}
if(cnt==0){ //对于不存在DA的情况返回0
return 0;
}else{
for(i=0;i<cnt;i++)
ans=num+ans*10;
}
return ans;
}
小结
最开始运行出现问题,一方面是函数原型没有在最开始声明,一方面是返回值类型设置的int而不是Long,另外是在下面的part中循环变量稍微简化了。一起更正后拿到ac,但不知是哪一处,想了想觉得函数原型漏了而导致错误的可能性大一点。
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
#include<stdio.h>
#include<string.h>
#define MAX 1001
int main(void){
char a[MAX];
char q[MAX];
int b,r;
scanf("%s %d",a,&b);
int len=strlen(a);
int borr=0,i;
for(i=0;i<len;i++){
q[i]='0'+((a[i]-'0')+borr*10)/b;
borr=(a[i]-'0')+borr*10-(q[i]-'0')*b;
}
if(q[0]=='0'){
for(i=1;i<len;i++){
printf("%c",q[i]);
}
}else{
for(i=0;i<len;i++){
printf("%c",q[i]);
}
}
printf(" %d\n",borr);
return 0;
}
小结
一次过。
借一位的除法(像个小学生一样……)。