原题:https://pintia.cn/problem-sets/994805260223102976/problems/994805306310115328
正整数 A 的“ D A D_{A} DA(为 1 位整数)部分”定义为由 A 中所有 D A D_{A} DA组成的新整数 P A P_{A} PA。例如:给定 A=3862767, D A D_{A} DA=6,则 A 的“6 部分” P A P_{A} PA是 66,因为 A 中有 2 个 6。
现给定 A、 D A D_{A} DA、B、 D B D_{B} DB,请编写程序计算 P A + P B P_{A}+P_{B} PA+PB。
输入格式:
输入在一行中依次给出 A、
D
A
D_{A}
DA、B、
D
B
D_{B}
DB,中间以空格分隔,其中 0<A,B<
1
0
10
10^{10}
1010。
输出格式:
在一行中输出
P
A
+
P
B
P_{A}+P_{B}
PA+PB的值。
输入样例 1:
3862767 6 13530293 3
输出样例 1:
399
输入样例 2:
3862767 1 13530293 8
输出样例 2:
0
解题方法:
方法1:
把A和B看成整数,每次将A和B右移一位与
D
A
和
D
B
D_{A}和D_{B}
DA和DB比较。
风格1:一般的多项式表达思想
#include<iostream>
using namespace std;
int main() {
int A, DA, B, DB;
cin >> A >> DA >> B >> DB;
//DA和DB的基数,从1开始,每找到一次,就乘以10,可以用pow函数代替
int baseA = 1;
int baseB = 1;
int result = 0;//最后结果
while (A || B) {
if ((A % 10 == DA) && A) {
result += DA*baseA;
baseA *= 10;
}
if ((B % 10 == DB) && B) {
result += DB*baseB;
baseB *= 10;
}
A /= 10;
B /= 10;
}
cout << result << endl;
system("pause");
return 0;
}
风格2:类似于秦九昭算法的思想
#include<iostream>
using namespace std;
int main() {
int A, DA, B, DB;
cin >> A >> DA >> B >> DB;
//最后结果
int resultA = 0;
int resultB = 0;
while (A || B) {
if ((A % 10 == DA) && A) resultA = resultA * 10 + DA;
if ((B % 10 == DB) && B) resultB = resultB * 10 + DB;
A /= 10;
B /= 10;
}
cout << resultA+resultB << endl;
system("pause");
return 0;
}
方法2:
将A和B看成字符串,做字符串匹配
#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;
int i;
for (i = 0; i < A.length(); i++)
if ((A[i] - '0') == DA) resultA = resultA * 10 + DA;
for (i = 0; i < B.length(); i++)
if ((B[i] - '0') == DB) resultB = resultB * 10 + DB;
cout << resultA+resultB << endl;
system("pause");
return 0;
}
当然,DA和DB也可以当作字符,但是计算值的时候要减去0的ASC II码值,即’0’。