标题:一道计算机报上的难题\C语言QQ群新建
只看楼主
空前
Rank: 1
等 级:新手上路
帖 子:1146
专家分:0
注 册:2004-5-11
得分:0 

改了一下,这个可以运行! #include<stdio.h> #include<math.h> #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",&m,&n); printf("len=%d,sum=%d\n\n",m,n); if(m>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<x;i++) {s=0; for(j=0;j<m-1;j++) /*存放符号的数组清零*/ b[j]=0; j--; k=i; while(k) {b[j--]=k%2; k=k/2; } for(j=0;j<m-1;j++) {if(b[j]) a[j+1]=a[j]+1; else a[j+1]=a[j]-1; s+=a[j+1]; } if(s==n) {f++; for(j=0;j<m;j++) {if(j%20==0&&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-04-09 13:17
空前
Rank: 1
等 级:新手上路
帖 子:1146
专家分:0
注 册:2004-5-11
得分:0 
但数列的长度不能超过23,不知道为什么!

2005-04-09 13:19
llee
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2005-3-6
得分:0 

哈哈,我做啦,是在电脑报中的“编程点将台”的题目。下面请看我的方法啦!!!!! 方法说明:

主要是运用函数递归的思想来解决的.(最要是-1的递归和+1的递归,详细请看源代码)

1.为了算法的效率有必要除去一些不符合情况. 因为Sum一定在-Len*(Len-1)到Len*(Len-1)之间的.因Sum最大只能是0+1+2+3+4+......(Len-1),也就是Len*(Len-1)/2

2.为了方便查看答案,本程序可以采用逐屏显示的方式,通过按回车查看下一屏(最多20个). 具体操作请看程序的提示. #include<stdio.h> #include<math.h> #include<stdlib.h> int Sum,Len,All,N,M,K; double Max; void run(int,int,int f[]); void display(int,int); void main() { for(;;) { int *p; K=0; N=0; M=0; All=0; printf("***请输入Len? Len="); scanf("%d",&Len); printf("***请输入Sun? Sum="); scanf("%d",&Sum); p=(int *)calloc(Len,sizeof(int));/*动态申请内存来放答案,这样就可以打好长的数啦!!*/ Max=pow(2,Len-1);/*Max是最大可能有的种数,2的Len-1次方*/ getchar(); printf("1.不要逐屏显示请按回车\n"); printf("2.要逐屏显示(每次显示最多20个)输入y再回车"); if(getchar()=='y')/*控制逐屏显示,因为有时候太多情况时,不好查看*/ { K=1; getchar(); } if(Sum<-Len*(Len-1)/2||Sum>Len*(Len-1)/2); /*为了算法的效率,Sum应在-Len*(Len-1)/2到Len*(Len-1)/2之间*/ else run(0,Len-1,p); if(N==0) printf("\n***没有这样的情况!\n"); else printf("\n总共有 %d 种情况\n\n",All); free(p); } } void run(int a,int b,int f[]) { f[b]=a; if(M<=Max)/*数M控制进行递归调用的次数,最大到达Max*/ if(b>=1) /*控制递归的返回当b=0时*/ { run(a-1,b-1,f); /*进行-1的递归*/ run(a+1,b-1,f); /*进行+1的递归*/ } else { M++; /*计算递归的次数*/ int add=0; for(int i=Len-1;i>=0;i--) /*求和add*/ add=add+f[i]; if(add==Sum) /*判断是否符合要求*/ { printf("\n"); for(int j=Len-1;j>=0;j--) printf("%d ",f[j]); N=1; /*标记有符合情况*/ All++; /*统计符合题目要求的情况数All*/ printf(" 情况:%d",All); display(All,K); } } } void display(int i,int j)/*控制逐屏显示*/ { if(i%20==0&&j==1) for(;;) { printf("\n1.要显示下一屏(20个)请按回车\n"); printf("2.取消逐屏显示请输入y再回车"); if(getchar()=='y') { K=0; break; } break; } }

[此贴子已经被作者于2005-4-13 20:26:20编辑过]

2005-04-13 20:10
空前
Rank: 1
等 级:新手上路
帖 子:1146
专家分:0
注 册:2004-5-11
得分:0 
晕,上面的代码在标准C编译器中不能运行,但VC中可能行……

标准C的变量要选定义后使用,而上面的却不是这样,这不是C++;

2005-04-16 13:36
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
得分:0 
这是C99标准

九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2005-04-16 14:14
Oo慎独oO
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2008-7-22
得分:0 
我觉得也是不太懂,不过我会一直想下去,直到想明白!
2008-07-22 09:56
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
得分:0 
挖坟了………………

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-07-22 14:21



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




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

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