| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 835 人关注过本帖
标题:有一道数学之美ACM题WA,自己各种测试实例都通过 ,求解
只看楼主 加入收藏
shf19961008
Rank: 1
等 级:新手上路
帖 子:13
专家分:2
注 册:2015-10-18
结帖率:33.33%
收藏
已结贴  问题点数:10 回复次数:7 
有一道数学之美ACM题WA,自己各种测试实例都通过 ,求解
图片附件: 游客没有浏览图片的权限,请 登录注册

程序代码:
//数字之美:
#include <stdio.h>
#include <memory.h>
#include <string.h>

int main(void)
{
    char s0[100005];
    char s1[100005];
    char s2[100005];
    int num4,num7,numall,halfnumall;
    int i,len,j;
    while(scanf("%s",s0)!=EOF)
    {
        memset(s1,0,sizeof(char)*100005);
        memset(s2,0,sizeof(char)*100005);
        //1.找到最小幸运数字:
        len=strlen(s0);
        //s0=44447777,44474777,....44477774
        //s2=11112222,11121222,....11122221
        //s0=444888,4548,12345678,88
        //s2=111333,1213,11112223,33
        for(i=len-1; i>=0; i--)
        {
            if(s0[i]<='4')
            {
                s2[i+1]=1;
            }
            else if(s0[i]<='7')
            {
                s2[i+1]=2;
            }
            else
            {
                s2[i+1]=3;
            }
        }
        //s2=111333,1213,11112223,33
        //s2=112111,1221,11121111,111
        for(i=len; i>0; i--)
        {
            if(s2[i]>=3)
            {
                s2[i-1]++;
                s2[i]=1;
                for(j=len; j>i; j--)
                {
                    s2[j]=1;
                }
            }
        }
        //s1=447444,4774,44474444,444
        if(s2[0]==0)
        {
            for(i=1; i<=len+3; i++)
            {
                switch(s2[i])
                {
                    case 1:
                        s1[i-1]=4;
                        break;
                    case 2:
                        s1[i-1]=7;
                        break;
                }
            }
        }
        else
        {
            for(i=0; i<=len+3; i++)
            {
                switch(s2[i])
                {
                    case 1:
                        s1[i]=4;
                        break;
                    case 2:
                        s1[i]=7;
                        break;
                }
            }
        }
        //2.将最小幸运数字变为超级幸运数字:
        //2.1统计4,7个数:
        for(i=0,num4=0,num7=0; i<=len+3; i++)
        {
            if(s1[i]==4)
            {
                num4++;
            }
            else if(s1[i]==7)
            {
                num7++;
            }
        }
        numall=num4+num7;
        //2.2 若为奇数:
        if(numall%2)
        {
            numall++;
            halfnumall=numall/2;
            for(i=0; i<halfnumall; i++)
            {
                s1[i]=4;
            }
            for(i=0; i<halfnumall; i++)
            {
                s1[halfnumall+i]=7;
            }
            goto out;
        }
        //2.2 若为偶数:
        while(num7>num4)
        {
            for(i=numall+3; i>=0; i--)
            {
                if(s1[i]==4)
                {
                    s1[i]=7;
                    for(i++; i<=numall+3; i++)
                    {
                        if(s1[i]==7)
                        {
                            s1[i]=4;
                        }
                    }
                    break;
                }
            }
            //统计4,7个数
            for(i=0,num4=0,num7=0; i<=numall+3; i++)
            {
                if(s1[i]==4)
                {
                    num4++;
                }
                else if(s1[i]==7)
                {
                    num7++;
                }
            }
            if(num4==0)//全都是7的话:
            {

                numall+=2;
                halfnumall=numall/2;
                for(i=0; i<halfnumall; i++)
                {
                    s1[i]=4;
                }
                for(i=0; i<halfnumall; i++)
                {
                    s1[halfnumall+i]=7;
                }
                goto out;

            }
        }
        for(i=numall+3; i>=0&&num4>num7; i--)
        {
            if(s1[i]==4)
            {
                s1[i]=7;
                num4--;
                num7++;
            }
        }
out:
        for(i=0;; i++)
        {
            if(s1[i]==4)
            {
                printf("4");
            }
            else if(s1[i]==7)
            {
                printf("7");
            }
            else
            {
                break;
            }
        }
        printf("\n");
    }
    return 0;
}

搜索更多相关主题的帖子: include 数学 
2015-11-08 23:15
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
收藏
得分:3 
提交链接给一下

学习编程,为的是表达自己的思想,而不是被别人的思想所禁锢。要先明白自己想干嘛,而不要先问别人让你干嘛。               

                                                                                                                    Black Cat      Hello Tomorrow~
2015-11-09 10:15
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:3 
数组开辟的小吧
收到的鲜花
  • 书生牛犊2015-11-09 11:59 送鲜花  1朵   附言:我很赞同。我在一些网站上提交作业时也会有 ...

DO IT YOURSELF !
2015-11-09 10:17
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:3 
个人感觉把这个说成数学之美是侮辱数学,仅是一个大数据比较而已。

能编个毛线衣吗?
2015-11-09 10:23
shf19961008
Rank: 1
等 级:新手上路
帖 子:13
专家分:2
注 册:2015-10-18
收藏
得分:0 
回复 4楼 wmf2014
是数字之美。。打错了
2015-11-09 10:49
shf19961008
Rank: 1
等 级:新手上路
帖 子:13
专家分:2
注 册:2015-10-18
收藏
得分:0 
回复 2楼 蚕头燕尾
http://acm.dlut.
是学校内网,不一定上的去,如果你有代码的话我帮你交吧


[此贴子已经被作者于2015-11-9 10:53编辑过]

2015-11-09 10:50
shf19961008
Rank: 1
等 级:新手上路
帖 子:13
专家分:2
注 册:2015-10-18
收藏
得分:0 
程序代码:
//数字之美:
#include <stdio.h>
#include <memory.h>
#include <string.h>


int main(void) {
    char s[100005];
    int num4,num7,halflen;
    int i,len,j;
    memset(s,0,sizeof(char)*100005);
    while(scanf("%s",s)!=EOF) {
        len=(int)strlen(s);
        for(i=len-1; i>=0; i--) {
            s[i+1]=s[i];
        }
        s[0]='0';
        len++;
        //1.找到最小幸运数字:
        for(i=1; i<len; i++) {
            if(s[i]>'7') {
                s[i-1]++;
                for(j=i; j<len; j++) {
                    s[j]='0';
                }
                i=0;
            }
        }
        if(s[0]=='1') {
            for(i=0; i<len; i++) {
                s[i]='4';
            }
        } else {
            for(i=1; i<len; i++) {
                if(s[i]<'4') {
                    for(j=i; j<len; j++) {
                        s[j]='4';
                    }
                    break;
                } else if(s[i]=='4') {
                } else if(s[i]<'7') {
                    s[i]='7';
                    for(j=i+1; j<len; j++) {
                        s[j]='4';
                    }
                    break;
                }
            }
            for(i=1; i<len; i++) {
                s[i-1]=s[i];
            }
            s[len-1]=0;
            len--;
        }
        //2.将最小幸运数字变为超级幸运数字:
        //2.1统计4,7个数:
        for(i=0,num4=0,num7=0; i<len; i++) {
            if(s[i]=='4') {
                num4++;
            } else if(s[i]=='7') {
                num7++;
            }
        }
        if(len%2) {
            len++;
            halflen=len/2;
            for(i=0; i<halflen; i++) {
                s[i]='4';
            }
            for(i=0; i<halflen; i++) {
                s[halflen+i]='7';
            }
            s[len]=0;
            printf("%s\n",s);
            goto out1;
        } else {
            while(num7>num4) {
                for(i=len-1; i>=0; i--) {
                    if(s[i]=='4') {
                        s[i]='7';
                        for(j=i+1; j<=len-1; j++) {
                            s[j]='4';
                        }
                        break;
                    }
                }
                //统计4个数
                for(i=0,num4=0,num7=0; i<len; i++) {
                    if(s[i]=='4') {
                        num4++;
                    } else if(s[i]=='7') {
                        num7++;
                    }
                }
                if(num4==0) { //全都是7的话:
                    len+=2;
                    halflen=len/2;
                    for(i=0; i<halflen; i++) {
                        s[i]='4';
                    }
                    for(i=0; i<halflen; i++) {
                        s[halflen+i]='7';
                    }
                    s[len]=0;
                    printf("%s\n",s);
                    goto out1;
                }
            }
        }
        for(i=len-1; num4>num7; i--) {
            if(s[i]=='4') {
                s[i]='7';
                num4--;
                num7++;
            }
        }
        printf("%s\n",s);
    out1:
        ;
        memset(s,0,sizeof(char)*100005);
    }
    return 0;
}


/**************************************************************
    Problem: 1092
    User:

    Language: C
    Result: Accepted
    Time:0 ms
    Memory:1056 kb
****************************************************************/
2015-11-10 21:04
shf19961008
Rank: 1
等 级:新手上路
帖 子:13
专家分:2
注 册:2015-10-18
收藏
得分:0 
//错误原因:4587->1231->2111->7444(5->2丢失了精度)
//4587->4747

2015-11-10 21:05
快速回复:有一道数学之美ACM题WA,自己各种测试实例都通过 ,求解
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.048023 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved