Chinaunix首页 | 论坛 | 博客
  • 博客访问: 77170
  • 博文数量: 32
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 284
  • 用 户 组: 普通用户
  • 注册时间: 2015-04-26 14:00
个人简介

有梦想的人,正在努力

文章分类

全部博文(32)

文章存档

2015年(32)

我的朋友

分类: C/C++

2015-05-27 23:56:10

    这道题很简单,就是求最小生成元。

这道题的生成元是这样定义的: N的生成元为x加上x的各个位置上的数字之和。

N的范围是1到100000

所以我们有两种方法。第一种是打表
代码如下:

  1. #include <stdio.h>
  2. #include <string.h>

  3. #define maxn 100001

  4. int main(void)
  5. {
  6.     int n, t;
  7.     int ans[maxn];
  8.     memset(ans, 0, sizeof(ans));

  9.     int i;
  10.     for(i = 1; i <= maxn; ++i)
  11.     {
  12.         int x = i, y = i;
  13.         while(x)
  14.         {
  15.             y += x % 10;
  16.             x /= 10;
  17.         }
  18.         if(ans[y] == 0 || ans[y] > i) ans[y] = i;
  19.     }

  20.     scanf("%d", &t);
  21.     while(t--)
  22.     {
  23.         scanf("%d", &n);
  24.         printf("%d\n", ans[n]);
  25.     }
  26.     return 0;
  27. }

第二种就是直接来,不打表:

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int main()
  4. {
  5.     int n;
  6.     int t;
  7.     scanf("%d", &t);
  8.     while(t--)
  9.     {
  10.         scanf("%d", &n);
  11.         int digit = 0;
  12.         int t = n;
  13.         while(t)
  14.         {
  15.             ++digit;
  16.             t /= 10;
  17.         }
  18.         int x;
  19.         for(x = n - digit * 9; x < n; ++x)
  20.         {
  21.             int sum = x;
  22.             int temp = x;
  23.             while(temp)
  24.             {
  25.                 sum += temp % 10;
  26.                 temp /= 10;
  27.             }
  28.             if(sum == n)
  29.             {
  30.                 printf("%d\n", x);
  31.                 break;
  32.             }
  33.         }
  34.         if(x == n)
  35.             printf("0\n");
  36.     }
  37.     return 0;
  38. }

两种都在UvaOJ上AC了,但是,从速度上来说,打表更快,所以以后做题的时候,如果单次计算量较大,就可以考虑打表。


阅读(759) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~