一道面试题(C语言)

题:输入一个数,列出所有加和等于该数的式子。

分析:

以 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 }
原文地址:https://www.cnblogs.com/Super-Lee/p/9994434.html