上面说的是题目,下面给出我的代码,#include <iostream>
using namespace std;
int main()
{
int i,j,k;
for(i=0;i<=10;i++)
for(j=0;j<=5;j++)
for(k=0;k<=3;k++)
if(i*1+j*2+k*5==10)
{
while(i!=0)
{
cout<<1<<"+";
i--;
}
while(j!=0)
{
cout<<2<<"+";
j--;
}
while(k!=0)
{
cout<<5<<"+";
k--;
}
cout<<"=10"<<endl;
}
return 0;
}
不知道我的代码为什么运行结果只有5+5+=10,,一直在那循环输出,求高手指教下,

解决方案 »

  1.   


    for(int i = 1; i <= 10; i++) // 1的个数
    {
        for(int j = 1; j <= 5; j++) // 2的个数
        {
            for(int k = 1; k <= 2; k++) // 5的个数
            {
                if( 1*i + 2*j + 5*k == 10 )
                {
                    cout << "1*" << i+30 << " + 2*" << j+30 << " + 5*" << k+30 << " = 10" << endl;
                }
            }
        }
    }
      

  2.   

    你问题根源出在while(i!=0) { cout<<1<<"+"; i--; }这个块上,i在外变量中,是增的,但是内问是减速的,一旦这个while中,有一个成立,那么对应的那个变量,就永远在0和使得等式成立的那个数中间,一个加,一个减,永远不满足退出for循环的条件。改进建议,if语句块内,定义几个变量,用当前i,j,k的值初始化,并分别对应到while循环中即可。
      

  3.   

    这种问题还是用递归来得爽 :)下面是我的代码,谨供参考。
    // 题目:1,2,5三个数字,每个数字可以有任意多。
    // 问题:求用这三个数字加法组合成10的方案。
    //
    // 递归寻找合适的组合
    // a - 存储当前组合情况的数组(其中第一个位置仅用于启动递归,不在结果中)
    // pos - 下一个数字放在数组中的位置
    // rest - 还剩余需完成的和数
    void comb( int *a, int pos, int rest )
    {
        // 如果当前组合恰好已经符合结果,则输出
        if ( rest == 0 ) {
            for ( int i=1; i < pos; i++ ) {
                printf( "%d ", a[i] );
            }
            printf( "\r\n" );
        }    // 如果已经结束,则返回
        if ( rest <= 0 ) {
            return;
        }    // 如果上一个位置填的数不大于 1,则当前位置试探填 1,并递归
        if ( a[pos-1] <= 1 ) {
            a[pos] = 1; comb( a, pos + 1, rest - 1 );
        }    // 如果上一个位置填的数不大于 3,则当前位置试探填 3,并递归
        if ( a[pos-1] <= 3 ) {
            a[pos] = 3; comb( a, pos + 1, rest - 3 );
        }    // 如果上一个位置填的数不大于 5,则当前位置试探填 5,并递归
        if ( a[pos-1] <= 5 ) {
            a[pos] = 5; comb( a, pos + 1, rest - 5 );
        }
    }void test()
    {
        // 开辟一个缓冲区(第一个位置置 0,用于启动递归)
        int a[11] = {0};    // 递归查找所有的组合方案
        comb( a, 1, 10 );
    }// 1 1 1 1 1 1 1 1 1 1
    // 1 1 1 1 1 1 1 3
    // 1 1 1 1 1 5
    // 1 1 1 1 3 3
    // 1 1 3 5
    // 1 3 3 3
    // 5 5
    ————————————————————————————————
    基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
      

  4.   

    不好意思,题目都看错了,应该是 1,2,5hehe
      

  5.   

    加一些限制,不然可能的情况很多。要分几种情况。
    下面的测试代码显示的是10中情况:
    // LianXi.cpp : 定义控制台应用程序的入口点。
    //#include "stdafx.h"
    #include <iostream>
    using namespace std;
    int _tmain(int argc, _TCHAR* argv[])
    {
    //int i,j,k;
    int i = 0;
    int j = 0;
    int k = 0; for(i=0;i<=10;i++)
    {
    for(j=0;j<=5;j++)
    {
    for(k=0;k<=2;k++)
    {
    if(i*1+j*2+k*5 == 10)
    {
    if(i != 0)
    {
    //cout<<1<<"+";
    cout<<"";
    //i--;
    }
    if(j != 0)
    {
    //cout<<2<<"+";
    cout<<"";
    //j--;    
    }
    if(k != 0)
    {
    //cout<<5<<"+";
    cout<<"";
    //k--;
    } //cout<<"=10"<<endl; cout<<"1*"<<i<<"+"<<"2*"<<j<<"+"<<"5*"<<k<<" = "<<10<<endl;
    }
    }
    }
    }

    system("pause");
    return 0;
    }
    运行结果:
      

  6.   


    才发现,我的代码有点小错错误,cout后面那些30应该是0x30