本题需要的注意的点是
1:分解出来的三个数各不相同。同时 如 1001+1000+18 等同于 1000+1001+18
三个数之间没有先后顺序。因而写程序循环时候可以默认 i<j<k 这样可以避免三个数之间的因为顺序不同而产生的重复
2.分解出来的三个数中其各个数位上都不得包括2||4
因而可以写出这样的判断函数
PS:(楼主是一枚萌新~有借鉴了其他大佬的博客的思路!代码如下)
以下介绍两种
1.
bool check(int n)
{
while(n)
{
if(n%10==2||n%10==4)
return false;
n=n/10; //使数位减少(即抹去最低位)
}
return true;
}
2.
这种方式是使用字符串、字符串流
需要用到的函数有stringstream 其头文件为sstream
#include<sstream>
字符串需要用到的头文件为:#include<string>
bool check(int n)
{
string s;
stringstream ss;
ss<<n; //将n输入到字符串流ss中 从变量n->字符串流
ss>>s;
for(int i=0;i<s.size();i++)
{
if(s[i]=='2'||s[i]=='4')
{
return false;
}
}
return true;
}
#include<stdio.h>
#include<iostream>
#include<sstream>
using namespace std;
bool check(int n)
{
string s;
stringstream ss;
ss<<n; //将n输入到字符串流ss中 从变量n->字符串流
//n>>ss; //编译出来说是括号不匹配 (有没有懂的大佬教下。。。为什么不可以这样写)
ss>>s;
for(int i=0;i<s.size();i++)
{
if(s[i]=='2'||s[i]=='4')
{
return false;
}
}
return true;
}
/*bool check(int n)
{
while(n)
{
if(n%10==2||n%10==4)
return false;
n/=10;
}
return true;
}*/
int main()
{
int ans=0;
for(int i=1;i<2019;i++)
{
if(!check(i))
continue;
for(int j=i+1;j<2019-i;j++)
{
if(!check(j))
continue;
//以下这个for循环是暴力法
/* for(int k=j+1;k<2019-i;k++)
{
if(!check(k))
continue;
if(i+j+k==2019)
ans++;
}*/
int k=2019-i-j; //i<j<k 避免出现组合数重复
if(check(k)&&k>j)
{
ans++;
}
}
}
cout<<ans<<endl;
return 0;
}