zoukankan      html  css  js  c++  java
  • 《算法竞赛入门经典》(刘汝佳)——排序与检索(基础)

    一:6174问题   poj 1350 Cabric Number Problem

    注意看清这题题意:

    1:若输入的不是四位数或者输入的四位数各个数字相同,那么输出“No!!”

    2:循环到最大与最小值相差为6174或者0时结束循环,输出过程和答案。

    下面是我按自己想的写的,纯暴力模拟(虽然可以过,但是真是长的乱的惨不忍睹),书上的貌似要更简单一些,但是总体思路也差不多,我就不改了(^o^)

    #include<stdio.h>
    #include<algorithm>
    using namespace std;
    int main()
    {
        int n,ans,num,flag,s[1010],s1[1010],s2[1010];
        while(scanf("%d",&n)!=EOF)
        {
            if(n==-1)break;
            printf("N=%d:
    ",n);
    
            int Q[5],T=n;
            Q[0]=T/1000;T=T%1000;
            Q[1]=T/100;T=T%100;
            Q[2]=T/10;T=T%10;
            Q[3]=T;
            if(Q[0]==Q[1]&&Q[1]==Q[2]&&Q[2]==Q[3])
                n=0;
            if(n/1000!=0&&n/10000==0)
            {
                ans=0;
                num=1;
                flag=0;
                s[0]=n;
                while(n)
                {
                    if(n==0||n==6174)break;
                    int a[5],b,c=0,jin=0;
                    b=n;
                    if(b/1000!=0)//4
                    {
                        a[0]=b/1000;b=b%1000;
                        a[1]=b/100;b=b%100;
                        a[2]=b/10;b=b%10;
                        a[3]=b;
                        sort(a,a+4);
                        s1[num]=a[3]*1000+a[2]*100+a[1]*10+a[0];
                        s2[num]=a[0]*1000+a[1]*100+a[2]*10+a[3];
                        int shi=1;
                        for(int i=0;i<4;i++)
                        {
                            int d=a[i]-a[3-i]-jin;
                            if(d<0)
                                d=d+10,jin=1;
                            else
                                jin=0;
                            c=c+d*shi;
                            shi=shi*10;
                        }
                        if(c!=0&&c!=6174)
                        {
                            ans++;n=c;
                            for(int i=0;i<num;i++)
                            {
                                if(s[i]==c)
                                {
                                    flag=1;
                                    break;
                                }
                            }
                            if(flag==1){ans++;break;}
                            else s[num++]=n;
                        }
                        else
                        {
                            s[num++]=c;
                            ans++;
                            break;
                        }
                    }
                    else if(b/1000==0&&b/100!=0)//3
                    {
                        a[0]=b/100;b=b%100;
                        a[1]=b/10;b=b%10;
                        a[2]=b;
                        sort(a,a+3);
                        s1[num]=a[2]*100+a[1]*10+a[0];
                        s2[num]=a[0]*100+a[1]*10+a[2];
                        int shi=1;
                        for(int i=0;i<3;i++)
                        {
                            int d=a[i]-a[2-i]-jin;
                            if(d<0)
                                d=d+10,jin=1;
                            else
                                jin=0;
                            c=c+d*shi;
                            shi=shi*10;
                        }
                        if(c!=0&&c!=6174)
                        {
                            ans++;n=c;
                            for(int i=0;i<num;i++)
                            {
                                if(s[i]==c)
                                {
                                    flag=1;
                                    break;
                                }
                            }
                            if(flag==1){ans++;break;}
                            else
                                s[num++]=n;
                        }
                        else
                        {
                            ans++;
                            s[num++]=c;
                            break;
                        }
                    }
                    else if(b/100==0&&b/10!=0)//2
                    {
                        a[0]=b/10;b=b%10;
                        a[1]=b;
                        sort(a,a+2);
                        s1[num]=a[1]*10+a[0];
                        s2[num]=a[0]*10+a[1];
                        int shi=1;
                        for(int i=0;i<2;i++)
                        {
                            int d=a[i]-a[1-i]-jin;
                            if(d<0)
                                d=d+10,jin=1;
                            else
                                jin=0;
                            c=c+d*shi;
                            shi=shi*10;
                        }
                        if(c!=0&&c!=6174)
                        {
                            ans++;n=c;
                            for(int i=0;i<num;i++)
                            {
                                if(s[i]==c)
                                {
                                    flag=1;
                                    break;
                                }
                            }
                            if(flag==1){ans++;s[num++]=c;break;}
                            else s[num++]=n;
                        }
                        else
                        {
                            ans++;
                            s[num++]=c;
                            break;
                        }
                    }
                    else if(b/10==0)//1
                    {
                        s1[num]=b;
                        s2[num]=b;
                        s[num++]=c;
                        ans++;
                        break;
                    }
                }
                for(int i=1;i<=ans;i++)
                {
                    printf("%d-%d=%d
    ",s1[i],s2[i],s[i]);
                }
                printf("Ok!! %d times
    ",ans);
                
            }
            else
                printf("No!!
    ");
        }
        return 0;
    }  
    View Code

    二:字母重排,,,,oj上在哪里暂时搜不到,不过我记得我以前做过。所以我就先跳过这题了。

    一道又一道,好高兴!
  • 相关阅读:
    Haskell语言学习笔记(54)Data.Set
    Haskell语言学习笔记(53)Data.Sequence
    正则表达式(Java,C#,C++)
    Haskell语言学习笔记(52)正则表达式
    Haskell语言学习笔记(51)Comonad
    最大获利
    最小生成树
    PIGS
    三维偏序
    <noip2017>列队
  • 原文地址:https://www.cnblogs.com/laiba2004/p/3599167.html
Copyright © 2011-2022 走看看