天天看點

codeup 3.5 進制轉換

問題 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;
}