問題 A: 又一版 A+B
時間限制: 1 Sec 記憶體限制: 32 MB
題目描述
輸入兩個不超過整型定義的非負10進制整數A和B(<=231-1),輸出A+B的m (1 < m <10)進制數。
輸入
輸入格式:測試輸入包含若幹測試用例。每個測試用例占一行,給出m和A,B的值。
當m為0時輸入結束。
輸出
輸出格式:每個測試用例的輸出占一行,輸出A+B的m進制數。
樣例輸入
2 4 5
8 123 456
0
樣例輸出
1001
1103
提示
注意輸入的兩個數相加後的結果可能會超過int和long的範圍。
用long long 即可
代碼:
#include<iostream>
using namespace std;
typedef long long ll;
int main(){
ll a,b,c;
int d,ans[40],index;
while(cin>>d){
if(d==0) break;
cin>>a>>b;
c=a+b;
index=0;
do{
ans[index++]=c%d;
c/=d;
}while(c);
for(int i=index-1;i>=0;i--){
cout<<ans[i];
}
cout<<endl;
}
return 0;
}
問題 B: 數制轉換
時間限制: 1 Sec 記憶體限制: 32 MB
題目描述
求任意兩個不同進制非負整數的轉換(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)。
樣例輸入
4 123 10
樣例輸出
27
提示
用字元串存儲和表示不同進制的數。
坑:linux作業系統上定義string ans;後可以直接index=0;ans[index++]=‘c’; string下标自動擴長 windows下似乎不可以,反正codeup OJ不允許 調了好久
代碼:
#include<iostream>
#include <string>
#include<string.h>
using namespace std;
char ToChar[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
int ToNum(char c){
for(int i=0;i<16;i++){
if(c==ToChar[i])
return i;
}
for(int i=10;i<16;i++){
if(c==(ToChar[i]+32))
return i;
}
}
int main(){
string n,
char[40] ans;
int a,b;
long long m,t;
while(cin>>a>>n>>b){
memset();
m=0;
t=1;
for(int i=n.length()-1;i>=0;i--){
m+=ToNum(n[i])*t;
t*=a;
}
int x,index=0;
do{
x=m%b;
ans[index++]=ToChar[x];
m/=b;
}while(m);
for(int i=index-1;i>=0;i--){
cout<<ans[i];
}
cout<<endl;
}
return 0;
}
問題 C: 進制轉換
時間限制: 1 Sec 記憶體限制: 32 MB
題目描述
将一個長度最多為30位數字的十進制非負整數轉換為二進制數輸出。
輸入
多組資料,每行為一個長度不超過30位的十進制非負整數。
(注意是10進制數字的個數可能有30個,而非30bits的整數)
輸出
每行輸出對應的二進制數。
樣例輸入
985
211
1126
樣例輸出
1111011001
11010011
10001100110
分析:大數問題,其實仔細分析,也不是那麼麻煩,中間的細節難以把握,有時還是要打斷點
代碼:
#include<iostream>
#include<string>
using namespace std;
string a;
char ans[31],mod[105];
int p,index;
void div(){
p=0;index=0;
for(int i=0;i<a.length();i++){
p=p*10+(a[i]-'0');
if(p<2){
if(index!=0) ans[index++]='0';//開頭的0不要
}else{
ans[index++]=p/2+'0';
p=p%2;
}
}
ans[index]='\0';
//此時 p為本次除法餘數 ans為商
}
int main(){
while(cin>>a){
int count=0;
while(a!=""){//a!=""不是a!="0" 最後a=1 循環一次不執行,p=1 但a="" 隻有a[0]='\0' 有時還是要打斷點
div();
mod[count++]=p+'0';
a=ans;
}
for(int i=count-1;i>=0;i--){
cout<<mod[i];
}
cout<<endl;
}
return 0;
}
問題 D: 八進制
時間限制: 1 Sec 記憶體限制: 32 MB
題目描述
輸入一個整數,将其轉換成八進制數輸出。
輸入
輸入包括一個整數N(0<=N<=100000)。
輸出
樣例輸入
9
8
5
樣例輸出
11
10
5
代碼:
#include<iostream>
using namespace std;
int main(){
int N;
int ans[7];
while(cin>>N){
int index=0;
do{
ans[index++]=N%8;
N/=8;
} while (N);
for (int i = index-1; i >=0; i--)
{
cout<<ans[i];
}
cout<<endl;
}
return 0;
}