题目
小明对数位中含有2、0、1、9 的数字很感兴趣,在1 到40 中这样的数包括1、2、9、10 至32、39 和40,共28 个,他们的和是574,平方和是14362。注意,平方和是指将每个数分别平方后求和。请问,在1 到2019 中,所有这样的数的平方和是多少?
思路
方法一:想要找是否包含字串,很容易想到string的find函数,但是缺点就是需要将每一项都要转换成string。
方法二:对每项逐步取余除10操作,即可获得每项的每位数,对比即可。
代码
方法1:使用string库中的find。
将int转换为string,再进行字符串字串的对比,这里需要注意返回值。
string中find()返回值是字母在母串中的位置(下标记录),如果没有找到,那么会返回一个特别的标记npos。(返回值可以看成是一个int型的数)
//1452: [蓝桥杯2019初赛]平方和
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
int main(){
long long sum = 0;
int a = 0;
string::size_type idx; //string find的返回值
string str;
char c[5];
for(int i = 1; i <= 2019; i++){
stringstream ss;
ss << i;
string str = ss.str();
if(str.find('2') != string::npos){ //不等于即说明存在
sum += i * i;
}
else if(str.find('0') != string::npos){
sum += i * i;
}
else if(str.find('1') != string::npos){
sum += i * i;
}
else if(str.find('9') != string::npos){
sum += i * i;
}
}
cout<<sum;
return 0;
}
方法二:取余逐位判断
//1452 方法二:除10判断
#include <iostream>
using namespace std;
long long ans = 0;
bool check(int num){
bool flag = false;
while(num){
int tmp = num % 10;
if(tmp == 2 || tmp == 0 || tmp == 1 || tmp == 9){
flag = true;
}
num /= 10;
}
return flag ? true : false;
}
int main(){
for(int i=1;i<=2019;i++)
if(check(i))
ans+=i*i;
cout<<ans<<endl;
return 0;
}