hdu 5676 幸运数

本文探讨了处理大数比较的优化算法,针对10的18次方级别的数值,介绍了一种高效的字符串处理方法。通过奇偶位判断和next_permutation函数的应用,实现了快速比较和输出比给定数大的最小数。

这道题10的18次方,普通方法肯定超时,奇数容易处理,主要是卡在偶数上,比赛当时也想到了字符串,想999要进位,越想越麻烦。。。。


参考大神思路:http://blog.csdn.net/qq_22522375/article/details/51288411

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int num;
    scanf("%d",&num);
    while(num--)
    {
        char a[40];
        scanf("%s",a);
        int len;
        len=strlen(a);
        if(len%2==1)//奇数位输出下一个偶数位
        {
            for(int i=1;i<=len/2+1;i++)
                printf("4");
            for(int i=1;i<=len/2+1;i++)
                printf("7");
        }
        else//偶数位
        {

            char b[40];
            int ok=0,flag=0;
            for(int i=1;i<=len/2;i++)//一半7一半4
                b[ok++]='4';
            for(int i=1;i<=len/2;i++)//一半7一半4
                b[ok++]='7';
            do
            {
                if(strcmp(b,a)>=0)
                {
                    flag=1;
                    for(int i=0;i<ok;i++)
                        printf("%c",b[i]);
                    break;
                }
            }while(next_permutation(b,b+ok));
            if(flag==0)
            {
                for(int i=1;i<=len/2+1;i++)
                    printf("4");
                for(int i=1;i<=len/2+1;i++)
                    printf("7");
            }
        }
         printf("\n");
    }
}


转载于:https://www.cnblogs.com/xunalove/p/6809143.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值