1.题目描述
小明对数位中含有2、0、1、9的数字很感兴趣,在1到40中这样的数包括1、2、9、10至32、39和40,共28个,他们的和是574,平方和是14362,立方和是400816。
请问,在1到2019中,所有这样的数的立方和是多少?
2.问题分析
我们需要对1~2019中的每个数进行判断,思路为:对于某个数来说,我们先对它的个位数进行判断,如果个位数是由2、0、1、9组成,则直接将这个数代入计算即可。如果他的个位数不符合2、0、1、9,并且它是有十位数的,那我们就接着对十位数进行判断,十位数符合条件,我们就将此数带入运算,并进行下一个数的判断。以此类推。
注意:上边思路的加粗部分要引起注意,一定要明白在这个数有十位数的情况下,我们才能对十位数进行判断。比如一个数是3,它的个位数并不是由2、0、1、9组成。但我们没有验证3是否有十位数,就对它的十位数进行了判断,(3/10)%10是等于0的,这样我们就把一个不该用来计算的数带入最后的运算了
3.代码部分
#include<iostream>
using namespace std;
int main() {
long long sum = 0;
for (long long i = 1; i <= 2019; i++) {
//下面代码是对个位数进行判断
if (i % 10 == 2 || i % 10 == 0 || i % 10 == 1 || i % 10 == 9)
{
cout<<i<<endl;
sum = sum + i * i * i ;
continue;
}
//下面代码是对十位数进行判断
if (i>=10) {
if ( (i / 10) % 10 == 2 || (i / 10) % 10 == 0 || (i / 10) % 10 == 1 || (i / 10) % 10 == 9) {
sum = sum + i* i * i;
cout<<i<<endl;
continue;
}
}
//下面代码是对百位数进行判断
if (i >= 100) {
if ((i / 100) % 10 == 2 || (i / 100) % 10 == 0 || (i / 100) % 10 == 1 || (i / 100) % 10 == 9)
{
cout<<i<<endl;
sum = sum + i * i * i;
continue;
}
}
//下面代码是对千位数进行判断
if (i >= 1000)
{
if ((i / 1000) % 10 == 2 || (i / 1000) % 10 == 0 || (i / 1000) % 10 == 1 || (i / 1000) % 10 == 9)
{
cout<<i<<endl;
sum = sum + i * i * i;
continue;
}
}
}
cout << sum << endl;
return 0;
}
代码的执行结果为:4097482414389(注意本题是立方和)