2015年9月22日 星期二

CPE 10403:Funny Encryption Method

題目來源:https://uva.onlinejudge.org/external/100/p10019.pdf
公式:
10進制轉2進制公式
觀念:
這題的主要觀念是字元陣列的讀取,因為我是使用cin.get的方式,因此陣列排列的時候是由最高位數開始放陣列0,而到最低位數時為最高陣列,所以在第二個副程式16進制轉2進制的時候﹑,i必須要從大的往下跑迴圈,接著就可以順利跑完10進制轉2進制。


程式碼:
//Yuan_Syun in 2015/9/18.
#include<iostream>
#include<cstdlib> //atoi();
#include<cmath> //數學函式
using namespace std;

void binary(char* in); //* 表示記憶體位址
void hexa(char* in, int count);

int main()
{
char in[5];
int count = 0;

cin.get(in, 5); //一個個輸入到陣列
do //計算輸入數量,以利16進制時控制輸入量
{
count = count + 1;
} while (in[count] != '\0');

binary(in);
hexa(in,count);

system("pause");
return 0;
}

void binary(char* in) //十轉二進制
{
int a, b[16];
int count_2 = 0, one = 0;

a = atoi(in); //char轉int

for (int x = 0; x < 16; x++) //把b[16]初始化
{
b[x] = 0;
}

for (int i = 0; i < 16; i++) //10進制轉2進制過程
{
b[i] = a % 2; //取餘數
if (a == 1) break;
a = a / 2; //得到商
count_2 ++;
}

cout << in << "為10進制轉2進制:";
for (int z = count_2; z >= 0; z--)
{
cout << b[z];
if (b[z] == 1) //計算1的數量
one++;
}
cout << endl << in << "為10進制轉2進制1的數量:" << one << endl;
}

void hexa(char* in, int count)
{
int a[17];
int count_3 = 0, count_4 = 0, y = 0;

for (int x = 0; x < 17; x++) //把a[1024]初始化
{
a[x] = 0;
}

for (int i = count-1; i >= 0; i--) //count-1 是因為陣列的初始是0
{
int in_2 = in[i] - '0'; //char轉int
for (y = 0; y < 4; y++) //滿足每個16進制都有4位元
{
a[count_3] = in_2 % 2; //10進制轉2進制過程
in_2 = in_2 / 2;
count_3++;
}
}

cout << in <<"為16進制轉2進制:";
for (int z = 15; z >= 0; z--)
{
cout << a[z];
if (a[z] == 1) //計算1的數量
{
count_4++;
}
}
cout << endl << in <<"為16進制轉2進制1的數量:" << count_4 << endl;
}

沒有留言:

張貼留言

歡迎指教或發問