首页 > 解决方案 > 将两个数组相减,但一个会定期重复?

问题描述

我在 C 中遇到了以下数组管理任务,你能帮我吗?以下是我到目前为止编写的代码。

欧空局的天文学家收到了来自世界各地的特殊无线电信号。另一方面,该信号是已知的天然无线电源,它来自中子星的方向,因此这两个信号是混合的。幸运的是,这颗恒星已经被观察了很长时间,所以他们确切地知道它发出什么周期性信号。天文学家应该将中子星的已知周期信号与未知信号区分开来。捕获的信号以及中子星信号被天文学家的数字化机器用于非负整数。转换成一串数字。两个系列之间的区别在于特定无线电信号的数字化版本。编写一个函数,从中子星的已知信号中清除噪声信号。该函数获取三个数组作为参数。前两个是噪声信号和星无线电信号。两者都是非负数序列,由值 -1 关闭(反过来,它不再是系列的一部分,只是关闭它)。噪声信号不短于星号。后者只包含恒星不断重复其无线电信号的一个周期。该函数的第三个参数也是必须生成纯无线电信号的数组。通过从噪声数组的给定元素中减去具有相同序列号的元素来设置。(如果在数组过程中星用完了,我们会根据需要从头开始重复使用它的元素。)清除信号也将只包含非负值(这个不需要单独检查),并且干净的数组也必须以 -1 的值关闭。

#include <stdio.h>
#include <stdlib.h>

void jeltisztitas(int noisy[], int star[], int clean[]) {

    int j = 0;

    if(j <= 2) {
        for (int i = 0; i < sizeof noisy -1 / sizeof noisy[0]; i++, j++) {
            A:
            clean[i] = noisy[i] - star[j];
            if (j >= 3) {
                j = 0;
                goto A;
                }
            }   int k = sizeof noisy -1;
                clean[k] = '\0';
        }
}

标签: arrayscfunctionclion

解决方案


我认为一点点模数学就是解决这个重复问题所需要的。考虑一个简单的例子:

#include <stdio.h>

int main() {
    int a[] = {1, 2, 3, 4, 5, 6, 7};
    int b[] = {1, 2, 3};

    size_t len_a = sizeof(a) / sizeof(a[0]);
    size_t len_b = sizeof(b) / sizeof(b[0]);

    for (int i = 0; i < len_a; i++) {
        size_t i_b = i % len_b;

        printf("%d - %d = %d\n", a[i], b[i_b], a[i] - b[i_b]);
    }
}

输出是:

1 - 1 = 0
2 - 2 = 0
3 - 3 = 0
4 - 1 = 3
5 - 2 = 3
6 - 3 = 3
7 - 1 = 6

我们通过将索引的剩余部分i除以较短数组的长度来实现这一点。在上述情况下,最大索引b2,所以当索引i达到时33 % 30。此模式将重复任意次数。


推荐阅读