problem description
讀入兩個不超過25位的火星正整數a和b,計算a+b。需要注意的是:在火星上,整數不是單一進製的,第n位的進製就是第n個素數。例如:地球上的10進製數2,在火星上記為「1,0」,因為火星個位數是2進製的;地球上的10進製數38,在火星上記為「1,1,1,0」,因為火星個位數是2進製的,十位數是3進製的,百位數是5進製的,千位數是7進製的……
input
測試輸入包含若干測試用例,每個測試用例佔一行,包含兩個火星正整數a和b,火星整數的相鄰兩位數用逗號分隔,a和b之間有乙個空格間隔。當a或b為0時輸入結束,相應的結果不要輸出。
output
對每個測試用例輸出1行,即火星表示法的a+b的值。
sample input
1,0 2,1
4,2,0 1,2,0
1 10,6,4,2,1
0 0sample output
1,0,1
1,1,1,0
1,0,0,0,0,0
此題不是一道難題,但是所涉及知識點較多:
字串處理
質數大數加法
在求質數方面,此題涉及到不超過30位,故可以使用打表,直接定義陣列,在此不贅述。
加法方面,必定涉及到進製問題,因此需要從低位到高位進行加法運算,因此第一步需要進行字串反轉。
加法方面需要一位一位取出a,b中對應的數值,則設立ai,bi分別對a,b進行迴圈。此時需要考慮到a,b位數不對等的狀況,因此在迴圈中必須有防止溢位的措施,當a[ai]=』\0』時,則終止ai 繼續增加。而在取出每一位火星數中,一位火星數可能包含多個十進位制位數,此時則需要乙個迴圈,並設立aj,bj記錄十進位制位數,取出的結果放入atemp,btemp用於記錄。
在進行加法時還需要考慮進製問題,設定sign用於記錄進製。
**如下
#include
#include
void pirmes(int pri);
int turnover(char
str);
intsum(char a,int la,char b,int lb);
int main()
}void pirmes(int pri)
}if(sign)
pri[n++]=i;
}return;
}int turnover(char
str)
n=i-1;
for(i=n,j=0;i>=0;i--)
//printf("\n");
return n;
}int
sum(char a,int la,char b,int lb)
//printf("a[%d]=%c,",ai,a[ai]);
atemp+=(a[ai]-48)*(int)pow((double)10,(double)aj++); //記錄一位火星數
// printf("atemp=%d,",atemp);
ai++;
// printf("ai=%d\n",ai);
}ai++;
}if(b[bi]=='\0')
btemp=0;
else
btemp+=(b[bi]-48)*(int)pow((double)10,(double)bj++);
bi++;
}bi++;
}// printf("atemp=%d btemp=%d sign=%d pri[%d]=%d\n",atemp,btemp,sign,ni,pri[ni]);
nsum[ni]=(atemp+btemp+sign)%pri[ni]; //一位火星數求和
sign=(atemp+btemp+sign)/pri[ni]; //進製
// printf("%d\n",nsum[ni]);
ni++;
}while(--ni>=0)
return
0;}
hdu 1230(火星A B,進製)
個人感覺如果進製轉換的話太麻煩,直接模擬加法,不同位數採用不同的進製加法。但是還是wa了兩次,沒有處理好餘數的問題,當不能進製時。2013 04 23 cpp include stdio.h include string.h include math.h int prime 25 cnt void ...
HDU 1230飯前開胃菜
題意不講了。沒思路,上去就是幹。兩個所謂要加的數直接存到陣列,開乙個標記的陣列,然後直接加,亂搞一波,就好了。細心一點。include include include include include include include using namespace std typedef long l...
POJ 1230 解題報告
這道題感覺就是greedy的題。但是還是看了解題報告。知道做法後實現很簡單,只需要注意測試資料中有左端點的x座標大於右端點的x座標的情況,調換下即可。貪心的策略是按照x從左往右掃瞄,如果某一列 某乙個x值 對應 被覆蓋 的牆的個數cnt大於k,那麼需要從這些牆中刪掉cnt k 個。刪除的順序是將牆按...