标题:一道计算机报上的难题\C语言QQ群新建
只看楼主
幻帆
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2005-3-29
得分:0 
乌雅你题做的我们都不明白.
能加些注释吗??

2005-04-03 17:10
乌鸦丘比特
Rank: 1
等 级:新手上路
威 望:2
帖 子:625
专家分:0
注 册:2004-7-19
得分:0 
不好意思,上课平时没什么时间,你们先看懂算法,理解算法是关键
我的代码的确很烂(很多都需要knocker那个财迷给我加些注释整理一下才能被看懂)
真的抱歉

我喜欢创造,一只扑腾着翅膀向天空飞翔的乌鸦
2005-04-03 21:30
happyocean
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2005-3-24
得分:0 

上楼的高手 你的我看不懂啊!我也做了一个!请多指教! #include "stdio.h" #include"ctype.h" #define maxsize 10 int max(int k) //求k位二进制数的最大值,例如:2位最大二进制数11,十进制则是1+2=3。 { int i; int j=1; int sum=1; for(i=k;i-1;i--) { j=j*2; sum=sum+j; } return sum; } void your(int num,int x[],int j)//十进制数变成二进制数,用数组记住每位上的数。 { int mask,i; mask = 1<<(j-1); /*构造1个最高位为1、其余各位为0的整数(屏蔽字)*/ for(i=1; i<=j; i++) { (num&mask) ? x[i-1]=1 : x[i-1]=0; /*输出最高位的值(1/0)*/ num <<= 1; /*将次高位移到最高位上*/ } } //算法就是先确定第一个值的可能最大最小值(通过等差数列) //然后申请两个数组,一个放数值,一个放运算符号, //用二进制中的0和1表示运算符号的加和减,而且通过二进制的递增表示每一种可能 //然后判断

void yours(int num,int len) { int i,m,n,s,sum,you; int x[maxsize]; int y[maxsize]; sum=max(len-1); for(i=(int)((num/len)-(len-1)/2)-1;i<=(int)(num/len+(len-1)/2+1);i++) { for(n=0;n<len-1;n++) y[n]=0; x[0]=i; for(m=0;m<=sum;m++) { your(m,y,(len-1)); for(n=0;n<len-1;n++) { you=0; if(y[n]) x[n+1]=x[n]+1; else x[n+1]=x[n]-1; } for(s=0;s<len;s++) you=you+x[s]; if(you==num) { for(s=0;s<len;s++) printf("%d,",x[s]); printf("\n"); } } } }; void main() { int num; int len; printf("请输入num和len\n"); scanf("%d,%d",&num); scanf("%d,%d",&len); printf("答案是:\n"); yours(num,len); printf("如果不输出那就表示是无答案!!!"); }


2005-04-04 08:01
happyocean
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2005-3-24
得分:0 
再发这篇就够十篇拉!

可以看更好的帖子拉!

2005-04-04 10:29
空前
Rank: 1
等 级:新手上路
帖 子:1146
专家分:0
注 册:2004-5-11
得分:0 
继续关注!

2005-04-04 12:07
simpley
Rank: 1
等 级:新手上路
帖 子:262
专家分:0
注 册:2005-2-23
得分:0 
我来说一个算法:设和为M,个数是N,
if(fab(m)&gt;n)无解;
else if(m==n)全部是1;
else if(m==-n)全部是-1;
else{NUM=n-fab(m);
有NUM个1,剩下的就是
有x个1,就有x个-1,其余是0.}
要得出所有的解,只须把这些
1,-1,0进行多重集的排列就行.

myQQ::445750010
2005-04-04 15:32
幻帆
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2005-3-29
得分:0 
谁能不能把这道题说清楚点.好多人都不理解.

2005-04-05 17:59
乌鸦丘比特
Rank: 1
等 级:新手上路
威 望:2
帖 子:625
专家分:0
注 册:2004-7-19
得分:0 
我已经在前面把算法说了一遍,请指出不清楚

我喜欢创造,一只扑腾着翅膀向天空飞翔的乌鸦
2005-04-06 21:24
txbhj
Rank: 1
等 级:新手上路
帖 子:35
专家分:0
注 册:2004-12-19
得分:0 
继续关注.........

我本菜鸟, 请多关照
2005-04-07 11:33
空前
Rank: 1
等 级:新手上路
帖 子:1146
专家分:0
注 册:2004-5-11
得分:0 
“穷举法”:数列每一项都是根据前面一项推出来的,所以可以将所有的情况都运算出来,输出满足条件的那一列,比如
输入 6   1

则中间一个有5个加号或减号进行加1或减1,一共有2的6次方个组合;可以用一个循环从
0开始到2的6次方减1,然后将该数转换成二进制的形势,存入一个数组中,这个数组的二进制0,1状态就是该数列从第一项开始每项之间的+1或-1 状态,具体的C语言代码如下:

#include&lt;stdio.h&gt;
#include&lt;math.h&gt;
#define L 30

void main()
{int a[L]={0};   /*用来存放数列*/
int b[L];    /*用来存放符号状态*/
int m,n,j,s,f;
long i,k,x;
printf("Input 2 numbers(len and sum):");
scanf("%d%d",&amp;m,&amp;n);
printf("len=%d,sum=%d\n\n",m,n);
if(m&gt;30) {printf("The first number is too big!\n");getch();exit(0);} /*超过2的30次方,好象无法运算,退出*/
x=(long)pow(2,m);
f=0;
for(i=0;i&lt;x;i++)
{s=0;
for(j=0;j&lt;m-1;j++)   /*存放符号的数组清零*/
b[j]=0;
j--;
k=i;
while(k)   /*变成二进制形势放入数组中*/
{b[j--]=k%2;
k=k/2;
}
for(j=0;j&lt;m-1;j++)
{if(b[j]) a[j+1]=a[j]+1;  /*根据0,1状态推出后面的每一项*/
else a[j+1]=a[j]-1;
s=s+a[j+1];      /*求数列的和*/
}
if(s==n) {f++;     /*满足条件输出数列*/
for(j=0;j&lt;m;j++)
{if(j%20==0&amp;&amp;j!=0) printf("\n");
printf("%3d",a[j]);
}
printf("\n\n");
if(f%10==0) {printf("Press any key continue...\n");getch();}
}
}
if(!f) printf("No answer!\n");
else printf("There are %d answer.\n",f);
getch();
}


可以运行!

[此贴子已经被作者于2005-4-7 19:59:05编辑过]



2005-04-07 19:52



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-14514-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.448486 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved