題目均來自九度,北大的研究生機試題
題目1118:數制轉換
-
題目描述:
-
求任意兩個不同進位非負整數的轉換(2進位~16進位),所給整數在long所能表達的範圍之內。
不同進位的表示符號為(0,1,...,9,a,b,...,f)或者(0,1,...,9,A,B,...,F)。
-
輸入:
-
輸入只有一行,包含三個整數a,n,b。a表示其後的n 是a進位整數,b表示欲將a進位整數n轉換成b進位整數。a,b是十進位整數,2 =< a,b <= 16。
資料可能存在包含前置字元為零的情況。
-
輸出:
-
可能有多組測試資料,對於每組資料,輸出包含一行,該行有一個整數為轉換後的b進位數。輸出時字母符號全部用大寫表示,即(0,1,...,9,A,B,...,F)。
-
範例輸入:
-
15 Aab3 7
-
範例輸出:
-
210306
-
提示:
-
可以用字串表示不同進位的整數。
#include <stdio.h>char str[100];int a,b;int num,tmp,i;int main() {while(scanf("%d%s %d", &a, str, &b) != EOF){num = 0;for(i=0; str[i]; i++){if(str[i] >= 'a') str[i] -= 32;tmp = (str[i] >= 'A' ? str[i]-'A'+10:str[i]-'0');//tmp = str[i]num = num * a + tmp;}int cnt=0;if(num == 0){puts("0"); continue;}while(num){if(num%b <=9)str[cnt++] = num%b+'0';elsestr[cnt++] = num%b-10+'A';num = num/b;}for(i=cnt-1; i>=0; i--)printf("%c",str[i]);puts("");}return 0;}
題目1138:進位轉換
-
題目描述:
-
將一個長度最多為30位元字的十進位非負整數轉換為位元輸出。
-
輸入:
-
多組資料,每行為一個長度不超過30位的十進位非負整數。
(注意是10進位數位個數可能有30個,而非30bits的整數)
-
輸出:
-
每行輸出對應的位元。
-
範例輸入:
-
0138
-
範例輸出:
-
01111000
#include <stdio.h>#include <iostream>using namespace std;char str[40],ans[200];int nums[40],n,len;int main() { while(~scanf("%s",str)){ n=0; for(n=0; str[n];n++) nums[n] = str[n]-'0'; int d; len = 0; int start = 0,tmp; while(start < n){ d = 0; //借位 ans[len++] = nums[n-1]%2 +'0'; //cout << nums[0] << "" << nums[1] << endl; for(int i=start; i<n; i++){ tmp = nums[i]; nums[i] = (nums[i]+d) / 2; if(tmp & 1) d=10; else d=0; } if(nums[start] == 0) start++; } for(int i=len-1; i>=0; i--) printf("%c",ans[i]); puts(""); } return 0;}