题:输入一个数,列出所有加和等于该数的式子。
分析:
以 6 为例:
从上面的分析就比较容易找到规律了。
C语言代码:
1 #include <stdio.h> 2 3 int main() 4 { 5 int n; // 输入的数 6 printf("Please input the number:"); 7 scanf("%d",&n); 8 test(n); 9 } 10 11 void test(int n) 12 { 13 if(n==1){ 14 printf("1=1 "); 15 return; 16 } 17 int i,j,k; // 循环变量 18 for(i=1;i<=n/2;i++) 19 { 20 for(j=(n-i);j>=i;j--) 21 { 22 printf("%d",i); 23 for(k=0;k<(n-i-j);k++) 24 { 25 printf("+1"); 26 } 27 printf("+%d=%d ",j,n); 28 } 29 } 30 }
这是同学去面试的时候,给的一道上机题,刚看到我就想用递归(当然,没有做出来),所以……for循环大法好(^_^)
上面的是错的,心痛,这个应该是对的吧,缺点就是只能正常输出20以内的,数组变成指针会好些??
1 #include <stdio.h> 2 int main() 3 { 4 int num; 5 int i,j,k,p,q,r; 6 int flag=1; 7 int a[20]; 8 int temp=0; 9 printf("Please input the number:"); 10 scanf("%d",&num); 11 for(i=2;i<=num;) 12 { 13 if(flag) 14 { 15 for(j=0;j<i;j++) a[j] = 1; 16 a[i-1] = num-(i-1); 17 flag = 0; 18 for(j=0;j<i;j++) 19 { 20 if(j==0) printf("%d",a[j]); 21 else printf("+%d",a[j]); 22 } 23 printf("=%d ",num); 24 } 25 if(!flag) 26 { 27 for(p=2;p<=i;) 28 { 29 for(k=i-1;k>0;k--) 30 if((k-p+1)>=0 && a[k]-a[k-p+1]>=2) 31 { 32 for(q=k;q>=k-p+1;q--) temp += a[q]; 33 a[k-p+1]++; 34 for(r=k-p+2;r<k;r++) a[r]=a[k-p+1]; 35 a[k] = temp - (p-1)*a[k-p+1]; 36 temp=0; 37 for(j=0;j<i;j++) 38 { 39 if(j==0) printf("%d",a[j]); 40 else printf("+%d",a[j]); 41 } 42 printf("=%d ",num); 43 break; 44 } 45 if(k==0) p++; 46 } 47 flag=1; 48 } 49 if(flag) i++; 50 } 51 return 0; 52 }