我的程序有时返回true,但并非总是Codewars询问“它们是否相同”

时间:2018-10-03 15:43:55

标签: c algorithm

我是新手,我在Codewars的这个问题上陷入困境。问题是;

  
      
  • “给出两个数组a和b编写一个函数comp(a,b)(在Clojure中为compSame(a,b)),该函数检查两个数组是否具有“相同”元素,并且具有相同的多重性。 “相同”在这里表示b中的元素是平方的元素,与顺序无关。” *

         

    a = [121,144,19,161,19,144,19,11]
        b = [121,14641,20736,361,25921,361,20736,361]

         

    comp(a,b)返回true,因为在b 121中是11的平方,14641是     121、20736平方,144、361平方,19、25921平方     161的平方,依此类推。

         

    如果我们将第一个数字更改为其他数字,则comp可能不会返回true     不再了:

         

    a = [121,144,19,161,19,144,19,11]
         b = [132,14641,20736,361,25921,361,20736,361]

         

    comp(a,b)返回false,因为在b 132中不是任何a的平方。

  •   

我认为可以检查所有数组的算法,但我无法实现。这是C语言。我正在Visual Studio上编写代码,这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <math.h>
int tempVal1;
int tempVal2;

bool comp(int *a, int *b, size_t sizeArray)
{
    if (sizeArray == 0 || sizeArray == 0)
        return false;

    for (int k = 0; k < sizeArray; k++)
    {

        for (int i = 0; i < sizeArray; i++)
        {
            if (a[k] == sqrt(b[i]))
                tempVal1 = 1;
            else
                tempVal1 = 0;
            printf("%d", tempVal1);
        }
    }
    for (int k = 0; k < sizeArray; k++)
    {
        for (int i = 0; i < sizeArray; i++)
        {
            if (b[k] == (a[i] * a[i]))
                tempVal2 = 1;
            else
                tempVal2 = 0;
            printf("%d", tempVal2);
        }
    }

    printf(" tempval1 : %d\n", tempVal1);
    printf(" tempval2 : %d\n", tempVal2);

    if (tempVal1 * tempVal2)
        return true;
    return false;
}

int main() {

    bool result;
    int a[8] = { 121, 144, 19, 161, 19, 144, 19, 11 };
    int b[8] = { 121 * 121, 144 * 144, 19 * 19, 161 * 161, 19 * 19, 144 * 144, 362, 11 * 11 };
    result = comp(a, b, 8);
    printf("%d\n", result);
}

2 个答案:

答案 0 :(得分:0)

一种解决方案是遍历“ b”中每个元素的“ a​​”中每个元素,并检查“ b”中是否存在“ a”的平方。

复杂度为O(n^2)

    bool comp(int *a, int *b, size_t sizeArray)
    {
        for (int k = 0; k < sizeArray; k++)
        {
            for (int i = 0; i < sizeArray; i++)
            {
                if(b[i]<0)
                  return false;
                if ((a[k]==0 && b[i]==0) || (a[k] ==(b[i]/a[k]) && (b[i]%a[k]==0)))
                    break;
                if(i+1==sizeArray)
                  return false;
            }
        }
       return true;
    }

另一种解决方案是对两个数组进行排序-O(nlogn)

并选中if a[i]==b[i]/a[i] && b[i]%a[i]==0,即O(n)

总复杂度为O(nlogn)

答案 1 :(得分:0)

OP的代码在功能上是错误的,因为tempVal1tempVal2仅取决于最终循环a[k] == sqrt(b[i]))(b[k] == (a[i] * a[i])的比较。

相反,内部for (i...)循环需要找到匹配项。如果找不到,请返回false

bool comp(const int *a, const int *b, size_t sizeArray) {
  for (size_t k = 0; k < sizeArray; k++) {
    size_t i;
    for (i = 0; i < sizeArray; i++) {
      long long aa = (long long) a[i] * a[i];
      if (aa == b[k]) {
        break;
      }
    }
    // Since the loop did not exit early, no match was found, return fasle
    if (i == sizeArray) {
      return false;
    }
  }

  for (size_t k = 0; k < sizeArray; k++) {
    size_t i;
    for (i = 0; i < sizeArray; i++) {
      long long aa = (long long) a[k] * a[k];
      if (aa == b[i]) {
        break;
      }
    }
    // Since the loop did not exit early, no match was found, return fasle
    if (i == sizeArray) {
      return false;
    }
  }

  return true;
}

将FP数学用于整数问题会导致最好避免的精度,范围和舍入问题。

考虑没有这些问题的“正方形”测试

bool is_aa_square_of_a(int aa, int a) {
  if (aa < 0) return false;
  if (a == 0) {
    return aa == 0;
  }
  int q = aa/a;
  int r = aa%a;
  return q == a && r == 0; 
}

注意:使用排序数组可以使代码更省时。