PAT-basic-1016 部分A+B (15 分)

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、D​B,中间以空格分隔,其中 0<A,B<10^10
输出格式:
在一行中输出 PA+PB的值:
输入样例 1:
3862767 6 13530293 3
输出样例 1:
399
输入样例 2:
3862767 1 13530293 8
输出样例 2:
0

乍一看,感觉简单嘛,但是,好久没写代码,真的,下手难,我太难了…
【方法一】

#include<iostream>
using namespace std;

int change(int M,int N){   //求P 
	int K=0;
	for(int i=0;M!=0;i++){
		if(M%10==N){
			K=K*10+N;
			M=M/10;}
		else
			M=M/10;
	}
	return K;
}

int main(){
	int A,B,D1,D2;
	cin>>A>>D1>>B>>D2;
	cout<<change(A,D1)+change(B,D2)<<endl;
	return 0;
}

**【方法二】string+int **

#include<iostream>
#include<string>

using namespace std;

int main() {
	string A, B;
	int DA, DB;
	cin>>A>>DA>>B>>DB;
	int resultA = 0;  //最后结果
	int resultB = 0;
	for(int i = 0; i < A.length(); i++)
		if ((A[i] - '0') == DA) 
			resultA = resultA * 10 + DA;
	for(int i = 0; i < B.length(); i++) 
		if ((B[i] - '0') == DB) 
			resultB = resultB * 10 + DB;
	cout<<resultA+resultB<<endl;
	return 0;
}

**【方法三】 char+int **

#include<iostream>
using namespace std;

int cal_p(char *a,int b)//将字符串a与da进行对比计算pa
{
    int i=0,count=0;
    while(a[i]!='\0')//循环读取字符串中的数字
    {
        count =(a[i]-'0')==b?count+1:count;//数字相同则增加count
        i++;
    }
    int cal=0;//计算pa
    for(int i=0;i<count;i++){
        cal+=b;
        b*=10;}
    return cal;
}

int main(){
    char a[11], b[11];
    int da,db;
    cin>>a>>da>>b>>db;
    cout << cal_p(a, da)+cal_p(b,db);
    return 0;
}

【方法四】
用c++中string可以不用考虑其字符串长度,对其类型进行转换,将得到的数据从字符串类型转换为整型,sstream函数里的stringstream可以实现
void main(){
// int 转 string
stringstream ss;
int n = 123;
string str;
ss<<n;
ss>>str;
// string 转 int
str = “456”;
n = atoi(str.c_str());}

#include <iostream>
#include <sstream>
#include <string>
using namespace std;

int main(){
    string s1, s2;
    string a = "";
    string b = "";
    char Da, Db;
    cin >> s1 >> Da >> s2 >> Db;
    /* 下标操作符[] 在使用时不检查索引的有效性,如果下标超出字符的长度范围,会示导致未定义行为。
    对于常量字符串,使用下标操作符时,字符串的最后字符(即 '\0')是有效的。
    对应 string 类型对象(常量型)最后一个字符的下标是有效的,调用返回字符 '\0'。
   函数 at() 在使用时会检查下标是否有效。
   如果给定的下标超出字符的长度范围,系统会抛出 out_of_range 异常。*/
    for(int i = 0; i < s1.length(); i++){
        if(s1.at(i) == Da){   //s1.at()类似指针 
        a =a+ s1.at(i);}
       }
    for(int i = 0; i < s2.length(); i++){
        if(s2.at(i) == Db){
            b = b + s2.at(i);}
    }
    int pa = 0, pb = 0;     
    stringstream ss1, ss2;        //包含在sstream函数中,可以将字符串类型转换为整型 
    ss1 << a;    //向ss1流中传入a 
    ss1 >> pa;    //向pa中写入流入ss1后转换成int类型的值 
    ss2 << b;    //向ss2流中传入b 
    ss2 >> pb;    //向pb中写入流入ss2后转换成int类型的值
    cout << pa + pb << endl;
    
    return 0;
 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Nature68c

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值