-4

我想给用户一个号码,比如 3,然后给用户 3 个号码

像这样 :

    int n;
    printf("insert one number");
    scanf("%d", n);

    int a;
    for(int i = 1; i <=n; i++){
          scanf("%d", a);
    }

并且不使用数组计算这个......这非常重要,因为使用数组是禁止的

Σa[i]a[j] (i≠j)

输入示例:

3 1 2 3

计算这个

1x2 + 1x3 + 2x1 + 2x3 + 3x1 + 3x2

并输出 22

对不起我的英语不好,有人可以帮助我吗?

4

2 回答 2

2

我将尝试在不实际给您答案的情况下回答这个问题:

由于您输入的第一个数字是您要读取的值的数量,因此您需要单独存储它并使用它来创建一个循环。

您的循环(使用您的示例输入)将需要计算:

(1*2 + 1*3) + (2*1 + 2*3) + (3*1 + 3*2)

这归结为 memo1288 所暗示的:找出数学组件。

于 2013-10-25T18:14:28.917 回答
1

让我们做一些数学运算。根据您给出的示例,完整形式的原始表达式是:

f(a, n) = Σa[i]a[j] (i < n, j < n, j ≠ i)

= Σa[i] (i < n) Σa[j] (j < n, j ≠ i)

当我们用 n+1 替换 n 时,我们得到:

f(a, n+1) = Σa[i] (i < n+1) Σa[j] (j < n + 1, j ≠ i)

= Σa[i] (i < n) Σa[j] (j < n + 1, j ≠ i) + a[n] Σa[j] (j < n + 1, j ≠ n)

= Σa[i] (i < n) Σa[j] (j < n + 1, j ≠ i) + a[n] Σa[j] (j < n)

= Σa[j] (j < n + 1) Σa[i] (i < n, j ≠ i) + a[n] Σa[j] (j < n)

= Σa[j] (j < n) Σa[i] (i < n, j ≠ i) + a[n] Σa[j] (j < n) + a[n] Σa[j] (j < n )

= f(a, n) + 2a[n] Σa[i] (i < n)

换句话说,n 个数字的计算值等于 n-1 个数字的计算值加上 2 * 第 n 个数字乘以所有先前数字的总和。

应该很容易看出如何在不使用数组的情况下做到这一点。您只需要跟踪数字的运行总和以及计算的运行值。

我会让你编写实际的代码,因为这显然是一个家庭作业问题,但这应该是让你开始的大量信息。

于 2013-10-25T18:13:11.743 回答