#3883: 為什麼不過? 請各位幫忙檢查一下


d03ji38 (羊羽x)

學校 : 銘傳大學
編號 : 12245
來源 : [221.224.156.38]
最後登入時間 :
2010-07-29 17:25:19
a013. 羅馬數字 -- NPSC 模擬試題 | From: [111.251.92.144] | 發表日期 : 2010-06-21 21:49

#include<iostream>
#include<string>
#include<cmath>
#include<vector>
using namespace std;
typedef vector<string> vs; //型別定義(一維向量)
typedef vector<vs> vvs; //型別定義(二維向量)
string num_rome(int n){
 switch(n){
 case 1:
  return "I";
 case 4:
  return "IV";
 case 5:
  return "V";
 case 9:
  return "IX";
 case 10:
  return "X";
 case 40:
  return "XL";
 case 50:
  return "L";
 case 90:
  return "XC";
 case 100:
  return "C";
 case 400:
  return "CD";
 case 500:
  return "D";
 case 900:
  return "CM";
 case 1000:
  return "M";
 }
 return 0;
}
int rome_num(char n){
 switch(n){
 case 'I':
  return 1;
 case 'V':
  return 5;
 case 'X':
  return 10;
 case 'L':
  return 50;
 case 'C':
  return 100;
 case 'D':
  return 500;
 case 'M':
  return 1000;
 }
 return 0;
}
ostream& operator<<(ostream& os,vvs vec){
 for(unsigned int i=0;i<vec.size();i++){
  for(unsigned int j=0;j<vec[i].size();j++)
   os<<vec[i][j];
  os<<endl;
 }
 return os;
}
int main(){
 string a,b;
 vs cpy;
 vvs ans; //二維向量
 int save[]={1000,900,500,400,100,90,50,40,10,9,5,4,1};
 while(cin>>a){
  if(a=="#"){
   cout<<ans;
   return 0;
  }
  cin>>b;
  int m=0,n=0;
  for(unsigned int i=0;i<a.length();i++)
   m+=rome_num(a[i]);
  for(unsigned int i=0;i<b.length();i++)
   n+=rome_num(b[i]);
  int num=abs(m-n); //取絕對值
  if(num==0){
   string zero="ZERO";
   cpy.push_back(zero);
   ans.push_back(cpy);
   cpy.erase(cpy.begin(),cpy.end());
  }
  else{
   for(int i=0;i<13;i++){
    if(num-save[i]<0)
     continue;
    cpy.push_back(num_rome(save[i]));
    num-=save[i];
    i--;
   }
   ans.push_back(cpy); //將cpy丟入二維向量ans
   cpy.erase(cpy.begin(),cpy.end()); //清除cpy向量
  }
 }
 return 0;
}

 

我自己執行時都會過

依照題目

我認為他用意是將各筆資料輸入後

再輸入#代表結束

之後再一次輸出答案

原本我的寫法是輸入一筆就輸出一筆

可是不管是甚麼寫法

都出現

與正確輸出不相符(line:7)
您的答案為: MMCCXVII
正確答案為: MCMXCVII

請各位幫忙檢查一下

 
#3899: Re:為什麼不過? 請各位幫忙檢查一下


d03ji38 (羊羽x)

學校 : 銘傳大學
編號 : 12245
來源 : [221.224.156.38]
最後登入時間 :
2010-07-29 17:25:19
a013. 羅馬數字 -- NPSC 模擬試題 | From: [111.251.106.24] | 發表日期 : 2010-06-24 16:39

#include
#include
#include
#include
using namespace std;
typedef vector vs; //型別定義(一維向量)
typedef vector vvs; //型別定義(二維向量)
string num_rome(int n){
 switch(n){
 case 1:
  return "I";
 case 4:
  return "IV";
 case 5:
  return "V";
 case 9:
  return "IX";
 case 10:
  return "X";
 case 40:
  return "XL";
 case 50:
  return "L";
 case 90:
  return "XC";
 case 100:
  return "C";
 case 400:
  return "CD";
 case 500:
  return "D";
 case 900:
  return "CM";
 case 1000:
  return "M";
 }
 return 0;
}
int rome_num(char n){
 switch(n){
 case 'I':
  return 1;
 case 'V':
  return 5;
 case 'X':
  return 10;
 case 'L':
  return 50;
 case 'C':
  return 100;
 case 'D':
  return 500;
 case 'M':
  return 1000;
 }
 return 0;
}
ostream& operator<<(ostream& os,vvs vec){
 for(unsigned int i=0;i  for(unsigned int j=0;j   os<  os< }
 return os;
}
int main(){
 string a,b;
 vs cpy;
 vvs ans; //二維向量
 int save[]={1000,900,500,400,100,90,50,40,10,9,5,4,1};
 while(cin>>a){
  if(a=="#"){
   cout<   return 0;
  }
  cin>>b;
  int m=0,n=0;
  for(unsigned int i=0;i   m+=rome_num(a[i]);
  for(unsigned int i=0;i   n+=rome_num(b[i]);
  int num=abs(m-n); //取絕對值
  if(num==0){
   string zero="ZERO";
   cpy.push_back(zero);
   ans.push_back(cpy);
   cpy.erase(cpy.begin(),cpy.end());
  }
  else{
   for(int i=0;i<13;i++){
    if(num-save[i]<0)
     continue;
    cpy.push_back(num_rome(save[i]));
    num-=save[i];
    i--;
   }
   ans.push_back(cpy); //將cpy丟入二維向量ans
   cpy.erase(cpy.begin(),cpy.end()); //清除cpy向量
  }
 }
 return 0;
}

 

我自己執行時都會過

依照題目

我認為他用意是將各筆資料輸入後

再輸入#代表結束

之後再一次輸出答案

原本我的寫法是輸入一筆就輸出一筆

可是不管是甚麼寫法

都出現

與正確輸出不相符(line:7)
您的答案為: MMCCXVII
正確答案為: MCMXCVII

請各位幫忙檢查一下

#include<cmath>那一行是多餘的

是之前寫別的東西留下的0.0

話說我很想知道我錯的那一行他的輸入是甚麼

不然錯誤真的找不出來..

可以請高手幫忙看看是哪裡邏輯上出錯?

還是有辦法可以知道他的輸入資料?

 
#3901: Re:為什麼不過? 請各位幫忙檢查一下


fire231 (Bloodmors)

學校 : 國立臺北科技大學
編號 : 12254
來源 : [111.82.120.13]
最後登入時間 :
2022-11-24 09:01:26
a013. 羅馬數字 -- NPSC 模擬試題 | From: [114.42.94.201] | 發表日期 : 2010-06-24 19:57

#include
#include
#include
#include
using namespace std;
typedef vector vs; //型別定義(一維向量)
typedef vector vvs; //型別定義(二維向量)
string num_rome(int n){
 switch(n){
 case 1:
  return "I";
 case 4:
  return "IV";
 case 5:
  return "V";
 case 9:
  return "IX";
 case 10:
  return "X";
 case 40:
  return "XL";
 case 50:
  return "L";
 case 90:
  return "XC";
 case 100:
  return "C";
 case 400:
  return "CD";
 case 500:
  return "D";
 case 900:
  return "CM";
 case 1000:
  return "M";
 }
 return 0;
}
int rome_num(char n){
 switch(n){
 case 'I':
  return 1;
 case 'V':
  return 5;
 case 'X':
  return 10;
 case 'L':
  return 50;
 case 'C':
  return 100;
 case 'D':
  return 500;
 case 'M':
  return 1000;
 }
 return 0;
}
ostream& operator<<(ostream& os,vvs vec){
 for(unsigned int i=0;i  for(unsigned int j=0;j   os<  os< }
 return os;
}
int main(){
 string a,b;
 vs cpy;
 vvs ans; //二維向量
 int save[]={1000,900,500,400,100,90,50,40,10,9,5,4,1};
 while(cin>>a){
  if(a=="#"){
   cout<   return 0;
  }
  cin>>b;
  int m=0,n=0;
  for(unsigned int i=0;i   m+=rome_num(a[i]);
  for(unsigned int i=0;i   n+=rome_num(b[i]);
  int num=abs(m-n); //取絕對值
  if(num==0){
   string zero="ZERO";
   cpy.push_back(zero);
   ans.push_back(cpy);
   cpy.erase(cpy.begin(),cpy.end());
  }
  else{
   for(int i=0;i<13;i++){
    if(num-save[i]<0)
     continue;
    cpy.push_back(num_rome(save[i]));
    num-=save[i];
    i--;
   }
   ans.push_back(cpy); //將cpy丟入二維向量ans
   cpy.erase(cpy.begin(),cpy.end()); //清除cpy向量
  }
 }
 return 0;
}

 

我自己執行時都會過

依照題目

我認為他用意是將各筆資料輸入後

再輸入#代表結束

之後再一次輸出答案

原本我的寫法是輸入一筆就輸出一筆

可是不管是甚麼寫法

都出現

與正確輸出不相符(line:7)
您的答案為: MMCCXVII
正確答案為: MCMXCVII

請各位幫忙檢查一下

#include那一行是多餘的

是之前寫別的東西留下的0.0

話說我很想知道我錯的那一行他的輸入是甚麼

不然錯誤真的找不出來..

可以請高手幫忙看看是哪裡邏輯上出錯?

還是有辦法可以知道他的輸入資料?

 

看你輸出的結果

 是不是沒考慮到相加相減的問題?

 

MMCCXVII跟MCMXCVII

都錯在CM  CX這種大小互換的位置

 
#3903: Re:為什麼不過? 請各位幫忙檢查一下


d03ji38 (羊羽x)

學校 : 銘傳大學
編號 : 12245
來源 : [221.224.156.38]
最後登入時間 :
2010-07-29 17:25:19
a013. 羅馬數字 -- NPSC 模擬試題 | From: [111.251.106.24] | 發表日期 : 2010-06-24 22:01

 看你輸出的結果

 是不是沒考慮到相加相減的問題?

 

MMCCXVII跟MCMXCVII

都錯在CM  CX這種大小互換的位置


CM我有考慮到

可是CX應該沒有這種特殊組合吧?

正確答案MCMXCVII的數值是1997

以我程式判斷應該會是

(由1000.900.500.400.100.90.50.40.10.9.5.4.1依序判斷)

1997-1000=997 -> M

997-900=97 -> CM

97-90=7 -> XC

7-5=2 -> V

2-1=1 -> I

1-1=0 -> I

我實在想不通為什麼丟上來會被判斷成MMCCXVII

MMCCXVII的數值是2217

完全不同阿= =

 

有一種可能性我有想到

可是想到的下一瞬間我就認為不太可能

我存取答案後

在程式讀到#號時將答案印出

然後return 0;

如果說程式沒有經過return 0;就直接執行下一組代碼就會出錯

可是既然程式是通過合法編譯器編譯

怎麼可能會略過return 0;= =?

所以這種可能性我就否決了

實在請各位大大幫我找找錯誤~"~

我真的是束手無策了...

 
#3919: Re:為什麼不過? 請各位幫忙檢查一下


davidhsu (David)

學校 : 不指定學校
編號 : 12295
來源 : [36.237.202.120]
最後登入時間 :
2020-12-23 11:36:28
a013. 羅馬數字 -- NPSC 模擬試題 | From: [218.173.193.129] | 發表日期 : 2010-06-29 14:09

請用 IV I 測試你的資料結果是

6 -1 =5

還是

4 - 1

---------

XC - I

110 -1  ?? 

90 - 1

 
#3920: Re:為什麼不過? 請各位幫忙檢查一下


davidhsu (David)

學校 : 不指定學校
編號 : 12295
來源 : [36.237.202.120]
最後登入時間 :
2020-12-23 11:36:28
a013. 羅馬數字 -- NPSC 模擬試題 | From: [163.24.167.35] | 發表日期 : 2010-06-29 14:22

您的答案為: MMCCXVII
正確答案為: MCMXCVII
MMCCXVII - MCMXCVII =200
請測試 MCMXCVII - I
是 1997 - 1
還是 2197 - 1
 
#3925: Re:為什麼不過? 請各位幫忙檢查一下


d03ji38 (羊羽x)

學校 : 銘傳大學
編號 : 12245
來源 : [221.224.156.38]
最後登入時間 :
2010-07-29 17:25:19
a013. 羅馬數字 -- NPSC 模擬試題 | From: [220.135.212.57] | 發表日期 : 2010-06-30 22:06

請用 IV I 測試你的資料結果是

6 -1 =5

還是

4 - 1

---------

XC - I

110 -1  ?? 

90 - 1

原來如此

我沒想到這點的說

謝謝大大提醒!!

 
#3926: Re:為什麼不過? 請各位幫忙檢查一下


d03ji38 (羊羽x)

學校 : 銘傳大學
編號 : 12245
來源 : [221.224.156.38]
最後登入時間 :
2010-07-29 17:25:19
a013. 羅馬數字 -- NPSC 模擬試題 | From: [220.135.212.57] | 發表日期 : 2010-06-30 22:06

請用 IV I 測試你的資料結果是

6 -1 =5

還是

4 - 1

---------

XC - I

110 -1  ?? 

90 - 1

原來如此

我沒想到這點的說

謝謝大大提醒!!

 
ZeroJudge Forum