-1
   #include <conf.h>
   #include <kernel.h>
   #include <stdio.h>
   #define MAX_ITEMS 50
   typedef long double LD;
   int run_solve_equ();
   void xmain(){
       int pid;
       pid = create(run_solve_equ, 20*INITSTK, INITPRIO, "B", 0);
       resume(pid);
   }
   int solve_equ(LD b, int n, LD a[], int choosen[] ){
       if ( n == 1 )
           if (a[0] == b) {
               choosen[0] = 1;
               return 1;
           } /* if */
           else if (b == 0) {
               choosen[0] = 0;
               return 1;
           } /* else if*/
           else {
               choosen[0] = 0;
               return 0;
           }
       else /* n > 1 */
           if (solve_equ(b, n-1, a, choosen)) {
               choosen[n-1] = 0;
               return 1;
           } /* if */
       else if (solve_equ(b - a[n-1],n-1, a, choosen)) {
           choosen[n-1] = 1;
           return 1;
       } /* else if */
       else{
           choosen[n-1] = 0;
           return 0;
       }
   } /* solve_equ */
   LD a[MAX_ITEMS];
   int choosen[MAX_ITEMS];
   char pstr[200];
   extern long int tod;
   int run_solve_equ() {
       int n, i, result;
       LD b, sum;
       printf("How many numbers? No more than %d:", MAX_ITEMS );
       scanf("%d",&n);
       puts("Enter b:");
       scanf("%Lf",&b);
       a[0] = 1;
       for (i = 1; i < n; i++)
           a[i] = a[i-1]*2;
       result = 0;
       sprintf(pstr, "time = %ld\n", tod);
       printf(pstr);
       result = solve_equ(b,n, a, choosen);
       sprintf(pstr, "time = %ld\n", tod);
       printf(pstr);
       sprintf(pstr, "Solution for b = %Lf, n = %d, value = %d :\n", b,
           n,result);
       printf(pstr);
       printf("\ni:\n");
       for (i = 0; i < n; i++) {
           sprintf(pstr, "%-16d",i);
           printf(pstr);
       } // for
       printf("\na[i]:\n");
       for (i = 0; i < n; i++) {
           sprintf(pstr, "%-16.1Lf", a[i]);
           printf(pstr);
       } // for
       printf("\nchoosen[i]:\n");
       for (i = 0; i < n; i++) {
           sprintf(pstr, "%-16d", choosen[i]);
           printf(pstr);
       } // for
       printf("\n");
       sum = 0;
       for (i = 0; i < n; i++)
           if (choosen[i]) {
               sum += a[i];
               sprintf(pstr, " + %-16.1Lf", a[i]);
               printf(pstr);
           } /* if */
       sprintf(pstr, " = %-16.1Lf\n", sum);
       printf(pstr);
       return 0;
   }

我需要更改此程序,以便搜索将由两个进程“并行”:每个进程将搜索一个 n-1,第一个用户在 [n-1] 上,另一个不搜索。问题是在数组中找到一个数字,所有数字加起来都等于另一个数字 b !

4

1 回答 1

2

不是答案,但我确实对你有一些建设性的意见。

阅读上面的代码很痛苦。它伤害了我的眼睛,也伤害了我的大脑。为什么?

  1. 变量名称是非描述性的,通常是一个字母(在 I 之外)。 b, n, a- 我不知道这些是什么一目了然,我不想通过理解你写的来找出。我打赌你也不会明白你下周写的东西。帮大家一个忙,让名字更好。
  2. 请在您的“代码思想”之间使用一些空格。您的代码看起来像一个冗长的句子,它也隐藏了它的作用。
  3. 不要混合使用大括号和非大括号代码 - 特别是当您的缩进不一致时。现在按照你的 if 逻辑是非常非常困难的。继续浪费几个字节的硬盘空间,也许 0.25 秒添加大括号或至少修复你的缩进。
  4. 写有用的评论。/* if */是一个糟糕的评论,你到处做类似的事情。我知道 if 是什么,但也许不是您正在检查的内容?
  5. 不要在代码中间混合全局变量和外部定义。将它们放在一起,更容易记住什么是全局的,什么不是。这是最轻微的冒犯,其他人可能不同意。

无论如何,您的问题有点偏离主题,因为您自己没有付出什么努力来解决它,所以很可能会结束,但是我的评论可能会帮助您完成未来的编码项目,并且至少会让其他人更容易帮助您往前走。

于 2013-07-31T17:15:13.247 回答