2014年9月28日 星期日

單精準度轉換成十進位

http://zh.wikipedia.org/wiki/%E5%96%AE%E7%B2%BE%E5%BA%A6%E6%B5%AE%E9%BB%9E%E6%95%B8

#include<iostream>
#include<math.h>
#include<string>
using namespace std;
int main()
{
//01000000011000000000000000000000
//10111111100000000000000000000000
//01000001010010000000000000000000
string input;
string a="",b="",c="",b_invert="";
double d_b=0.0,d_c=0.0,ans=0;
cout<<"please input number";
cin>>input;
cout<<"szie="<<input.length()<<endl;
a=input[0];

for(int i=1;i<=8;i++)
b=b+input[i];
for(int j=7;j>=0;j--)
b_invert=b_invert+b[j];

for(int i=0;i<=7;i++)
d_b=d_b+(b_invert[i]-48)*pow(2.0,i);
d_b=d_b-127;

cout<<"exp = "<<d_b<<endl;


for(int k=9;k<=31;k++)
c=c+input[k];

for(int l=0;l<=22;l++)
d_c=d_c+(c[l]-48)*pow(2.0,-1*(l+1));
cout<<"dc = "<<d_c<<endl;
d_c=1+d_c;

cout<<"fraction = "<<d_c<<endl;

ans=d_c*pow(2.0,d_b);
if(a=="0")
cout<<"ans = +" ;
else
cout<<"ans = -" ;
cout<<ans<<endl;

return 0;
}

2014年8月25日 星期一

複習stack

#include <iostream>
using namespace std;
class my_stack
{
    private:
        int *number;
        int pos;
        int size;
    public:
        my_stack()                                          //default
        {
            number=new int[100];
            pos=-1;
            size=100;
        }
        my_stack(int len)                                   //assign size
        {
            number=new int[len];
            pos=-1;
            size=len;
        }
        void pop()                                          //pop
        {
            cout<<"pop "<<number[pos]<<endl;
            pos--;
            if(pos==-2)
            {
                cout<<"====================="<<endl;
                cout<<"index can't be slower than 0,try again"<<endl;
                cout<<"====================="<<endl;
                pos++;
            }

        }
        void push(int num)                                  //push
        {
            pos++;
            if(pos+1>size)
            {
                cout<<"====================="<<endl;
                cout<<"error buffer is filled,try again"<<endl;
                cout<<"====================="<<endl;
                pos--;
            }
            else
                number[pos]=num;
        }
        void show()                                         //show
        {
            if(pos==-1)
            {
                cout<<"====================="<<endl;
                cout<<"there is no content"<<endl;
                cout<<"====================="<<endl;
            }
            else
            {
                cout<<"====================="<<endl;
                cout<<"index low to high"<<endl;
                cout<<"stack contents"<<endl;
                cout<<"====================="<<endl;
                for(int i=pos;i>=0;i--)
                    cout<<"|"<<"__"<<number[i]<<"__"<<"|"<<endl;
            }
        }
        ~my_stack(){}                                       //delete
};
int main()
{
    int number;
    int opt;
    int size;
    cout<<"input stack size : ";
    cin>>size;
    my_stack source(size);

    cout<<"1 --- push "<<endl
        <<"2 --- pop  "<<endl
        <<"3 --- show "<<endl;

    while(true)
    {
      cout<<"command number : " ;
      cin>>opt;
      switch(opt)
      {
          cin>>opt;
          case 1:
              cout<<"enter a number : ";
              cin>>number;
              source.push(number);
              break;
          case 2:
              source.pop();
              break;
          case 3:
              source.show();
            break;

          default:
            cout<<"input error , try again"<<endl;
            break;
      }
    }
    return 0;
}

2014年4月6日 星期日

MIPS 輸入10組密碼 如果是這十組密碼內 則成功

.data
value: .word 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
msg1: .asciiz "correct\n“
msg2: .asciiz "incorrect please try again\n“
msg3: .asciiz "===========================\n“
.text
main:
 la $t0, value         #  array
 li $s1, 0        #  i
 li $t1, 0        #  index
 li $t2, 0        #  arr[index]
read:
 li $v0, 5
 syscall
 add $t2,$t1,$t0        #t2=arr[t1]
 sw $v0, 0($t2)         #store to array
 add $t1,$t1,4
 add $s1, $s1, 1        #  i++
 beq $s1, 10 , line  #  i<10?
 j read
line:
 li $v0, 4        # draw a line
 la $a0, msg3
 syscall
guess:
 li $s3, 0        #  k
 li $t3, 0        #  index2
 li $t4, 0        #  arr[index2]
 li $v0, 5
 syscall
inner_for:
 add $t4,$t3,$t0
 lw  $t5,0($t4)        #arr[index2] load to $t5
 bne $v0,$t5,ER
 li $v0, 4
 la $a0, msg1  #print correct
 syscall
 j guess   #restart guess
ER:
 add $s3, $s3, 1        #  k++
 add $t3,$t3,4
 beq $s3, 10 , while  #  k<10?
 j inner_for
while:
 li $v0, 4
 la $a0, msg2  #print incorrect
 syscall
 j guess

2014年4月2日 星期三

LISP

 (fast 2 * n 1)  ==> 2^n
 (fast 2 + n 0)  ==> 2*n

(define (fast a op n unit)
 (define (square x) (op x x))
 (define (iter a n result)
         (cond ((= n 0) result)
               ((even? n) (iter (square a) (/ n 2) result))
               (else (iter a (- n 1) (op a result)))))
(iter a n unit))

2014年3月30日 星期日

spanning tree prim C++

#include <iostream>
#include<string>
#include<vector>
using namespace std;
struct link{
string node1;
string node2;
int weighted;
};
void split(string, vector<link>*);
int count_node(vector<link>*, vector<string>*);
int main()
{
vector<link>input;                      //原始input
vector<string>n_list;     //node的list
vector<string>new_n_list;     //node的list
vector<link>Candidate;
vector<link>answer;                     //最後要輸出的結果
string command;                         //每一行輸入
int size, edge_count = 0, node_count;
while (true)
{
getline(cin, command);
if (command == "exit")
break;
split(command, &input);
}
node_count = count_node(&input, &n_list);                   //算有幾個點 & 做出點的list

/////prim//////
int  total_weighted = 0;
link tmp;
new_n_list.push_back(n_list[0]);       //以第一個當作起點
n_list.erase(n_list.begin());
for (int i = 0; edge_count != (node_count - 1); i++)
{

string n1, n2;
for (int j = 0; j < new_n_list.size(); j++)    //需要想法QAQ
{
n1 = new_n_list[j];
for (int k = 0; k < n_list.size(); k++)
{
n2 = n_list[k];
for (int l = 0; l < input.size(); l++)
{
if (n1==input[l].node1 && n2==input[l].node2)
{
Candidate.push_back(input[l]);
}
else if (n1==input[l].node2 && n2==input[l].node1)
{
Candidate.push_back(input[l]);
}
}
}
}
tmp = Candidate[0];
for (int j = 0; j < Candidate.size(); j++)         //挑最小的
{
if (tmp.weighted>Candidate[j].weighted)
tmp = Candidate[j];
}
answer.push_back(tmp);
edge_count++;
bool flag = 0;           //scan node1 in or not in
for (int j = 0; j < new_n_list.size(); j++)
{
if (tmp.node1 == new_n_list[j])
{
flag = 1;
break;
}
}
if (!flag)
{
new_n_list.push_back(tmp.node1);
for (int j = 0; j < n_list.size(); j++)    //刪除另一個set裡面的東西
{
if (tmp.node1 == n_list[j])
{
n_list.erase(n_list.begin() + j);
break;
}
}
}

flag = 0;              //scan node2 in or not in
for (int j = 0; j < new_n_list.size(); j++)
{
if (tmp.node2 == new_n_list[j])
{
flag = 1;
break;
}
}
if (!flag)
{
new_n_list.push_back(tmp.node2);
for (int j = 0; j < n_list.size(); j++)
{
if (tmp.node2 == n_list[j])
{
n_list.erase(n_list.begin() + j);
break;
}
}
}
for (int j = 0; j < input.size(); j++)
{
if ((tmp.node1 == input[j].node1) && (tmp.node2 == input[j].node2) && (tmp.weighted == input[j].weighted))
{
input.erase(input.begin() + j);
break;
}
}
Candidate.clear();
}

size = answer.size();          //印答案
for (int i = 0; i < size; i++)
{
cout << answer[i].node1 << "-" << answer[i].node2 << "  " << answer[i].weighted << endl;
total_weighted = total_weighted + answer[i].weighted;
}
cout << "total weighted = " << total_weighted << endl;

return 0;
}
void split(string input, vector<link>* data)
{
int dash_pos, space_pos;
int str_len = input.length();
link push_back;
string tmp = "";
for (int i = 0; i < str_len; i++)  //找 - 位置
{
if (input[i] == '-')
{
dash_pos = i;
break;
}
}
for (int i = dash_pos + 1; i < str_len; i++)//找 空白 位置
{
if (input[i] == ' ')
{
space_pos = i;
break;
}
}
for (int j = 0; j < dash_pos; j++)
tmp = tmp + input[j];
push_back.node1 = tmp;
tmp = "";
for (int j = dash_pos + 1; j < space_pos; j++)
tmp = tmp + input[j];
push_back.node2 = tmp;
tmp = "";
for (int j = space_pos + 1; j < str_len; j++)
tmp = tmp + input[j];
push_back.weighted = atoi(tmp.c_str());
data->push_back(push_back);
}
int count_node(vector<link>* data, vector<string>* node_set)    //算點數 同時做出點的list
{
int count = 0;
int size = data->size();
int len;
for (int i = 0; i < size; i++)
{
link tmp = (*data)[i];
string node1 = tmp.node1;
string node2 = tmp.node2;
bool node1_flag = 0, node2_flag = 0;
len = node_set->size();
for (int j = 0; j < len; j++)
{
if (node1 == (*node_set)[j])
{
node1_flag = 1;
break;
}
}
if (node1_flag == 0)
{
(*node_set).push_back(node1);
count++;
}
len = (*node_set).size();
for (int k = 0; k < len; k++)
{
if (node2 == (*node_set)[k])
{
node2_flag = 1;
break;
}
}
if (node2_flag == 0)
{
(*node_set).push_back(node2);
count++;
}
}
return count;
}

2014年3月29日 星期六

spanning tree Kruskal C++

example input :
====================================                  
a-b 2
b-c 4
c-f 5
e-f 5
d-e 2
d-a 4
d-b 4
b-e 3
b-f 1
exit
===================================
#include <iostream>
#include<string>
#include<vector>
using namespace std;
struct link{
string node1;
string node2;
int weighted;
};
void split(string,vector<link>*);
void sort(vector<link>*);
int count_node(vector<link>*, vector<string>*);
int main()
{
vector<link>input;                      //原始input
vector<string>n_list; //node的list
vector<link>answer;                     //最後要輸出的結果
string command;                         //每一行輸入
int size,edge_count=0,node_count;
while (true)
{
getline(cin, command);
if (command == "exit")
break;
split(command, &input);
}
sort(&input);                            //根據權重由小到大排

node_count = count_node(&input,&n_list);                    //算有幾個點 & 做出點的list
int *Visited = new int[node_count]; //建立node set概念用
for (int i = 0; i < node_count; i++)
Visited[i] = 0;
link tmp;
int node1_pos,node2_pos,total_weighted=0;
int min,bigger;
for (int i = 0;edge_count != node_count-1 ; i++) //找出答案
{
tmp = input[i];
for (int j = 0; j < node_count; j++)
{
if (tmp.node1 == n_list[j])
{
node1_pos = j;
break;
}
}
for (int j = 0; j < node_count; j++)
{
if (tmp.node2 == n_list[j])
{
node2_pos = j;
break;
}
}
if ((Visited[node1_pos] == 0) && (Visited[node2_pos] == 0))
{
Visited[node1_pos] = i+1;
Visited[node2_pos] = i+1;
answer.push_back(tmp);
edge_count++;
total_weighted = total_weighted + tmp.weighted;
}
else if (Visited[node1_pos] == 0 || Visited[node2_pos]==0)
{
if (Visited[node1_pos] == 0)
Visited[node1_pos] = Visited[node2_pos];
else
Visited[node2_pos] = Visited[node1_pos];
answer.push_back(tmp);
edge_count++;
total_weighted = total_weighted + tmp.weighted;
}
else if (Visited[node1_pos] != 0 && Visited[node2_pos] != 0 && Visited[node1_pos] != Visited[node2_pos])
{
if (Visited[node1_pos] > Visited[node2_pos])
{
min = Visited[node2_pos];
bigger = Visited[node1_pos];
}
else
{
min = Visited[node1_pos];
bigger = Visited[node2_pos];
}
for (int k = 0; k < node_count; k++)
{
if (Visited[k] == bigger)
Visited[k] = min;
}
answer.push_back(tmp);
edge_count++;
total_weighted = total_weighted + tmp.weighted;
}
else
;
}
size = answer.size(); //印答案
for (int i = 0; i < size; i++)
cout << answer[i].node1 << "-" << answer[i].node2 << "  " << answer[i].weighted << endl;
cout << "total weighted = " << total_weighted << endl;
return 0;
}
void split(string input, vector<link>* data)
{
int dash_pos, space_pos;
int str_len = input.length();
link push_back;
string tmp = "";
for (int i = 0; i < str_len; i++) //找 - 位置
{
if (input[i]=='-')
{
dash_pos = i;
break;
}
}
for (int i = dash_pos + 1; i < str_len; i++)//找 空白 位置
{
if (input[i] == ' ')
{
space_pos = i;
break;
}
}
for (int j = 0; j < dash_pos; j++)
tmp = tmp + input[j];
push_back.node1 = tmp;
tmp = "";
for (int j = dash_pos + 1; j < space_pos; j++)
tmp = tmp + input[j];
push_back.node2 = tmp;
tmp = "";
for (int j = space_pos + 1; j < str_len; j++)
tmp = tmp + input[j];
push_back.weighted = atoi(tmp.c_str());
data->push_back(push_back);
}
void sort(vector<link>* data)
{
int size = data->size();
link tmp;
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size - 1; j++)
{
if ((*data)[j].weighted >(*data)[j+1].weighted)
{
tmp = (*data)[j];
(*data)[j] = (*data)[j + 1];
(*data)[j + 1] = tmp;
}
}
}
}
int count_node(vector<link>* data, vector<string>* node_set) //算點數 同時做出點的list
{
int count = 0;
int size = data->size();
int len;
for (int i = 0; i < size; i++)
{
link tmp = (*data)[i];
string node1 = tmp.node1;
string node2 = tmp.node2;
bool node1_flag = 0, node2_flag = 0;
len = node_set->size();
for (int j = 0; j < len; j++)
{
if (node1 == (*node_set)[j])
{
node1_flag = 1;
break;
}
}
if (node1_flag == 0)
{
(*node_set).push_back(node1);
count++;
}
len = (*node_set).size();
for (int k = 0; k < len; k++)
{
if (node2 == (*node_set)[k])
{
node2_flag = 1;
break;
}
}
if (node2_flag == 0)
{
(*node_set).push_back(node2);
count++;
}
}
return count;
}

2014年3月9日 星期日

UVA 12468 C++

#include <iostream>
using namespace std;
int main()
{
int a, b;
while (cin >> a, cin >> b)
{
if (a == -1 && b == -1)
break;
if (a > b)
{
if ((a - b) > 50)
cout << b + 100 - a << endl;
else
cout << a - b << endl;
}
else
{

if ((b - a) > 50)
cout << a + 100 - b << endl;
else
cout << b - a << endl;
}
}
return 0;
}