zoukankan      html  css  js  c++  java
  • 数论(数论题)

    数论

    Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u

    Description

    给出一个数N,含有数字1,2,3,4.把N的所有位数重新排列一下组成一个新数,使得它是7的倍数。

    Input

    第一行测试数据的总数T(T<=10000)。
    接下来T行每行一个整数N,N不超过20位。

    Output

    如果存在这样的排列则随便输出一个符合的排列。
    否则输出0.

    Sample Input

    2

    1234

    531234

    Sample Output

    4123

    354123

    //听说是腾讯某次面试题,有意思。错了很多次 Orz

    由1 2 3 4 组成的排列可以余7为 0-6 所以,无论给的什么符合要求的数,都可以余7为0

    举个栗子

    a1b2c3d4

    把 1 2 3 4 拿出来

    使得该数字变为 abcd0000 不管余多少 加上一个 1234 的排列补充就好

    数字很大,不能 long long 要当字符串处理

    然而,还有个坑,如果除了1234都是0呢,所以,abcd 要降序排序一下,再去求 abcd0000 的余

    还有,如果 str[0] 还是0 就得输出 1234 的一个排列余 7 为 0 的再把 0 输出

    31ms

     1 #include <stdio.h>
     2 #include <math.h>
     3 #include <string.h>
     4 #include <algorithm>
     5 using namespace std;
     6 
     7 int cmp(char x,char y)
     8 {return x>y;}
     9 
    10 const int remain[7]={3241,3214,3124,2341,2314,1342,2134};
    11 
    12 int Yu7(char str[])
    13 {
    14     int len = strlen(str);
    15     int y=0;
    16     for(int i=0;i<len;i++)
    17     {
    18         y+=str[i]-'0';
    19         y%=7;
    20         y*=10;
    21     }
    22     y/=10;
    23     return y;
    24 }
    25 
    26 int main()
    27 {
    28     int T;
    29     char str[25];
    30     char real[25];
    31     scanf("%d",&T);
    32     while (T--)
    33     {
    34         scanf("%s",&str);
    35         int ti[5]={0};
    36         int i,len = strlen(str);
    37         int e,s=0;
    38         for (i=0;i<len;i++)
    39         {
    40             e=str[i]-'0';
    41             //抽出四个数1234
    42             if (e<=4&&e>=1&&ti[e]==0)
    43             {
    44                 ti[e]=1;
    45                 continue;
    46             }
    47             real[s++]=str[i];
    48         }
    49         sort(real,real+s,cmp);
    50         for (i=0;i<4;i++)
    51         real[s++]='0';
    52         real[s++]='';
    53         int yu = Yu7(real);
    54         if (yu==0) yu=7;
    55         len-=4;
    56         real[len]='';
    57         if (real[0]!='0')
    58         printf("%s%d
    ",real,remain[7-yu]);
    59         else
    60         printf("%d%s
    ",remain[0],real);
    61     }
    62     return 0;
    63 }
    View Code
  • 相关阅读:
    215. 数组中的第K个最大元素
    c++集合的操作
    201. 数字范围按位与
    150. 逆波兰表达式求值
    二叉树的遍历算法
    144. 二叉树的前序遍历
    139. 单词拆分 DP
    131. 分割回文串
    695. 岛屿的最大面积 DFS
    leetcode 200. 岛屿数量 DFS
  • 原文地址:https://www.cnblogs.com/haoabcd2010/p/6048027.html
Copyright © 2011-2022 走看看