SimpleCTF

WpsecCTF PPC部分

2018-03-26  本文已影响21人  一纸笔墨

1 时间计算

这题是选自阿里的2018校招编程题,当时在30分钟之内没做出来,有点沮丧,事后查找了一下别人写的代码,感觉都不是很好,于是自己写了一个
源码稍后发布

#include"stdio.h"

int a[6] = { 0,0,5,6,0,6 };

//排序的数组 排序的位数 排序的类型(true 升序/ false 降序)
int sort(int *a,int num,bool type) {
    for (int i = 0; i<num-1; i++) {
        for (int j = i + 1; j<num; j++) {
            if ((type&&a[i] > a[j]) || (!type&&a[i] < a[j])) {
                a[i] = a[i] ^ a[j];
                a[j] = a[i] ^ a[j];
                a[i] = a[j] ^ a[i];
            }
        }
    }
    return 1;
}
int isInData(int i){
    int b[6]={0},n=5;
    while(i){
        b[n--]=i%10;
        i/=10;
    }
    sort(b,6,true);
    for(int i=0;i<6;i++){
        if(a[i]!=b[i]){
            return 0;
        }
    }
    return 1;
}

int main()
{
    //因为总是要输入6个数的,所以n无所谓的。。但是在线答估计要加
    //int n;
    int max=0,min=0,temp[2]={0},j=0;
    sort(a, 6, true);
    //scanf_s("%d", &n);
    //for (int i = 0; i < 6; i++) {
    //  scanf_s("%d", &a[i]);
    //}
    for(int i=0;i<6;i++){
        min=min*10+a[i];
        max=max*10+a[5-i];
    }

    //规则1 不符合时间规则的统统去掉 可以自己尝试就知道了
    if((min>599&&min<1000)||(min>5599&&min<10000)||(min>59999&&min<100000)||(min>235599)){
        printf("N/A\n");
        return 0;
    }

    //最浪费时间的地方,但是也不慢多少~
    for(int i=min;i<max;i++){
        //判断时间格式是否正确
        if((i/100000<3)&&(i/10000)%10<4&&(i/1000)%10<6&&(i/10)%10<6){
            //判断i中的所有元素是否和a相同   
            if(isInData(i)){
                //printf("%d\t",i);
                temp[j]=i;
                temp[1]=temp[j];
                j=1;
            }
        }
    }

    if(temp[1]==temp[0]){
        printf("%06d\n",temp[0]);
    }
    else{
        printf("%06d %06d\n",temp[0],temp[1]);
    }
    return 0;
}


2 A+B+C

很简单:

print(sum([int(n) for n in input().split(' ')]))


3 螺旋矩阵

需要考验逻辑能力,只能根据点的坐标去计算出它的数值,不能通过预先计算好一个螺旋矩阵来计算坐标的值,需要稍稍费些脑筋

#include"stdio.h"
#include"stdlib.h"
#include"malloc.h"
int n=1;
//计算当前层数外的所有层的点个数
int getCircle(int a){
    if(a==0)
        return 0;
    return (4*n+4-8*a)+getCircle(a-1);
}
int main()
{
    //输入
    int x,y;
    printf("please input your number:\n");
    //scanf("%d %d %d",&n,&x,&y);
    n=5;
    x=3,y=3;
    //计算层数,如果n为单数的话,一半=(n+1)/2
    int halfN=n%2==0?n/2:((n+1)/2);
    int t1=x<halfN?x:n-1-x;
    int t2=y<halfN?y:n-1-y;
    //层数
    int layer=t1<t2?t1:t2;
    int num;
    if(x==layer){
        num=getCircle(layer)+y+1-layer;
    }
    else if(y==n-1-layer){
        num=getCircle(layer)+x+n-3*layer;
    }
    else if(x==n-1-layer){
        num=getCircle(layer+1)-n+2-y+layer*3;
    }
    else{
        num=getCircle(layer+1)-x+1+layer;
    }
    printf("%d\n",num);
    return 0;
}

另外,附带上一份螺旋矩阵的显示:

#include<stdio.h>
#include<stdlib.h>
//N阶螺旋矩阵 
int main() 
{ 
    int N,i,j,n,num=1; 
    int **a; 
    printf("输入你要输出的几阶中断:"); 
    scanf("%d",&N); 
    a = (int **)malloc(sizeof(int *) * N);//每一行的地址
    for(i = 0; i < N; i++)
        a[i] = (int *)malloc(sizeof(int) * N);//存放每一行的数字
    for(n=0;n<=N/2;n++) 
    { 
        for(j=n;j<=N-n-1;j++) 
            a[n][j]=num++; 
          
        for(i=n+1;i<N-n-1;i++) 
            a[i][N-n-1]=num++; 
          
        for(j=N-n-1;j>n;j--) 
            a[N-n-1][j]=num++; 
          
        for(i=N-n-1;i>n;i--) 
            a[i][n]=num++; 
    }   
    //输出螺旋矩阵  
    for(i=0;i<N;i++) 
    { 
        for(j=0;j<N;j++) 
            printf("%2d ",a[i][j]); 
        printf("\n"); 
    }
    return 0; 
}


上一篇 下一篇

猜你喜欢

热点阅读