母牛天课计算

Zakat of cows calculation

每30头牛天课是一岁母牛,每40头牛天课是两岁母牛。

示例:

30-39 头奶牛 -> zakat: 1 头一岁的奶牛

40-49 头奶牛 -> zakat: 1 头两岁母牛

50-59 头奶牛 -> zakat: 1 头两岁母牛

60-69 头奶牛 -> zakat: 2 头一岁的奶牛

120-129 头奶牛 -> zakat: 3 头两岁的母牛或 4 头一岁的母牛

解释:

30-39 类别:30 组合:30

30-49 类别:40 组合:40

50-59 类别:50 组合:40

60-69 类别:60 组合:30 + 30

120-129 类别:120 组合:40+40+40 或 30+30+30+30

分类清楚。只能使用数字 30 或 40 进行组合。根据组合计算天课。

#include <iostream>
#include <cmath>
int main()
{
    int cows=67;
    int category=cows-cows%10;
    if(30==category)
    std::cout<<"1 cow of one years old";
    if(40==category)
    std::cout<<"1 female cow of two years old";
    if(50==category)
    std::cout<<"1 female cow of two years old";
    if(30+30==category)
    std::cout<<"2 cows of one years old";
    if(30+30+30+30==category||40+40+40==category)
    std::cout<<"4 cows of one years old OR 3 female cows of two years old";
    return 0;
}

你知道如何制作适用于大量数据的组合算法吗?程序应根据组合打印天课。

考虑奶牛的数量,N。

最大two-years头母牛(简称V2)为floor(N/40)。因此,您的天课可能有从 0 到 floor(N/40) 的 V2 数量,这使得 N-40*V2 头牛没有缴税。这些显然需要 floor((N-40*V2)/30) V1 来完成天课。

Pseudo-code:

N := number of cows
MV2 := floor(N/40)
out 'Possible zakat due:'
loop i from 0 to MV2:
    V1 := floor((N-40*i)/30)
    out i, ' female cows of 2 years, ', V1, ' cows of 1 year'
end

您可以将算法复杂化,以确保当有多种组合时,只接受最少未缴税奶牛的组合

例如,如果你有 60 头奶牛,基本算法将在两年内产生 0 到 1 头奶牛:

V2=0, 60 cows remain, V1=2, untithed = 0
V2=1, 20 cows remain, V1=0, untithed = 20

在这种情况下,(1, 0) 解是作弊,必须舍弃。有 112 头奶牛:

V2=0, 112 cows remain, V1=3, untithed = 22
V2=1,  72 cows remain, V1=2, untithed = 12
V2=2,  32 cows remain, V1=1, untithed = 2

这里,最接近的解是2头牛2年,1头牛1年。

在 C:

#include <math.h>
#include <stdio.h>
int main() {
  int cows;
  printf("Enter number of cows: ");
  scanf("%d", &cows);
  int category = cows - cows % 10;
  int N, v2, mx, b1, b2, un, i;
  for (N = 0; N <= cows; N += 10) {
    v2 = floor(N / 40);
    mx = 40;
    b2 = 0;
    b1 = 0;
    for (i = 0; i <= v2; i++) {
      int j = floor((N - 40 * i) / 30);
      un = N - 40 * i - 30 * j;
      if (un <= mx) {
        b2 = i;
        b1 = j;
        mx = un;
      }
    }
    un = N - 40 * b2 - 30 * b1;
    if (N == category) {
      printf("For %d cows, the zakat is:\n", cows);
      if (cows < 30)
        printf("0 cows");
      if (b1)
        printf("%d one years old cows\n", b1);
      if (b2)
        printf("%d two years old female cows\n", b2);
    }
  }
}

输出:

Enter number of cows: 140
For 140 cows, the zakat is:
2 one years old cows
2 two years old female cows