题目描述
输入一个 n ,将 n 拆成三个数之和,拆分方案不能有重复,三个数不能有任何数的数值为 0 。比如:10=1+2+7 10=1+2+7 和 10=2+1+7 10=2+1+7 属于同一个方案。
输入
一行,一个整数 n(3≤n≤500)
输出
若干行,每行 11个算式。
样例
输入:
10
输出
10=1+1+8 10=1+2+7 10=1+3+6 10=1+4+5 10=2+2+6 10=2+3+5 10=2+4+4 10=3+3+4
分析:
这道题目简单来讲就是把一个整数n拆成由3个数字的组成的加,如果把第一个加数看成i,第二个看成j,第三个看成k,那么这个算式会变成n=i+j+k。我们不难发现,i一定小于n/3,j也一定小于n-i,k我们可以把n减去i和j算出。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,k;
cin>>n;
for(int i=1;i<=n/3;i++)
{
for(int j=1;j<=n-i;j++)
{
k=n-i-j;
cout<<n<<"="<<i<<"+"<<j<<"+"<<k<<endl;
}
}
return 0;
}
当然当你运行会发现这是错误的,因为我们忽略了一个条件if(i<=j&&i<=k&&j<=k) 这样我们才可以保证k不会是负数。
完整代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
for(int i=1;i<=n/3;i++){
for(int j=1;j<=n-i;j++){
if(i<=j&&i<=n-i-j&&j<=n-i-j) cout<<n<<"="<<i<<"+"<<j<<"+"<<n-i-j<<endl;
}
}
return 0;
}