Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何在除法后得到相等数量的元素,留下余数_C_Multithreading_Formula_Division - Fatal编程技术网

C 如何在除法后得到相等数量的元素,留下余数

C 如何在除法后得到相等数量的元素,留下余数,c,multithreading,formula,division,C,Multithreading,Formula,Division,我知道标题不是最好的描述,但它是我能做的最好的

我知道标题不是最好的描述,但它是我能做的最好的<长话短说,我想得到一系列数字, 比如说:

最小值为0,最大值为10, 所以范围是10。

我想在n个字段中划分范围(用户给出这个输入,所以它是可变的),然后使用fork()创建n个线程子线程,其中每个线程都将获得这些数字的子范围,并使用这些数字执行一些代码,实际上它将检查这个数字是否为素数。
所以我的问题是,我想不出一个公式来写,这样的话,这些数字会被平均分割

我试过:


for(int i=0;i如果您的任务是验证一个数字是否为素数,则较大的数字在较小的组中比较方便(因为验证它们是否为素数比较困难)


您可以使用一个由MAX启动的策略,然后创建以下间隔:{MAX-1,MAX-2}例如(等等),直到您拥有所需的范围数。

如果您的任务是验证一个数字是否为素数,则较大的数字在较小的组中比较方便(因为验证它们是否为素数比较困难)

您可以使用由MAX启动的策略,然后创建以下间隔:{MAX-1,MAX-2}例如(依此类推),直到您拥有所需的范围数

如何在除法后得到相等数量的元素,留下余数

各种方法

一个关键问题是
0
10
是否都包含在整数范围内:是
[0…10]
还是
[0…10)
还是…?请注意
]
?让我们假设包含列表端点,并且
[0…10]
是11个不同的整数值

注:有一些极端情况,例如将11个数字分成12组

下面是从范围的第一个
1/n
部分到剩余范围的
1/(n-1)
部分的子范围,以此类推

void range(int n, int inclusive_min, int inclusive_max) {
  printf("Range [%d %d] / %d\n", inclusive_min, inclusive_max, n);
  for(int i = n; i > 0 && inclusive_min <= inclusive_max; i--) {
    int range = 1 + inclusive_max - inclusive_min;
    int sub_range = range/i;
    if (sub_range == 0) sub_range = 1;
    printf("Sub range [%d %d]\n", inclusive_min, inclusive_min + sub_range - 1);
    inclusive_min += sub_range;
  }
}

int main(void) {
  range(3, 0, 10);
  range(2, 0, 10);
  range(5, 0, 10);
  range(3, 0, 1);
  return 0;
}

更优雅的解决方案,类似于

如何在除法后得到相等数量的元素,留下余数

各种方法

一个关键问题是
0
10
是否都包含在整数范围内:是
[0…10]
还是
[0…10)
还是…?请注意
]
?让我们假设包含列表端点,并且
[0…10]
是11个不同的整数值

注:有一些极端情况,例如将11个数字分成12组

下面是从范围的第一个
1/n
部分到剩余范围的
1/(n-1)
部分的子范围,以此类推

void range(int n, int inclusive_min, int inclusive_max) {
  printf("Range [%d %d] / %d\n", inclusive_min, inclusive_max, n);
  for(int i = n; i > 0 && inclusive_min <= inclusive_max; i--) {
    int range = 1 + inclusive_max - inclusive_min;
    int sub_range = range/i;
    if (sub_range == 0) sub_range = 1;
    printf("Sub range [%d %d]\n", inclusive_min, inclusive_min + sub_range - 1);
    inclusive_min += sub_range;
  }
}

int main(void) {
  range(3, 0, 10);
  range(2, 0, 10);
  range(5, 0, 10);
  range(3, 0, 1);
  return 0;
}

更优雅的解决方案,类似于

void range(int n, int inclusive_min, int inclusive_max) {
  printf("Range [%d %d] / %d\n", inclusive_min, inclusive_max, n);
  int range = 1 + inclusive_max - inclusive_min;
  int sub_range = range / n;
  int sub_range_res = range % n;
  int p = 0;
  for (int i = 0; i < n; i++) {
    int next = inclusive_min + sub_range;
    p += sub_range_res;
    if (2 * p >= n) {  // like p >= n/2 without integer truncation.
      p -= n;
      next++;
    }
    if (next > inclusive_min) {
      printf("Sub range %d:[%d %d]\n", i, inclusive_min, next - 1);
    }
    inclusive_min = next;
  }
}
Range [0 10] / 3
Sub range 0:[0 3]
Sub range 1:[4 6]
Sub range 2:[7 10]
Range [0 10] / 2
Sub range 0:[0 5]
Sub range 1:[6 10]
Range [0 10] / 5
Sub range 0:[0 1]
Sub range 1:[2 3]
Sub range 2:[4 6]
Sub range 3:[7 8]
Sub range 4:[9 10]
Range [0 1] / 3
Sub range 0:[0 0]
Sub range 2:[1 1]