cf /376/C

题意:题意还是有些问题的!很明显这是一个多组解的题目,但题目并没有注明输出答案之一就可。

 注意题目“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.” 中的 the digits!!  意思只能重拍这1689这几个数字。

长度是10^6,不能暴力,所以就换种角度。一个数%7 不在乎就0-6这几种情况……所以重排1689这几个数字去消掉前面的%7的余数!

第一遍做的时候就手工去组合,因为粗心白白错了好几次。

后来发现,有计算机的时代还用手工?!蠢!

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
char str[1000010];
bool vis[1000010];
int main()
{
 //freopen("in.txt","r",stdin);
 while(~scanf("%s",str))
 {
    int find[5]={0};
    int len=strlen(str);
    int num=0,ans,res=0;
    memset(vis,0,sizeof(vis));
    for(int i=0;i<len;i++)
    {
        if(str[i]=='1'&&!find[0]) find[0]=1,vis[i]=1;
        else if(str[i]=='8'&&!find[1]) find[1]=1,vis[i]=1;
        else if(str[i]=='9'&&!find[2]) find[2]=1,vis[i]=1;
        else if(str[i]=='6'&&!find[3]) find[3]=1,vis[i]=1;
        else if(str[i]=='0')num++,vis[i]=1;
    }
    for(int i=0;i<len;i++)
    if(vis[i]==0)
    {
        printf("%c",str[i]);
        res=res*10+str[i]-'0';
        res%=7;
    }
    char p[]="1689";
    do{
         ans=res;
         for(int i=0;i<4;i++)
            ans=ans*10+p[i]-'0',ans=ans%7;
        if(ans==0) break;
        }while(next_permutation(p,p+4));
    printf("%s",p);
    for(int i=0;i<num;i++) printf("0");
       puts("");


 }
 return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值