1. 程式人生 > >NYIST 練習 題解(二)

NYIST 練習 題解(二)

CTF 皮皮蝦  所寫題解

想了解CTF的同學可以進群瞭解 (只限本校17級的新生) 811409334

接著上一篇寫 

J 猴子吃桃問題 

這個其實很簡單的 只要逆推就行了 他這個是吃掉一半多一個 那麼剩下的+1 就是一半 那麼就可以寫出程式碼 

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
int main()
{
    int t,n,ans;
    scanf("%d",&t);
    while(t--)
    {
        ans=1;
       scanf("%d",&n);
       for(int i=0;i<n;i++)
       {
             ans=(ans+1)*2;
       }
       printf("%d\n",ans);
    }
    return 0;
}

K 正三角形的外接圓面積

這個需要高中知識 三角形邊長/(根號3)=外接圓半徑  sqrt 這個函式就是開方的 注意精度 .2是控制精度的 就是小數點後兩位

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define pi 3.1415926
int main()
{
    int n;
    double m;
    double r;
    scanf("%d",&n);
    while(n--)
    {
       scanf("%lf",&m);
       r=m/sqrt(3.0);
       printf("%.2lf\n",r*r*pi);
    }
    return 0;
}

L 兩點距離

這個知道k 這個就很簡單了

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define pi 3.1415926
int main()
{
    int n;
    double x,y,xx,yy;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%lf%lf%lf%lf",&x,&y,&xx,&yy);
        printf("%.2lf\n",sqrt((x-xx)*(x-xx)+(y-yy)*(y-yy)));
    }
    return 0;
}

M 開燈問題

這個上一年我暴力就心態崩了 其實可以用bool 還有!  bool 只有 0 1 那麼可以用它來表示開燈關燈的狀態  !是0變1 1變0  可以模仿開燈關燈

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define pi 3.1415926
bool d[1200];
int main()
{
    memset(d,0,sizeof(d));
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
         for(int j=1;j<=n;j++)
         {
              if(j%i==0)
                  d[j]=!d[j];
         }
    }
    for(int i=1;i<=n;i++)
    {
         if(d[i])
            printf("%d ",i);
    }
    printf("\n");
    return 0;
}

N 字串替換

這個就是gets 和scanf的用法 scanf 是遇見空格或者換行都停止輸入 而gets是遇見換行才會停止輸入(但是gets會造成輸入溢位 會讓惡意的shellcode 獲得程式控制權 gets是個危險函式!)

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define pi 3.1415926
char d[1200];
int main()
{
     int len;
    while(gets(d))
    {
          len=strlen(d);
          for(int i=0;i<len;i++)
          {
                if(d[i]=='y'&&d[i+1]=='o'&&d[i+2]=='u')
                       {
                           printf("we");
                           i+=2;
                           continue;
                       }
                 printf("%c",d[i]);
          }
          printf("\n");
    }
    return 0;
}

O 房間安排

這個是 只要找到時間區段中最大房間用量就行

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define pi 3.1415926
int d[11200];
int main()
{
    int t,n,a,b,c,maxx;
    scanf("%d",&t);
    while(t--)
    {
         memset(d,0,sizeof(d));
         maxx=0;
         scanf("%d",&n);
         while(n--)
         {
              scanf("%d%d%d",&a,&b,&c);
              for(int i=b;i<b+c;i++)
                   d[i]+=a;
         }
         for(int i=0;i<11000;i++)
         {

                 if(d[i]>maxx)
                  maxx=d[i];
         }
         printf("%d\n",maxx);
    }
    return 0;
}

P 素數

這個在上面的基礎上 兩邊開始找素數就行 注意兩邊相同的時候 要大的 

#include<stdio.h>
#include<string.h>
bool ppx[1500];
void init()
{
    memset(ppx,0,sizeof(ppx));
    ppx[0]=ppx[1]=1;
    for(int i=2; i<675; i++)
    {
        if(ppx[i])
            continue;
        for(int j=i*i; j<1500; j+=i)
        {
            ppx[j]=1;
        }
    }
}
int main()
{
    init();
    int n,m;
    scanf("%d",&n);
    while(n--)
    {
        int i=0;
        int x=0x7f7f7f7f,xx=0x7f7f7f7f;
        scanf("%d",&m);
        if(!ppx[m])
            printf("%d\n",m);
        else
        {
            while(1)
            {
                i++;
                if(!ppx[m+i])
                {
                    printf("%d\n",m+i);
                    break;
                }
                if(m-i>=0&&!ppx[m-i])
                {
                    printf("%d\n",m-i);
                    break;
                }
            }
        }


    }
}

Q 斐波那契數列

這個 注意2^64 那麼只能用無符號的(因為這裡沒有負數) 有符號 2^63 無符號2^64

#include<stdio.h>
#include<string.h>
unsigned long long int p[1000];
void init()
{
     p[1]=1;
     p[2]=1;
     for(int i=3;i<=93;i++)
     {
         p[i]=p[i-1]+p[i-2];
     }
}
int main()
{
   init();
   unsigned long long int n;
   bool flag;
   while(~scanf("%llu",&n))
   {
         flag=0;
          if(n==0)
            break;
        for(int i=1;i<=93;i++)
        {
            if(p[i]==n)
                flag=1;
        }
        if(flag)
            printf("YES\n");
        else
            printf("NO\n");
   }
   return 0;
}

R 畫圖

這個太水了把。。。。(暗示大風車)

#include<stdio.h>
#include<string.h>

int main()
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
            printf("*");
        printf("\n");
    }
  return 0;
}

S 九九乘法表

觀察一下 樣例的輸入輸出 跟著模擬就行了  注意格式!

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