表示剛開始了無思路!後來看了下討論,發現了"萬進位"。覺得奇妙,記下吧。
這題也讓我有了點想法。我們經常用的進位就是2進位、8進位、10進位和16進位。何來“萬進位”?世上本無,有人喊了也就有了。呵呵
現在來談談自己對進位的一點不成熟的想法。電腦能“識別”0和1,人能識別0、1、2、3、4、5、6、7、8、9以及其多位組合。那麼,
為啥就單單有2、8、10、16這幾個進位。我想並不止這幾個,10進位是我們日常生活沿用來了的,難道來個5進位就不行?當然不是,不過
一切以方便優先罷了!2進位是因為方便電腦識別才興起的,5000年前應該不會有2進位!8進位和16進位又因何2進位有天然聯絡,所以
也出現了用途,2^3=8、2^4=16(例:這在《數字邏輯》中關於編碼方面有相關應用)。
就題論題。再來談談1042的萬進位。也以一個例子來說明:
107924372*15=1618865580。
①上面的乘法如果運用10進位,很簡單。
②萬進位呢?
首先存數:a[0]=4372,a[1]=792,a[2]=1。107924372,從低位到高位每四位存到一個數組元素中。此時,總位元為3。
接著運算:a[0]*15=65580,所以進位為a[0]/10000=6,a[0]=a[0]%10000=5580。a[1]*15=11880,a[1]=a[1]+6=11886。
進位為1,a[1]=1886。a[2]*15=15,a[2]=a[2]+1=16,進位為0。
輸出:a[2],a[1],a[0]即為1618865580。要注意的是:如果a[2]=886,那麼該如何輸出?直接輸出:168865580。顯然不對,
正確的是16088655880。輸出的原則是:最高位原樣輸出,其它位如果小於1000,則高位補0,一位一補。
好了,不囉嗦了。AC代碼:
/*萬進位*/#include<iostream>#include<iomanip>using namespace std;int main(){void factorial(int n); //階乘函數int n;while(cin>>n)factorial(n);return 0;}void factorial(int n){int a[10001]; int places,carry,i,j;a[0]=1;places=0; //當前數的總位元for(i=1;i<=n;i++){carry=0; //進位for(j=0;j<=places;j++){a[j]=a[j]*i+carry;carry=a[j]/10000;a[j]%=10000;}if(carry>0) //如果一個數的總前一位大於一萬,則向前進位{places++;a[places]=carry;}}/* 輸出 最高位原樣輸出, 其他位小於1000的,高位補0*/cout<<a[places];for(i=places-1;i>=0;i--)cout<<setw(4)<<setfill('0')<<a[i];cout<<endl;}