《算法竞赛入门经典》(刘汝佳)——排序与检索(基础)

一: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上在哪里暂时搜不到,不过我记得我以前做过。所以我就先跳过这题了。

一道又一道,好高兴!
原文地址:https://www.cnblogs.com/laiba2004/p/3599167.html