2015年12月31日 星期四

TO-Z2A:101年正式題第3題-子題2-編碼

101年正式題第3-子題2-編碼

題目大意:讀入一串只有01的字串,由下列編碼表找出對應的字元
二進制
字元

二進制
字元
00
A
11100
4
01
B
11101
5
100
0
111100
6
101
1
111101
7
1100
2
111110
8
1101
3
111111
9

輸入檔(in.txt)
6
1111001111011111101111111000010001
101110011101110111000010101
11100110111001011110001
111011100110111100110100
1011100100111111110000
1011100110111100110001

輸出檔(ou.txt)
6789,0A0B
1253,2A1B
4321,4B
5234,3A
1209,2A
1234,2B

解題參考說明:
讀入的字串由第1個位元開始,
b若為1  {判斷第5個連續1 (1)轉成字元}
b若不為1 (2) 轉成字元
轉成字元:假設第j個位元是連續51或第j個字元是0
( j之前連續1的個數one 、第j+1位元為d)
        換算碼 k = 2*one+d+1 由右字串找 tbl= "AB0123456789"
    one的個數要歸零

程式碼如下:
   Dim tbl = "AB0123456789"
    FileOpen(1, "in.txt", OpenMode.Input)
    FileOpen(3, "ou.txt", OpenMode.Output)
    Dim fn As Integer = 1
    Dim n As Short = LineInput(fn)
    For i = 1 To n
        Dim line As String = LineInput(fn)
        Dim one As Short = 0   '位元連續1的個數
        Dim dcnt As Short = 0
        Dim k As Integer
        For j = 1 To line.Length
            Dim b As Char = Mid(line, j, 1)   '1個位元
            If b = "1" Then
                one += 1  
                If one = 5 Then 
                    j += 1  ' (1)51直接 以後1位元判斷是 8 9
                    k = 2 * one + 1 + Mid(line, j, 1)
                    If dcnt = 4 Then Print(3, ",") '已印4個數字:加 才接 aAbB
                    Print(3, Mid(tbl, k, 1))
                    dcnt += 1  '1個數字
                    one = 0
                End If
            Else ' (2) 讀入的是 0 ,一次處理後2
                j += 1  '以左邊 1 的個數 右邊01判斷
                k = 2 * one + 1 + Mid(line, j, 1)
                If dcnt = 4 Then Print(3, ",") '已印4個數字:加 才接 aAbB
                Print(3, Mid(tbl, k, 1))
                dcnt += 1
                one = 0
            End If
        Next j
        PrintLine(3)
    Next

    End

2015年10月23日 星期五

z1 - vb 小考範例

1程式小考範例
會提供的英文:
Boolean Byte Char Date Decimal Double Integer Long SByte Short Single String UInteger ULong UShort  
一、請將下列空白補上適當的名詞或數字{參考1-17}
中文
英文
佔用Bytes
中文
英文
佔用Bytes
位元組


長整數


正位元組


正長整數


短整數


單精度浮點數


正短整數


雙精度浮點數


整數


字元


正整數


字串


布林


日期


二、寫出下列各型別可表示的範圍:
型別
範圍
中文
範圍
Byte
Long
SByte
Short
Integer
UShort
UInteger
ULong

三、計算題:
1以8位元計算: (100)10 = (                    )2   (100)10 = (                    )2

212位元計算: (1234)10 = (                    )16   (1234)10 = (                    )16

312位元計算: (12345)10 = (                    )16   (12345)10 = (                    )16

參考:(12345)1012bits二進位→( 0011 0000 0011 1001 )2
       (12345)1012bits二進位→( 1100 1111 1100 011 )←最右的1及其右不變左換
        轉成十六進位(   C    F    C    7  )16

 或 216 = 65536 – 12345 = 53191 = 1100 1111 1100 0111 

2015年8月26日 星期三

C++進階研習: a010因數分解

// zerojudge.tw a010 質因數分解
//   建質數表較費事,若資料不多不一定要建表,像a007有十萬筆就一定要建表
#include <iostream>
#include <cstring>
#include <vector>
#include <cmath>
#define maxn 46340  // sqrt(2147483647) < 46341
using namespace std;
bool c[maxn+10];  //0~46340之間false為質數
vector <int> p;    // 2~46340之間的質數共有 4792
//  p[4791]=46337 , p[4790]=46327p[4792]=46349

// 以下 isp 為函式, 傳入 n 判斷是否為質數
bool isp(int n)
{
  if(n<=maxn) return( !c[n] );
  int q = (int) sqrt(n);
  int k;
  for(k=0; k<p.size() && p[k]<=q ; ++k)
    if(n%p[k]==0) return false;
  return true;    
}
// 篩法建 c[0..46340] 及 vector <int> 
void sieve()
{
  int i,j,k;
  memset(c,0,sizeof(c));
  c[0]=c[1]=1;
  for(i=2;i<=maxn;++i)
  {
     if(c[i]==1) continue; //非質數
     p.push_back(i);  // i是質數,放入 p
     //是質數的倍數 註記為非質數
     for(j=i+i; j<=maxn; j+=i)
       c[j]=1;                  
  }
  //  for(k=2; k<=100; ++k)  // 印出 2~100的質數
//    if( !c[k] ) cout << k << endl;
//  cout << p.size() <<" " << p[p.size()-1] << endl;
  return ;
}
// 主程式
int main()
{
  sieve(); //建質數表,有bool c[] vector <int> p
  int n;
  while( cin >> n ) 
  {
         int i=0, f=0;
         bool lead=true;
    while( n>1 && i<p.size() )
    {
            if(n%p[i]==0)
                 {
                    n/=p[i];
                         ++f;      
                 }
                 else
                 {
         if(f>0)
                        {
                                if(lead) lead=false; else cout <<" * ";
                                 cout <<p[i];
               if(f>1) cout <<"^" <<f;
           f=0;
                   }
                        ++i;
                 }
         }
         if(n>1 || f>0)
         {
                   if(lead) lead=false; else cout <<" * ";  // n>1 f>0 不同時
         if(f>0) cout <<p[i];
         if(f>1) cout <<"^" <<f;
         if(n>1) cout << n;
        }
    cout << endl;
  }
  return 0;
}
/*
範例輸入
20
17
999997
288
614017530
92822
2147210123
範例輸出
2^2 * 5
17
757 * 1321
2^5 * 3^2
2 * 3^3 * 5 * 7^2 * 46411
2 * 46411
46327 * 46349

*/