【问题描述】 把 2019 分解成 3 个各不相同的正整数之和,并且要求每个正整数都不包 含数字 2 和 4,一共有多少种不同的分解方法?
注意交换 3 个整数的顺序被视为同一种方法,例如 1000+1001+18 和 1001+1000+18 被视为同一种。
思路:把 2019 分解成 3 个各不相同的正整数之和,交换 3 个整数的顺序被视为同一种方法,循环时初始化可以在上一层基础上+1,便不会重复;要求每个正整数都不包 含数字 2 和 4,单独写一个函数处理即可,取余取整
#include <iostream>
#include <stdio.h>
int solve(int i,int j,int k);
int main( )
{
int n,i,j,k,count=0;
scanf("%d",&n);
for(i=1;i<n/2;i++)//因为数是递增的,所以第一个数一定小于n/2
{
for(j=i+1;j<n/2;j++)//因为数是递增的,所以第二个数一定小于n/2
{ //同时各个数不相同,j=i+1
k=n-i-j;//第三个数k
if(k>j)//数是递增的,所以k>j
if(solve(i,j,k)==1)
{
// printf("%d %d %d\n",i,j,k);//查看每次结果
count++;
}
}
}
printf("%d",count);
return 0;
}
int solve(int i,int j,int k)
{
int x;
while(i)//重复去查看每一位数里是否包含2或4
{
x=i%10;
if(x==2||x==4)//只要包含,立即返回
return 0;
i=i/10;
}
while(j)
{
x=j%10;
if(x==2||x==4)
return 0;
j=j/10;
}
while(k)
{
x=k%10;
if(x==2||x==4)
return 0;
k=k/10;
}
return 1;
}