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:
代码语言:javascript复制3862767 6 13530293 3
输出样例 1:
代码语言:javascript复制399
输入样例 2:
代码语言:javascript复制3862767 1 13530293 8
输出样例 2:
代码语言:javascript复制0
思路
这个题目就比较简单了,思路也很清晰,统计出现次数,然后转换成n个1再与key相乘即可。
代码语言:javascript复制// 1016 部分A B (15 分).cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include <sstream>
using namespace std;
stringstream ss;
//正数中某个数出现的个数
int count(int number, int key) {
int count_value = 0;
ss << number;
string str = ss.str();
ss.str("");
ss << key;
string key_str = ss.str();
for (int i = 0; i < str.size(); i ) {
if (key_str[0] == str[i])
count_value ;
}
ss.str("");
return count_value;
}
int main(){
//输入
int number_1;
int key_number_1;
int number_2;
int key_number_2;
cin >> number_1 >> key_number_1 >> number_2 >> key_number_2;
//计算出现次数
int count_1 = count(number_1, key_number_1);
int count_2 = count(number_2, key_number_2);
//计算 A 和 B
int temp = 1;
int A = 0;
int B = 0;
while (count_1) {
A = temp;
temp *= 10;
count_1--;
}
temp = 1;
while (count_2) {
B = temp;
temp *= 10;
count_2--;
}
cout << A * key_number_1 B * key_number_2;
}
别人的实现
思路差不多,但比我简洁,主要是他把乘和求sum放在一起了。
代码语言:javascript复制#include<string>
#include<iostream>
using namespace std;
#define ll long long
ll px( string a, int da) {
ll sum=0;
for (int i = 0; i < a.length(); i )
if (a[i]-'0' == da)
sum = sum * 10 da;
return sum;
}
int main() {
string a, b;
int da, db;
cin >> a >> da >> b >> db;
ll sum_a, sum_b;
sum_a = px(a, da);
sum_b = px(b, db);
cout << sum_a sum_b << endl;
return 0;
}