瑞星卡卡安全论坛

首页 » 技术交流区 » 系统软件 » 【求助】编程高手救命啊,版主帮忙啊~~救人一命胜造七级浮屠
HOTA - 2005-7-30 21:00:00
一个整数拆分成已知的一组数的和,可以不全取到。
(我的代码生成不了要的答案,需要高手帮忙优化更正一下)


#include <stdio.h>
#include <conio.h>
#define N 6
int a[N+1]={1,57,71,87,97,99,101};
int b[N+1],results=0,mole=580;
int back[N+1]={0};
int c[N+1][20]={0};
void Comout()
{    int i,j=0,k;
    int d[N+1]={0};
    for(i=1;i<=N;i++)
    for(k=1;k<=N;k++) if( c[k]!=0){d=k;break;}
    for (k=1;k<=N;k++) if(d[k]!=back[k]){j=1;break;}
    if(j==1)
    {    for(i=1;i<=N;i++)
            if(d!=0)
            {printf("{%d,%d}",a,d);back=d;}
        results++;printf("\n");
    }

}
void Searchans(int acidnum,int line)
{    int i,k;
    if(acidnum>0)
        {
            for(i=1;i<=b[line];i++)
            {    {c[line]=1;
                mole-=a[line]*i;}
                /*k=acidnum-i*/
                if((k=acidnum-i)>=0)
                {
                    Searchans(k,line+1);
                    {c[line]=0;
                    mole+=a[line]*i;}
                    Searchans(acidnum,line+1);
                }
                else
                {    {c[line]=0;
                    mole+=a[line]*i;}
                    Searchans(acidnum,line+1);
                    break;
                }
            }
        }
    else    if( mole==0) Comout();
}

        void Find()
        {    int i;
               /*    mole-=18;*/
            for(i=1;i<=N;i++) b=mole/a;
        }

        void Finals()
        {    printf("ans is :%d\n",results);}

        void Getmole()
        {    printf("please enter the mole:");
            scanf("%d",&mole);
            /*printf("mole is %d\n",mole);*/
        }
        void Making()
        {    int i,j,k;
            for(j=0;j<=N;j++)
            for(i=b[j]+1;i<20;i++) c[j]=-1;
            for(k=0;k<=N;k++)c[k][0]=-1;
        }
void main()
{      int i,line,j;
    clrscr();
    /*Getmole();*/
    Find();
    Making();
    for(j=1;j<=N;j++) if(b[j]!=0) {line=j;break;}
    for(i=b[N];i<=b[1];i++)    Searchans(i,line);
    Finals();
}
HYPERTEXT - 2005-7-30 22:32:00
帮你顶!
我不太懂C,请问你想把一个整数写成多少个数的和的形式?
我想到的算法是,假如你想把43写成4个正整数和的形式,总共有四个循环,且循环套循环,
for (a=1,a<=43,a++)
for(b=1,b<=43,b++)
for(c=1,c<=43,c++)
for(d=1,d<=43,d++)
if(a+b+c+d=43)
{/*这里输出a,b,c,d四个数值,由于对相关语句格式语法不熟,就写注释了*/}
}}}}
/*不好意思,对C太生疏,所以模仿你的写法写了for和if语句,语法有不对的请见谅*/
HOTA - 2005-7-30 22:43:00
谢谢你。可是问题还是存在,我郁闷啊~~稳被导师骂了。
HYPERTEXT - 2005-7-30 22:47:00
我好像看懂了一小部分。。。我们用了一样的算法,不过你还声明了好几个函数,我看不懂。
HOTA - 2005-7-30 23:05:00
...........................
HYPERTEXT - 2005-7-30 23:08:00
请问阁下能说明一下吗?我想学...
怪物125号 - 2005-7-30 23:13:00
嵌套循环有点太那个了,如果总共有100个,我不昏菜才怪,应该有别的算法。想ing
HYPERTEXT - 2005-7-30 23:23:00
人想起来是很复杂……
但是电脑很快,人告诉电脑后,让电脑想,这便是编程的魅力……
这种嵌套没什么的。
HOTA - 2005-7-30 23:25:00
我昏倒啊,解决问题是关键~~我已经没有时间了。
拜托各位~~~~~~~~~~~~~~~~~~~
HYPERTEXT - 2005-7-30 23:27:00
所以我们才一直在帮你顶啊
HOTA - 2005-7-31 7:02:00
哎,急需帮助啊,各路英雄快快来啊!!!
HOTA - 2005-7-31 11:49:00
怎么没人顶啊,救命啊~~~
HOTA - 2005-7-31 22:28:00
没人顶,我自己顶个!!!

。。。。。。。。。。。。

拜托各位大侠了。。。。。
怪物125号 - 2005-7-31 23:05:00
引用:
【HYPERTEXT的贴子】人想起来是很复杂……
但是电脑很快,人告诉电脑后,让电脑想,这便是编程的魅力……
这种嵌套没什么的。
...........................


如果我能让电脑自己写出来,我不会昏,但算法就完全变复杂了,速度也会慢;而如果自己写嵌套循环,一来昏菜,二来鬼才知道到执行的时候用户会要几层循环啊。

你最好把你的源码发上来,这个论坛会把排版弄乱,我看你的代码时又在昏菜,怎么看你的循环都没有嵌套。,而且连编译都过不了:
像这个
void Comout()
{.....(d是一个int数组,而k是int)
for(k=1;k<=N;k++) if( c[k]!=0){d=k;break;}.......

}
这个d=k肯定是过不去的嘛。晕,肯定又是论坛过滤了的问题
HOTA - 2005-8-1 9:14:00
我怎么不能上传附件啊,郁闷哦~~

能加我QQ联系吗?QQ上很清楚....

157283557,谢谢大侠们了..........
1