1. 程式人生 > 實用技巧 >入門篇(1)- 進位制轉換

入門篇(1)- 進位制轉換

p進位制轉q進位制

思路:先把p進位制數x轉換為10進位制數y,再利用輾轉相除法把10進位制數y轉化為q進位制數,用陣列z儲存q進位制數的每一位。

#include<cstdio>
int main()  {
	//8進位制數342轉2進位制
	char str[20] = "342 8 2";
	int x, p, q;
	sscanf(str, "%d %d %d", &x, &p, &q);
	//p進位制轉x10進位制y
	int product = 1, y = 0;
	while(x) {
		y += (x%10)*product;
		product *= p;
		x /= 10;
	}
	printf("%d\n", y);
	//十進位制數y轉q進位制數
	int z[40], num = 0;
	do {
		z[num++] = y%q;
		y /= q;
	} while(y);
	for(int i = num-1; i >= 0; i--) printf("%d", z[i]);
	return 0;
}

pat B1022 D進位制的A+B

題目描述

​ 輸入兩個非負10進位制整數A和B(<=2^30-1)以及D(進位制數),輸出A+B的D(1<D<=10)進位制數。

輸入格式:

​ 在一行一次給出三個整數A、B和D。

輸出格式:

​ A+B的D進位制數。

樣例輸入:

​ 123 456 8

樣例輸出:

​ 1103

思路:

​ 先計算A+B的值,再十進位制直接轉D進位制(輾轉相除法)。

程式碼:

#include<cstdio>
int main()  {
	int a, b, d;
	scanf("%d %d %d", &a, &b, &d);
	int sum = a + b;
	int z[40];
	int num = 0;
	//do while可以避免sum==0的衝突
	do {
		z[num++] = sum%d;
		sum /= d; 
	} while(num);
	for(int i = num-1; i >= 0; i--) printf("%d", z[i]);
	return 0;
}