CodeForces 375A Divisible by Seven

A. Divisible by Seven

You have number a, whose decimal representation quite luckily contains digits 1, 6, 8, 9. Rearrange the digits in its decimal representation so that the resulting number will be divisible by 7.

Number a doesn’t contain any leading zeroes and contains digits 1, 6, 8, 9 (it also can contain another digits). The resulting number also mustn’t contain any leading zeroes.

Input
The first line contains positive integer a in the decimal record. It is guaranteed that the record of number a contains digits: 1, 6, 8, 9. Number a doesn’t contain any leading zeroes. The decimal representation of number a contains at least 4 and at most 106 characters.

Output
Print a number in the decimal notation without leading zeroes — the result of the permutation.

If it is impossible to rearrange the digits of the number a in the required manner, print 0.

Sample test(s)
input
1689
output
1869
input
18906
output
18690

题目传送门

题意:给一个很大的数字,对这个数字进行重新排列,使其能整除7,而且这个书里面必定包含1 6 8 9.

这道题就是找规律,可以把这个数字分成三部分,0放在最后,1689这个数字的组合放在中间,其余数字放在最前面。

0放在最后对整个运算不影响,所以不管。

现在可以说是相当于 (其余数字)和(1689组合数字) 对7的运算,就把这个数字分成万位及以上和万位以下。万位以上数字单独处理,用来对7取余,然后留下一个余数,这个余数可能是0 1 2 3 4 5 6。相当于是找出 (10000+(1689组合))%7 == 0,(20000+(1689组合))%7 == 0…………

((10000+(1689组合))%7 == 0
->(10000%7 + (1689组合)%7 )%7 == 0
然后找出 10000%7 + (1689组合)%7 == 7 就行了

然后就随便算一下就有了

我理了几个

1689%7 ==2
1698%7 == 4
1869%7 == 0
1968%7 == 1
1896%7 == 6
1986%7 == 0
6189%7 == 1
6198%7 == 3
8169%7 == 0
9168%7 == 5
8196%7 == 6
9186%7 ==2

CODE

#include"stdio.h"
#include"iostream"
#include"algorithm"
#include"string.h"
#include"math.h"
#include"stdlib.h"
const int maxn = 1e6+10;
using namespace std;

char s[maxn];
int main(void)
{
    while(scanf("%s",s) !=EOF)
    {
        int num = 0;
        int len = strlen(s);
        int flag[10] = {0};
        for(int i = 0;i < len;i++)
        {
            if(s[i] == '0') flag[0]++;
            else if(s[i] == '1' && !flag[1]) flag[1]++;  ///1689这个用于组合的数字每一位都只需要一个,其他的直接输出就是
            else if(s[i] == '6' && !flag[6]) flag[6]++;
            else if(s[i] == '8' && !flag[8]) flag[8]++;
            else if(s[i] == '9' && !flag[9]) flag[9]++;
            else
            {
                printf("%c",s[i]);
                num = num*10+s[i]-'0';
                num %= 7;
            }
        }
        int t;
        if(num == 0) t = 1869;       ///1869%7 == 0
        else if(num == 1) t = 6198;  ///10003%7 == 0
        else if(num == 2) t = 1896;  ///20006%7 == 0
        else if(num == 3) t = 1689;  ///30002%7 == 0
        else if(num == 4) t = 1986;  ///40005%7 == 0
        else if(num == 5) t = 1968;  ///50001%7 == 0
        else if(num == 6) t = 1698;  ///60004%7 == 0
        printf("%d",t);
        while(flag[0]--)
        {
            printf("0");
        }
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值