正整数A的“DA(为1位整数)部分”定义为由A中所有DA组成的新整数PA。例如:给定A = 3862767,DA = 6,则A的“6部分”PA是66,因为A中有2个6。 现给定A、DA、B、DB,请编写程序计算PA + PB。
#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
int dec(int num,int n){
int a=0;
for(int i=0;i<n;i++){
a=a*10+num;
}
return a;
}
int main(){
//freopen("in.in","r",stdin);
int a,b,pa,pb,count,da,db;
while(scanf("%d %d %d %d",&a,&da,&b,&db)!=EOF){
string a1=to_string(a),b1=to_string(b);
//数字转字符串
char ca,cb;
ca=da+'0';
cb=db+'0';
for(int i=0;i<a1.length();i++){
if(a1[i]==ca)count++;
}
pa=dec(da,count);
count=0;
for(int i=0;i<b1.length();i++){
if(b1[i]==cb)count++;
}
pb=dec(db,count);
printf("%d",pa+pb);
}
return 0;
}
思路:对于一串数字中需要将数字拆出一个一个单独判断,我首先想到将数字当作字符串读入,然后利用字符串的特性和自身方法判断字符串中字符是否和所给的字符相同,计算相同的个数count,直接利用count当作后来结果十进制数字的位数,传入方法中计算十进制数字的结果,让他们相加。看起来很简单,但是在读取数字的时候遇到的困难
困难:
1.字符串分行读取容易,但是同行输入困难,因为空格也会被当作字符读取,
解决方法:将字符串首先当作数字读取,后面转字符串
2. 字符比较需要将后面所给的DA和DB数字转为字符才能比较的吧,所以这也需要自己动手转变
//数字转字符串
char ca,cb;
ca=da+'0';
cb=db+'0';
3.获取十进制数字的方法模板需要背一下,
int dec(int num,int n){
int a=0;
for(int i=0;i<n;i++){
a=a*10+num;
}
return a;
}
以上就是我基于个人想法完成的题目
下面看看神仙大佬们解题思路
方法一:
cin输入好像牛逼一点,,居然能直接输入字符串和数字。
后面使用的方法原理和我的差不多,但是人家的代码写起来就很快不会浪费那么多时间,对考试比较好
int main()
{
string a,b;
long long n,m,sum = 0,_sum = 0;
cin >> a >> n >> b >> m;
for(unsigned int i = 0; i < a.size(); i++) if((a[i]-'0') == n) sum = sum*10+(a[i]-'0');
for(unsigned int i = 0; i < b.size(); i++) if((b[i]-'0') == m) _sum = _sum*10+(b[i]-'0');
cout << sum+_sum << endl;
return 0;
}
方法二:
直接利用原来的输入当作数字输入,使用余数方法可以将整串数字中的数字拆除,这个很好,不用使用字符串,但是要注意数字的范围,如果超出范围需要使用longlong类型的数字
#include <iostream>
using namespace std;
int extractNum(int A, int DA);
int main()
{
int A, DA, B, DB;
cin >> A >> DA >> B >> DB;
int PA, PB;
PA = extractNum(A, DA);
PB = extractNum(B, DB);
cout << PA + PB << endl;
return 0;
}
int extractNum(int A, int DA)
{
int res = 0;
while(A>0) {
int temp = A%10;
if(temp == DA) {
res = res*10 + DA;
}
A /= 10;
}
return res;
}