HDU 1230解題報告

2022-09-13 11:33:13 字數 2135 閱讀 6525

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 個。刪除的順序是將牆按...