生成元(Digit Generator, AMC/ICPC Seoul 2005, UVa1583)

_我已經從中二畢業了發表於2019-05-09

生成元(Digit Generator, AMC/ICPC Seoul 2005, UVa1583)

標籤(空格分隔): c


題目

如果 x 加上 x 的各個數字之和得到的 y,就說 x 是 y 的生成元。給出 n (1 <= n <= 100000),求最小生成元。無解輸出 0。例如,n = 216,121,2005 時的解分別為 198,0,1979。

分析

假設所求的生成元為 m。可以知道 m < n。嘗試列舉所有的 m < n,取出是 n 的生成元,沒有則為 0。

已知 198 是 216 的生成元,計算公式如下:

   198
 = 198 + 1 + 9 + 8
 = 216

解題

第一種:

#include <stdio.h>
#include <string.h>
#define maxn 100005

int ans[maxn];

int main() {
  int T, n;

  memset(ans, 0, sizeof(ans));

  for (int m = 0; m < 217; m++) {
    int x = m, y = m;

    while (x > 0) {
      y += x % 10;
      x /= 10;
    }

    printf("x = %d, y = %d
", x, y);

    if (ans[y] == 0 || m < ans[y]) {
      ans[y] = m;
      printf("ans[y] = %d
", ans[y]);      
    }
  }

  scanf("%d", &T);

  while(T--) {
    scanf("%d", &n);

    printf("%d
", ans[n]);
  }

  return 0;
}

第二種:

#include <stdio.h>

int main() {
  int i = 0, n;

  scanf("%d", &n);

  if (n >= 1 && n <= 100000) {
    for (;;) {
      if (i == 100001) {
        printf("%d
", 0);
        break;
      }

      i++;

      int x = i, y = i;
      
      while (x > 0) {
        y += x % 10;
        x /= 10;
      }
      
      if (y == n) {
        printf("%d
", i);
        break;
      }
    }
  }

  return 0;
}

相關文章