• FZU ICPC 2020 寒假训练 2


    A - 排序

    输入一行数字,如果我们把这行数字中的‘5’都看成空格,那么就得到一行用空格分割的若
    干非负整数(可能有些整数以‘0’开头,这些头部的‘0’应该被忽略掉,除非这个整数就是由
    若干个‘0’组成的,这时这个整数就是0)。 你的任务是:对这些分割得到的整数,依从小
    到大的顺序排序输出。 
    
    Input
    输入包含多组测试用例,每组输入数据只有一行数字(数字之间没有空格),这行数字的长度不大于1000。   
    输入数据保证:分割得到的非负整数不会大于100000000;输入数据不可能全由‘5’组成。 
    

    Output

    对于每个测试用例,输出分割得到的整数排序的结果,相邻的两个整数之间用一个空格分开,每组输出占一行。 
    

    Sample Input

    0051231232050775
    

    Sample Output

    0 77 12312320
    

    WrongAnswer

    #include <stdio.h>
    #include <string.h>
    int main() {
        char str[10000];
        long len;
        int min,temp;
        while(scanf("%s",str)!=EOF){
            int i,j=0,k,p=0;
            int a[10000]={0};
        len=strlen(str);
        for(i=0;i<len;i++){
            if((i!=0&&str[i]=='5')||(i==len-1&&str[i]!='5')) {
                for(k=j;k<=i;k++){
                    if(str[k]=='5') continue;
                    a[p]=a[p]*10+(str[k]-'0');
                }
                j=i+1;
                p++;
            }
         
        }
        for(i=0;i<p;i++){
            min=i;
            for(j=i+1;j<p;j++)
            if(a[j]<a[min])
            {
                min=j;
            }
                temp=a[i];
            a[i]=a[min];
            a[min]=temp;
    }
        for(i=0;i<p;i++){
            printf("%d",a[i]);
            if(i!=p-1) printf(" ");
            else printf("
    ");
        }}
       return 0;
    }
    

    错误原因:忽略了如果输入字符串为如55512355的情况(有多个连续5),如果这样会导致p自增多次,从而造成,结果输出多个0;
    修改:增加一个变量flag,控制p自增;

    Accepted

    #include <stdio.h>
    #include <string.h>
    int main() {
        char str[10000];
        long len;
        int min,temp;
        while(scanf("%s",str)!=EOF){
            int i,j=0,k,p=0;
            int a[10000]={0};
        len=strlen(str);
        for(i=0;i<len;i++){
            int flag=0;//注意!!
            if((i!=0&&str[i]=='5')||(i==len-1&&str[i]!='5')) {
                for(k=j;k<=i;k++){
                    if(str[k]=='5') continue;
                    else {flag=1; a[p]=a[p]*10+(str[k]-'0');}//注意!!
                }
                j=i+1;
                if(flag==1) p++;
            }
         
        }
        for(i=0;i<p;i++){
            min=i;
            for(j=i+1;j<p;j++)
            if(a[j]<a[min])
            {
                min=j;
            }
                temp=a[i];
            a[i]=a[min];
            a[min]=temp;
    }
        for(i=0;i<p;i++){
            printf("%d",a[i]);
            if(i!=p-1) printf(" ");
            else printf("
    ");
        }}
       return 0;
    }
    

    B - 18岁生日

    Gardon的18岁生日就要到了,他当然很开心,可是他突然想到一个问题,是不是每个人从出
    生开始,到达18岁生日时所经过的天数都是一样的呢?似乎并不全都是这样,所以他想请你
    帮忙计算一下他和他的几个朋友从出生到达18岁生日所经过的总天数,让他好来比较一下。 
    

    Input

    一个数T,后面T行每行有一个日期,格式是YYYY-MM-DD。如我的生日是1988-03-07。 
    

    Output

    T行,每行一个数,表示此人从出生到18岁生日所经过的天数。如果这个人没有18岁生日,就输出-1。 
    

    Sample Input

    1
    1988-03-07
    

    Sample Output

    6574
    

    Accepted

    #include <stdio.h>
    #include <string.h>
    int judge_year(int year)
    {
        if((year%4==0&&year%100!=0)||(year%400==0)) return 1;
        else return 0;
    }
    int main() {
        int t,i,y;
        int year,month,day;
        int sum=0;
        scanf("%d",&t);
        for(i=1;i<=t;i++){
            sum=0;
            scanf("%d-%d-%d",&year,&month,&day);
            if(month==2&&day==29) {printf("-1
    ");continue;}
            else if (month<3) {//如果出生在3月份之前,当前年的天数,就是到第二年生日的天数
                for(y=year;y<=year+17;y++){
                    if(judge_year(y)) sum+=366;
                    else sum+=365;
                }
            }
            else if(month>=3){//如果出生在3月份之后,后一年的天数,就是到第二年生日的天数
                for(y=year+1;y<=year+18;y++){
                    if(judge_year(y)) sum+=366;
                    else sum+=365;
                }
            }
            printf("%d
    ",sum);
            
        }
       return 0;
    }
    

    C - 七夕节

    七夕节那天,月老来到数字王国,他在城门上贴了一张告示,并且和数字王国的人们说:"你们想知道你们的
    另一半是谁吗?那就按照告示上的方法去找吧!" 人们纷纷来到告示前,都想知道谁才是自己的另一半.告示如下: 
    数字N的因子就是所有比N小又能被N整除的所有正整数,如12的因子有1,2,3,4,6. 
    你想知道你的另一半吗?
    


    Input

    输入数据的第一行是一个数字T(1<=T<=500000),它表明测试数据的组数.然后是T组测试数据,每组测试数据只
    有一个数字N(1<=N<=500000). 
    

    Output

    对于每组测试数据,请输出一个代表输入数据N的另一半的编号. 
    

    Sample Input

    3
    2
    10
    20
    

    Sample Output

    1
    8
    22
    

    WrongAnswer

    #include <stdio.h>
    int main(){
       int t,n,m=0,i,j;
        scanf("%d",&t);
        for(i=1;i<=t;i++){
            m=0;
            scanf("%d",&n);
            for(j=1;j<n;j++){
                if(n%j==0) m+=j;
            }
            printf("%d
    ",m);
        }
       return 0;
    }
    

    刚刚开始想法很简单,用一个for循环把n所有的因子找出来,但是提交发现,超时,说明这种做法当数据过大时,消耗时间过大,因此就转换了另一种思路。[参考] C语言-求因子和

    Accepted

    #include <math.h>
    int main(){
       int t,n,m=0,i,j;
        scanf("%d",&t);
        for(i=1;i<=t;i++){
            m=0;
            scanf("%d",&n);
            for(j=1;j<=sqrt(n);j++){
                if(n%j==0){
                    if(j==n/j) m+=j;
                    else m=m+j+n/j;
                }
            }
            m=m-n;
            printf("%d
    ",m);
        }
       return 0;
    }
    

    E - A + B

    读入两个小于100的正整数A和B,计算A+B. 
    需要注意的是:A和B的每一位数字由对应的英文单词给出. 
    

    Input

    测试输入包含若干测试用例,每个测试用例占一行,格式为"A + B =",相邻两字符串有一个空格间隔.
    当A和B同时为0时输入结束,相应的结果不要输出. 
    

    Output

    对每个测试用例输出1行,即A+B的值. 
    

    Sample Input

    one + two =
    three four + five six =
    zero seven + eight nine =
    zero + zero =
    

    Sample Output

    3
    90
    96
    

    Accepted

    #include <stdio.h>
    #include <string.h>
    int judge(char str[]){
        if(!strcmp(str,"zero"))  return 0;
        else if(!strcmp(str,"one")) return 1;
        else if(!strcmp(str,"two")) return 2;
        else if(!strcmp(str,"three")) return 3;
        else if(!strcmp(str,"four")) return 4;
        else if(!strcmp(str,"five")) return 5;
        else if(!strcmp(str,"six")) return 6;
        else if(!strcmp(str,"seven")) return 7;
        else if(!strcmp(str,"eight")) return 8;
        else if(!strcmp(str,"nine")) return 9;
        else return 0;
    }
    int main(){
        while(1){
            int sum1=0,sum2=0,sum=0;
            char str1[1005]={0};
            int i=0,j=0;
            int len=0;
                while(1){
                    scanf("%c",&str1[i]);
                    if(str1[i]=='
    ') break; //这一步非常关键,刚开始,我选择条件为’=‘时,就会导致后续输入的例子,不能完整得出原数, 原因为,输入的’
    ‘被字符串接收了,从而导致后面的字符无法得出对应数字.
                    if(str1[i]==' ') {
                        str1[i]=0;
                        sum1=sum1*10+judge(str1);
                        len=(int)strlen(str1);
                        for(j=0;j<len;j++) str1[j]=0;
                        i=-1;
                    }
                    if(str1[i]=='+') {
                    sum2=sum1;
                    sum1=0;
                    continue;}
                    i++;
            }
           sum=sum1+sum2;
           if(sum==0) break;
           else printf("%d
    ",sum);
        }
       return 0;
    }
    

    J - 前m大的数

    还记得Gardon给小希布置的那个作业么?(上次比赛的1005)其实小希已经找回了原来的那张
    数表,现在她想确认一下她的答案是否正确,但是整个的答案是很庞大的表,小希只想让你把答
    案中最大的M个数告诉她就可以了。 给定一个包含N(N<=3000)个正整数的序列,每个数不超过
    5000,对它们两两相加得到的N*(N-1)/2个和,求出其中前M大的数(M<=1000)并按从大到小的
    顺序排列。
    

    Input

    输入可能包含多组数据,其中每组数据包括两行: 
    第一行两个数N和M, 
    第二行N个数,表示该序列。 
    

    Output

    对于输入的每组数据,输出M个数,表示结果。输出应当按照从大到小的顺序排列。
    

    Sample Input

    4 4
    1 2 3 4
    4 5
    5 3 6 4
    

    Sample Output

    7 6 5 5
    11 10 9 9 8
    

    Time Limit Exceeded

    #include <stdio.h>
    #include <math.h>
    int main(){
        int m,n,a[1005],b[1005];
        int i,j,k,temp;
        while(scanf("%d %d",&n,&m)!=EOF){
            k=0;
            for(i=0;i<n;i++)scanf("%d",&a[i]);
            for(i=0;i<n;i++){
                for(j=i+1;j<n;j++,k++) b[k]=a[i]+a[j];
            }
            for(i=0;i<k;i++){
                for(j=i+1;j<k;j++){
                    if(b[i]<b[j]){
                        temp=b[i];
                        b[i]=b[j];
                        b[j]=temp;
                    }
                }
            }
            for(i=0;i<m;i++){
                printf("%d",b[i]);
                if(i!=m-1) printf(" ");
                else printf("
    ");
            }
        }
        
       return 0;
    }
    

    第一次提交超时了,所以在想,会不会是在排序上花的时间过长,所以就采取了c++sort 函数(默认升序排列)

    #include <stdio.h>
    #include<algorithm>
    using namespace std;
    bool compare(int a,int b)
    {return a>b;}
    int main(){
        int m,n;
        int i,j,k;
        while(scanf("%d %d",&n,&m)!=EOF){
            k=0;
            int a[1000005]={0},b[1000005]={0};
            for(i=0;i<n;i++)scanf("%d",&a[i]);
            for(i=0;i<n;i++){
                for(j=i+1;j<n;j++,k++) b[k]=a[i]+a[j];
            }
            sort(b,b+k,compare);
            for(i=0;i<m-1;i++)
                printf("%d ",b[i]);
                printf("%d
    ",b[m-1]);
        }
       return 0;
    }
    

    但是有发现,还是Runtime error了,之后在查询资料后,发现是数组开的过小,使其溢出,但是如果在main函数里定义数组过大,会使栈溢出,故设全局变量。

    Accepted

    #include <stdio.h>
    #include<algorithm>
    int a[3005]={0},b[4500005]={0};
    using namespace std;
    bool compare(int a,int b)
    {return a>b;}
    int main(){
        int m,n;
        int i,j,k;
    
        while(scanf("%d %d",&n,&m)!=EOF){
            k=0;
            for(i=0;i<n;i++) scanf("%d",&a[i]);
            for(i=0;i<n;i++){
                for(j=i+1;j<n;j++) b[k++]=a[i]+a[j];
            }
            sort(b,b+(n*(n-1)/2),compare);
            for(i=0;i<m-1;i++)
                printf("%d ",b[i]);
                printf("%d
    ",b[m-1]);
        }
       return 0;
    }
    

    后面也了解了相关原理:常用的两种nlogn级别的排序——快排,归排

    K - 找新朋友

    新年快到了,“猪头帮协会”准备搞一个聚会,已经知道现有会员N人,把会员从1到N编
    号,其中会长的号码是N号,凡是和会长是老朋友的,那么该会员的号码肯定和N有大于
    1的公约数,否则都是新朋友,现在会长想知道究竟有几个新朋友?请你编程序帮会长计
    算出来。
    

    Input

    第一行是测试数据的组数CN(Case number,1<CN<10000),接着有CN行正整数N(1<n<32768),表示会员人数。
    

    Output

    对于每一个N,输出一行新朋友的人数,这样共有CN行输出。 
    

    Sample Input

    2
    25608
    24027
    

    Sample Output

    7680
    16016
    

    Time Limit Exceeded

    #include <stdio.h>
    int find(int a,int b){
        if(b==0&&a!=1) return 1;
        if(b==0&&a==1) return 0;
        return find(b,a%b);
     
    }
    int main(){
        int n,cn,i,j;
        int num,flag;
        scanf("%d",&cn);
        for(i=1;i<=cn;i++){
            num=0;
            scanf("%d",&n);
            for(j=1;j<n;j++){
                flag=find(n,j);
                if(flag==0) num++;
            }
            printf("%d
    ",num);
        }
       return 0;
    }
    

    一开始想到了gcd,但是gcd函数采用递归的方法,所以是遍历查找,故会超时。

    Accepted

    查询资料后,发现本题应该用筛选法处理(还有一个欧拉公式??)

    #include<stdio.h>
    #include<math.h>
    int main()
    {
        int a[32770];
        int i,j,cn,n;
        scanf("%d",&cn);
        while(cn--)
        {
            scanf("%d",&n);
            memset(a,0,sizeof(a));// memset可以方便的清空一个结构类型的变量或数组。
            for(i=2;i<=sqrt(n);i++)      //筛选法求约数关系
                if(n%i==0)
                    for(j=i;j<n;j+=i)
                        a[j]=1;
            int sum=0;
            for(i=1;i<n;i++)
                if(!a[i])
                    sum++;
            printf("%d
    ",sum);
        }
        return 0;
    }
    
    #include <stdio.h>
    #include <math.h>
    int  Eular(int n)
    {
        int ans=1;
        for (int i=2;i<=sqrt((double)n);i++)
        {
            if (n%i==0)
            {
                n/=i;
                ans*=(i-1);
                //若n有个因子是i的k次,根据欧拉公式有下面的代码
                while (n%i==0)
                {
                    n/=i;
                    ans*=i;
                }
            }
        }
        if (n>1)     //若最后剩的数为大于5的素数,根据欧拉公式再算进去
            ans*=(n-1);
        return ans;
    }
    int main(){
        int n,cn,i;
        scanf("%d",&cn);
        for(i=1;i<=cn;i++){
            scanf("%d",&n);
            printf("%d
    ", Eular(n));
        }
       return 0;
    }
    

    M - 测试你是否和LTC水平一样高

    大家提到LTC都佩服的不行,不过,如果竞赛只有这一个题目,我敢保证你和他绝对在一个
    水平线上! 你的任务是: 计算方程x^2+y^2+z^2= num的一个正整数解。 
    

    Input

    输入数据包含多个测试实例,每个实例占一行,仅仅包含一个小于等于10000的正整数num。 
    

    Output

    对于每组测试数据,请按照x,y,z递增的顺序输出它的一个最小正整数解,每个实例的输出占一行,题目保证所有测试数据都有解。 
    

    Sample Input

    3
    

    Sample Output

    1 1 1
    

    Accepted

    这题首先注意输入n的范围1~10000,所以只要在1~100范围内三层循环嵌套,便可得出答案

    #include<stdio.h>
    #include<math.h>
    int main()
    {
        int num,i,k,j,flag;
        while(scanf("%d",&num)!=EOF){
            flag=0;
            for(i=1;i<=100;i++){
                for(j=1;j<=100;j++){
                    for(k=1;k<=100;k++){
                        if(i*i+j*j+k*k==num) {flag=1;break;}
                    }
                    if(flag) break;
                }
                if(flag) break;
            }
            printf("%d %d %d
    ",i,j,k);
        }
        return 0;
    }
    

    N - 素数回文

    xiaoou33对既是素数又是回文的数特别感兴趣。比如说151既是素数又是个回文。现在
    xiaoou333想要你帮助他找出某个范围内的素数回文数,请你写个程序找出 a 跟b 之间
    满足条件的数。(5 <= a < b <= 100,000,000); 
    

    Input

    这里有许多组数据,每组包括两组数据a跟b。
    

    Output

    对每一组数据,按从小到大输出a,b之间所有满足条件的素数回文数(包括a跟b)每组数据之后空一行。
    

    Sample Input

    5 500
    

    Sample Output

    5
    7
    11
    101
    131
    151
    181
    191
    313
    353
    373
    383
    

    Time Limit Exceeded

    #include<stdio.h>
    #include<math.h>
    int judge1(int n){
        int i;
        if(n==1) return 0;
        else if(n==2) return 1;
        else if(n>2) {
            for (i=2;i<=sqrt(n);i++ ) {
                if(n%i==0) return 0;
            }
            return 1;
        }
        return 0;
    }
    int judge2(int n){
        int s,m=0;
            s=n;
            while(s>0){
                m=m*10+s%10;
                s/=10;
            }
        if(m==n) return 1;
        else return 0;
        }
    int main()
    {
        int a,b,i,temp;
        while(scanf("%d %d",&a,&b)!=EOF){
            int flag1=0,flag2=0;
            if(a>b){
                temp=a;
                a=b;
                b=temp;
            }
            for(i=a;i<=b;i++){
                flag1=judge1(i);
                flag2=judge2(i);
                if(flag1&&flag2)printf("%d
    ",i);
            }
        }
        return 0;
    }
    

    Accepted

    回文素数:除了11,偶数位的数不存在回文质数。4位,6位,8位……数不存在回文质数。因为四位及四位以上的偶数位的回文数都可以被11整除,故不存在偶数位的回文质数。
    方法1:暴力打表(因为范围内的最大回文素数为9989899)

    #include<stdio.h>
    int arr[]={2,3,5,7,11,101,131,151,181,191,
    313,353,373,383,727,757,787,797,919,929,
    10301,10501,10601,11311,11411,12421,12721,12821,13331,13831,
    13931,14341,14741,15451,15551,16061,16361,16561,16661,17471,
    17971,18181,18481,19391,19891,19991,30103,30203,30403,30703,
    30803,31013,31513,32323,32423,33533,34543,34843,35053,35153,
    35353,35753,36263,36563,37273,37573,38083,38183,38783,39293,
    70207,70507,70607,71317,71917,72227,72727,73037,73237,73637,
    74047,74747,75557,76367,76667,77377,77477,77977,78487,78787,
    78887,79397,79697,79997,90709,91019,93139,93239,93739,94049,
    94349,94649,94849,94949,95959,96269,96469,96769,97379,97579,
    97879,98389,98689,1003001,1008001,1022201,1028201,1035301,1043401,1055501,
    1062601,1065601,1074701,1082801,1085801,1092901,1093901,1114111,1117111,1120211,
    1123211,1126211,1129211,1134311,1145411,1150511,1153511,1160611,1163611,1175711,
    1177711,1178711,1180811,1183811,1186811,1190911,1193911,1196911,1201021,1208021,
    1212121,1215121,1218121,1221221,1235321,1242421,1243421,1245421,1250521,1253521,
    1257521,1262621,1268621,1273721,1276721,1278721,1280821,1281821,1286821,1287821,
    1300031,1303031,1311131,1317131,1327231,1328231,1333331,1335331,1338331,1343431,
    1360631,1362631,1363631,1371731,1374731,1390931,1407041,1409041,1411141,1412141,
    1422241,1437341,1444441,1447441,1452541,1456541,1461641,1463641,1464641,1469641,
    1486841,1489841,1490941,1496941,1508051,1513151,1520251,1532351,1535351,1542451,
    1548451,1550551,1551551,1556551,1557551,1565651,1572751,1579751,1580851,1583851,
    1589851,1594951,1597951,1598951,1600061,1609061,1611161,1616161,1628261,1630361,
    1633361,1640461,1643461,1646461,1654561,1657561,1658561,1660661,1670761,1684861,
    1685861,1688861,1695961,1703071,1707071,1712171,1714171,1730371,1734371,1737371,
    1748471,1755571,1761671,1764671,1777771,1793971,1802081,1805081,1820281,1823281,
    1824281,1826281,1829281,1831381,1832381,1842481,1851581,1853581,1856581,1865681,
    1876781,1878781,1879781,1880881,1881881,1883881,1884881,1895981,1903091,1908091,
    1909091,1917191,1924291,1930391,1936391,1941491,1951591,1952591,1957591,1958591,
    1963691,1968691,1969691,1970791,1976791,1981891,1982891,1984891,1987891,1988891,
    1993991,1995991,1998991,3001003,3002003,3007003,3016103,3026203,3064603,3065603,
    3072703,3073703,3075703,3083803,3089803,3091903,3095903,3103013,3106013,3127213,
    3135313,3140413,3155513,3158513,3160613,3166613,3181813,3187813,3193913,3196913,
    3198913,3211123,3212123,3218123,3222223,3223223,3228223,3233323,3236323,3241423,
    3245423,3252523,3256523,3258523,3260623,3267623,3272723,3283823,3285823,3286823,
    3288823,3291923,3293923,3304033,3305033,3307033,3310133,3315133,3319133,3321233,
    3329233,3331333,3337333,3343433,3353533,3362633,3364633,3365633,3368633,3380833,
    3391933,3392933,3400043,3411143,3417143,3424243,3425243,3427243,3439343,3441443,
    3443443,3444443,3447443,3449443,3452543,3460643,3466643,3470743,3479743,3485843,
    3487843,3503053,3515153,3517153,3528253,3541453,3553553,3558553,3563653,3569653,
    3586853,3589853,3590953,3591953,3594953,3601063,3607063,3618163,3621263,3627263,
    3635363,3643463,3646463,3670763,3673763,3680863,3689863,3698963,3708073,3709073,
    3716173,3717173,3721273,3722273,3728273,3732373,3743473,3746473,3762673,3763673,
    3765673,3768673,3769673,3773773,3774773,3781873,3784873,3792973,3793973,3799973,
    3804083,3806083,3812183,3814183,3826283,3829283,3836383,3842483,3853583,3858583,
    3863683,3864683,3867683,3869683,3871783,3878783,3893983,3899983,3913193,3916193,
    3918193,3924293,3927293,3931393,3938393,3942493,3946493,3948493,3964693,3970793,
    3983893,3991993,3994993,3997993,3998993,7014107,7035307,7036307,7041407,7046407,
    7057507,7065607,7069607,7073707,7079707,7082807,7084807,7087807,7093907,7096907,
    7100017,7114117,7115117,7118117,7129217,7134317,7136317,7141417,7145417,7155517,
    7156517,7158517,7159517,7177717,7190917,7194917,7215127,7226227,7246427,7249427,
    7250527,7256527,7257527,7261627,7267627,7276727,7278727,7291927,7300037,7302037,
    7310137,7314137,7324237,7327237,7347437,7352537,7354537,7362637,7365637,7381837,
    7388837,7392937,7401047,7403047,7409047,7415147,7434347,7436347,7439347,7452547,
    7461647,7466647,7472747,7475747,7485847,7486847,7489847,7493947,7507057,7508057,
    7518157,7519157,7521257,7527257,7540457,7562657,7564657,7576757,7586857,7592957,
    7594957,7600067,7611167,7619167,7622267,7630367,7632367,7644467,7654567,7662667,
    7665667,7666667,7668667,7669667,7674767,7681867,7690967,7693967,7696967,7715177,
    7718177,7722277,7729277,7733377,7742477,7747477,7750577,7758577,7764677,7772777,
    7774777,7778777,7782877,7783877,7791977,7794977,7807087,7819187,7820287,7821287,
    7831387,7832387,7838387,7843487,7850587,7856587,7865687,7867687,7868687,7873787,
    7884887,7891987,7897987,7913197,7916197,7930397,7933397,7935397,7938397,7941497,
    7943497,7949497,7957597,7958597,7960697,7977797,7984897,7985897,7987897,7996997,
    9002009,9015109,9024209,9037309,9042409,9043409,9045409,9046409,9049409,9067609,
    9073709,9076709,9078709,9091909,9095909,9103019,9109019,9110119,9127219,9128219,
    9136319,9149419,9169619,9173719,9174719,9179719,9185819,9196919,9199919,9200029,
    9209029,9212129,9217129,9222229,9223229,9230329,9231329,9255529,9269629,9271729,
    9277729,9280829,9286829,9289829,9318139,9320239,9324239,9329239,9332339,9338339,
    9351539,9357539,9375739,9384839,9397939,9400049,9414149,9419149,9433349,9439349,
    9440449,9446449,9451549,9470749,9477749,9492949,9493949,9495949,9504059,9514159,
    9526259,9529259,9547459,9556559,9558559,9561659,9577759,9583859,9585859,9586859,
    9601069,9602069,9604069,9610169,9620269,9624269,9626269,9632369,9634369,9645469,
    9650569,9657569,9670769,9686869,9700079,9709079,9711179,9714179,9724279,9727279,
    9732379,9733379,9743479,9749479,9752579,9754579,9758579,9762679,9770779,9776779,
    9779779,9781879,9782879,9787879,9788879,9795979,9801089,9807089,9809089,9817189,
    9818189,9820289,9822289,9836389,9837389,9845489,9852589,9871789,9888889,9889889,
    9896989,9902099,9907099,9908099,9916199,9918199,9919199,9921299,9923299,9926299,
    9927299,9931399,9932399,9935399,9938399,9957599,9965699,9978799,9980899,9981899,
    9989899,-1};
    int main()
    {
     int a,b,i;
     while(scanf("%d %d",&a,&b)!=EOF){
      for(i=0;arr[i]!=-1;i++)
      {
       if(arr[i]>=a&&arr[i]<=b)  printf("%d
    ",arr[i]);
       if(arr[i]>b) break;
      }
         printf("
    ");
     }
     return 0;
    }
    
    

    方法2 HDU 1431 素数回文(打表+技巧,最大回文素数为9989899!!!)

    P - 排列2

    Ray又对数字的列产生了兴趣:现有四张卡片,用这四张卡片能排列出很多不
    同的4位数,要求按从小到大的顺序输出这些4位数。 
    

    Input

    每组数据占一行,代表四张卡片上的数字(0<=数字<=9),如果四张卡片都是0,则输入结束。 
    

    Output

    对每组卡片按从小到大的顺序输出所有能由这四张卡片组成的4位数,千位数字相同的在
    同一行,同一行中每个四位数间用空格分隔。 每组输出数据间空一行,最后一组数据后面
    没有空行。 
    

    Sample Input

    1 2 3 4
    1 1 2 3
    0 1 2 3
    0 0 0 0
    

    Sample Output

    1234 1243 1324 1342 1423 1432
    2134 2143 2314 2341 2413 2431
    3124 3142 3214 3241 3412 3421
    4123 4132 4213 4231 4312 4321
    
    1123 1132 1213 1231 1312 1321
    2113 2131 2311
    3112 3121 3211
    
    1023 1032 1203 1230 1302 1320
    2013 2031 2103 2130 2301 2310
    3012 3021 3102 3120 3201 3210
    

    Accepted

    本题采用c++stl库中的全排列(全排列 next_permutation() 函数的用法)函数:

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    int main()
    {
        int a[5];
        int tag=0;
        while(scanf("%d %d %d %d",&a[0],&a[1],&a[2],&a[3])){
            if(a[0]==0&&a[1]==0&&a[2]==0&&a[3]==0) break;
            if(tag) printf("
    "); //控制换行
            tag=1;
            int flag=1,temp;
            do{
                if(a[0]==0) continue;
                if(flag){
                    printf("%d%d%d%d",a[0],a[1],a[2],a[3]);
                    flag=0;
                }
                else if(temp==a[0])
                    printf(" %d%d%d%d",a[0],a[1],a[2],a[3]);
                else printf("
    %d%d%d%d",a[0],a[1],a[2],a[3]);
                temp=a[0];}while(std::next_permutation(a,a+4));
            printf("
    ");
            }
        return 0;
    }
    
  • 相关阅读:
    【消息队列MQ】各类MQ比较
    MySql查询功能梳理
    头条日常实习生面经 2018.11.28
    排序算法 JavaScript
    浅谈二分查找 JavaScript
    LeetCode17.电话号码的字母组合 JavaScript
    LeetCode16.最接近的三数之和 JavaScript
    LeetCode15.三数之和 JavaScript
    LeetCode14.最长公共前缀 JavaScript
    LeetCode13.罗马数字转整数 JavaScript
  • 原文地址:https://www.cnblogs.com/lvhang/p/12246631.html
Copyright © 2020-2023  润新知