每日刷题(八十)
F、JM找数对
解析:
首先看清题目要求:
- 1~n中的三个不同数,构成无序数对
- 三个数的和为n
- 三个数的数位之和均为偶数
那么我们可以先遍历2~n的偶数,在这层循环下再遍历a + 2~n的数,然后根据三个数和为n作为在第二个循环之下的判断条件,如果n - a - b要大于b并且为偶数,则继续运行;然后进入下一个判断,三个数的数位之和是否均为偶数。
这里可以采用一个巧妙的办法判断是否为偶数,奇数&1=1,偶数&1=0
详细C++代码如下:
#include<iostream>
using namespace std;
bool check(int x)
{
int sum = 0;
int cnt = x;
while(cnt)
{
sum += cnt % 10;
cnt /= 10;
}
return sum & 1; //sum如果为奇数则返回1,偶数返回0
}
int main()
{
int n;
scanf("%d", &n);
int a, b, c;
int cnt = 0;
for(int a = 2; a <= n; a += 2)
{
for(b = a + 2; b <= n; b += 2)
{
c = n - a - b;
if(c <= b || (c & 1))
continue;
if(check(a) || check(b) || check(c))
continue;
cnt++;
}
}
printf("%d\n", cnt);
return 0;
}