AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 77164838
Accepted
Sai
Sai
Asked: 2023-09-24 04:46:28 +0800 CST2023-09-24 04:46:28 +0800 CST 2023-09-24 04:46:28 +0800 CST

找到能够整除数组中整数之间互不差的最小正整数

  • 772

给定一个由 N 个正整数组成的数组 A。

找到最小的正整数 d, st,不存在整数对 (i,j)(1<=i<j<= N),其中 abs(A_i - A_j) 可被 d 整除。


给定 N 个元素,并假设所有元素都是唯一的,差异的数量可以是:

第 N - 第 1 个、第 N - 第 2 个、...、第 N - 第 (N-1) 个;
第(N-1)个 - 第1个,第(N-1)个 - 第2个,...,第(N-1)个 - 第(N-2)个;
第(N-2)个-第1个、第(N-2)个-第2个、第(N-2)个-第3个、...、第(N-2)个-第(N-3)个;
。
。
。
第二名 - 第一名;
即总共有 N(N-1)/2 个差异。

让整数数组称为:arr。那么,有:

int arr[N];

我不知道如何以比暴力更好的方式解决这个问题,其中绝对存在 O(N^2) 时间复杂度。


但是,似乎更简单的方法是计算两个数字的 gcd,比如说取最小的整数

d = arr[0]

那么是否可以递归计算

gcd(d, arr[i]), i=1,2,3,..., N-1。

但是,我什至不知道它是否正确。

  `
       #include <limits.h>
       #include <stdio.h>
       #include <stdlib.h>
       #include <string.h>

       int checked_atoi (const char *from) {
         char *endptr= NULL;
         long lval= strtol(from, &endptr, 10);
         if (*endptr) {
           fprintf(stderr, "invalid number '%s'\n", from);
           exit(12);
         } 
         else if (lval<INT_MIN || lval>INT_MAX) {
           fprintf(stderr, "value '%ld' out of range\n", lval);
           exit(13);
         }
         return (int)lval;
       }

       int gcd(int a, int b, int c){
         if (b==0)
           return a;
        printf("\n step: %d<> gcd : a: %d, b: %d", c++, a, b);
        return gcd(b, a%b, c);
       }
       int find_smallest_d(int *arr, int N){
         int smallest_d = arr[0];
            printf("\n find_smallest_d");
            for (int i=1; i<N; i++){
               smallest_d = gcd(smallest_d, arr[i], 1);
            }
         return smallest_d;
       }
       int main(int argc, char *argv[]){
          int N=argc-1;
          printf("The size of array: %d", N);
         
          int arr[N];
          for (int i=0; i<N; ++i) {
            arr[i]= checked_atoi(argv[i+1]);
          }
          printf("The %d values:", N);
          for (int i=0; i<N; ++i) {
            printf(" %d", arr[i]);
          }
          printf("\n");
          int smallest_d = find_smallest_d(arr, N);
          printf("\n smallest value of d is: %d", smallest_d);
       }
  `

得到的结果表明程序中逻辑的实现可能是错误的,如获取输入:12,23,34,45,56,67;1. 差异abs(arr[i]-arr[j])的唯一值是:

  `
       1. abs(12-23) = 11,
       2. abs(12-34) = 22,
       3. abs(12-45) = 33,
       4. abs(12-56) = 44,
       5. abs(12-67) = 55,
  `  

因此,gcd应该是11;虽然不清楚是否需要 gcd。

另外,答案应该是:10。

algorithm
  • 1 1 个回答
  • 59 Views

1 个回答

  • Voted
  1. Best Answer
    Iman Mohammadi
    2023-09-24T11:48:39+08:002023-09-24T11:48:39+08:00

    你的方法很有趣,但我发现你的逻辑有问题。让我澄清问题,然后引导您完成解决方案。

    问题陈述要求最小的正整数 (d),使得 ( |A[i] - A[j]| ) 对于任何 (i, j) 对都不能被 (d) 整除。您应该计算数组中所有元素之间的差异,然后确定这些差异的 gcd,而不是直接计算整个数组的 gcd。这是因为,根据定义,如果 (d) 除以数组中的所有差值,则 ( |A[i] - A[j]| ) 将能被 (d) 整除。

    所以,正确的算法是:

    1. 计算数组元素之间的所有差异。
    2. 计算这些差异的 gcd。
    3. 返回 gcd 作为答案。

    以下是更正代码的方法:

    #include <limits.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int checked_atoi (const char *from) {
        // [Your existing checked_atoi implementation]
    }
    
    int gcd(int a, int b){
        if (b == 0) return a;
        return gcd(b, a % b);
    }
    
    int find_smallest_d(int *arr, int N){
        int smallest_d = abs(arr[1] - arr[0]);
        for (int i = 0; i < N; i++){
            for (int j = i + 1; j < N; j++){
                int diff = abs(arr[i] - arr[j]);
                smallest_d = gcd(smallest_d, diff);
            }
        }
        return smallest_d;
    }
    
    int main(int argc, char *argv[]){
        // [Your existing main implementation]
    }
    

    对于给定的输入:12、23、34、45、56、67,差异的 gcd 确实是 11。

    然而,由于计算所有成对差异,这种方法仍然具有 (O(N^2)) 复杂度。根据问题的限制,这可能足够有效,也可能不够有效。

    • -2

相关问题

  • Golang Codewars 中大量测试用例的最后一位失败

  • 编写 LMC 程序来计算用户输入的数字之和。停止前显示总和

  • 如何确定3个水壶问题中的可达状态?

  • 查找从 l 到 r 中按位与等于 0 的自然数对的数量

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    使用 <font color="#xxx"> 突出显示 html 中的代码

    • 2 个回答
  • Marko Smith

    为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类?

    • 1 个回答
  • Marko Smith

    您可以使用花括号初始化列表作为(默认)模板参数吗?

    • 2 个回答
  • Marko Smith

    为什么列表推导式在内部创建一个函数?

    • 1 个回答
  • Marko Smith

    我正在尝试仅使用海龟随机和数学模块来制作吃豆人游戏

    • 1 个回答
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 个回答
  • Marko Smith

    为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)?

    • 4 个回答
  • Marko Smith

    为什么库中不调用全局变量的构造函数?

    • 1 个回答
  • Marko Smith

    std::common_reference_with 在元组上的行为不一致。哪个是对的?

    • 1 个回答
  • Marko Smith

    C++17 中 std::byte 只能按位运算?

    • 1 个回答
  • Martin Hope
    fbrereto 为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 您可以使用花括号初始化列表作为(默认)模板参数吗? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi 为什么列表推导式在内部创建一个函数? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A fmt 格式 %H:%M:%S 不带小数 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python C++20 的 std::views::filter 未正确过滤视图 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute 为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa 为什么库中不调用全局变量的构造函数? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis std::common_reference_with 在元组上的行为不一致。哪个是对的? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev 为什么编译器在这里错过矢量化? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan C++17 中 std::byte 只能按位运算? 2023-08-17 17:13:58 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve