大三暑假刷题记录ing,希望能坚持每天都写几道
一、题目描述
PAT 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<10^9。
输出格式:
在一行中输出 PA+PB 的值。
输入样例 1:
3862767 6 13530293 3
输出样例 1:
399
输入样例 2:
3862767 1 13530293 8
输出样例 2:
0
二、题目分析
- 数A中有几个DA,得到PA
- 数B中有几个DB,得到PB
- PA+PB
- 由于A,B的范围为10^9,所以使用string 来存储A,B
- 注意da或db等于0的情况
三、思路与代码
1.思路
- 使用string存放算出来的PA,PB以及加起来的结果并输出
- PA+PB可以通过模拟加法实现。
//PA+PB
int i = a.length()-1;
int j = b.length()-1;
int cf = 0;
string res="";
while(i>=0||j>=0){
int numa = i>=0?a[i]-'0':0;
int numb = j>=0?b[j]-'0':0;
int sum = numa+numb+cf;
res+= (sum%10)+'0';
cf = sum/10;
i--;
j--;
}
if(cf) res.push_back(cf+'0');
reverse(res.begin(),res.end());
2.代码
#include<stdio.h>
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
string A,B;//使用string存放正整数A,B
char da,db;
string a="";//存放算出来PA的结果
string b="";//存放算出来PA的结果
cin>>A>>da>>B>>db;
if(da!='0')
for(int i=0;i<A.length();i++)
{
if(A[i]==da)
a+=da;
}
if(db!='0')
for(int i=0;i<B.length();i++)
{
if(B[i]==db)
b+=db;
}
//PA+PB
int i = a.length()-1;
int j = b.length()-1;
int cf = 0;
string res="";
while(i>=0||j>=0){
int numa = i>=0?a[i]-'0':0;
int numb = j>=0?b[j]-'0':0;
int sum = numa+numb+cf;
res+= (sum%10)+'0';
cf = sum/10;
i--;
j--;
}
if(cf) res.push_back(cf+'0');
reverse(res.begin(),res.end());
for(int i=0;i<res.length();i++)
printf("%c",res[i]);
if(res.length()==0) printf("0");
return 0;
}