程式設計裡,乙個數除以7,不能用除法,乘法以及模運算,應該怎麼做呢?

時間 2021-05-08 17:53:10

1樓:迦侖

我印象小時候速算時,7的倍數有個有趣的規律。

等我今晚推導完或者查查資料再來填坑。

挺簡單的,推完了。

把兩位數以上的數字A=10m+n

if A==7a

then

A -7m=7b=3m+n =B

為了讓數字變小,應有減法

7(a-3b)=A-3B=m-2n

舉個栗子:5677 -> 567-7*2=553 -> 55-3*2=49

那麼模怎麼辦呢?

5678 -> 557-8*2=541 -> 54-1*2=52 ->5-2*2=1

這是巧合嗎?我再想想。

63753->6375-6=6369->636-18=618->61-16=45…3

咦?不對了。

看來缺乙個修補演算法,我再想想

對差餘處理,感覺比較麻煩,我餓了。

於是,我想到了乙個很粗暴的方法。

for(i=0;s!==0;i++)

最後餘數就是i~

放心,i但總之這樣會快多了~

ps,轉了一圈上面的答案,我覺得我的辦法好~爪機編輯這麼拼,不讚很受傷啊喂

2樓:

設被除數A=7778的整數字數為N位,N>2 N=4A的首位數為a=7

計算A-a×7×14×10∧(N-3) =B=918B的整數字為M位,M=3

B的首位數為b=9

計算B-b×7×14×10∧(M-3)=C=36以此類推,直至N小於3,查表得出結果

3樓:Axel Stone

組合語言就有這類情況。做法就是迴圈用減法,記錄迴圈次數,直到被減數做下一次減法時小於0。這時候商和餘數就都出來了。

多說一句,這就是除法的本質。所以為什麼0作為除數得到的是Inf。

4樓:

利用迭代法可求:我說乙個思路給你*被除數為x,除數為y,商為q,餘數為r.

根據商和餘數的關係:x=q*y+r

令餘數r的初值為被除數x,商的初值q為0

不斷從r中減去餘數y,直到無法從r中減去y為止,每減一次q加一r的值不斷減小,q的值不斷增大,當r比被除數y小時即停止運算,q和r即為所求

5樓:Belleve

ifD==

0then

error

(DivisionByZeroException)endQ=

0-- 將商和餘數初始化為 0R=

0fori=

n-1...0do

-- n 是被除數 N 的位數R=

R<<1-- 將餘數左移一位R(

0)=N

(i)-- 將餘數的最低位設定成被除數的當前位ifR>=

DthenR=

R-DQ

(i)=

1end

end這個是長除法的二進位制版本。由於被除數的維數是固定的,因此它可以用電路實現

樓主你滿意了嗎?

6樓:

我本來考慮的是直接用/8去做。。然後那樣是不行的。。

但是如果以可以用乘法的話其實可以有逆元的做法。。

然後嘛。。其實還是/8然後補位。。於是我找到了這個

Bit Twiddling Hacks

我想這是你要的東西了

// The following is for a word size of 32 bits!

static const unsigned int M0x00000000, 0x55555555, 0x33333333, 0xc71c71c7,

0x0f0f0f0f, 0xc1f07c1f, 0x3f03f03f, 0xf01fc07f,

0x00ff00ff, 0x07fc01ff, 0x3ff003ff, 0xffc007ff,

0xff000fff, 0xfc001fff, 0xf0003fff, 0xc0007fff,

0x0000ffff, 0x0001ffff, 0x0003ffff, 0x0007ffff,

0x000fffff, 0x001fffff, 0x003fffff, 0x007fffff,

0x00ffffff, 0x01ffffff, 0x03ffffff, 0x07ffffff,

0x0fffffff, 0x1fffffff, 0x3fffffff, 0x7fffffff

};static const unsigned int Q[60, 0, 0, 0, 0, 0}, , ,

, , ,

, , ,

, , ,

, , ,

, , ,

, , ,

, , ,

, , ,

, , ,

,};static const unsigned int R[60x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},

, ,

, ,

, ,

, ,

,,,,,,,,,,, ,

,,,, ,

,, ,

,,};unsigned int nnumerator

const unsigned int s; // s > 0

const unsigned int d = (1 << s) - 1; // so d is either 1, 3, 7, 15, 31, ...).

unsigned int mn % d goes here.

m = (n & M[s]) + ((n >> s) & M[s]);

for (const unsigned int * q = &Q[s][0], * r = &R[s][0]; m > d; q++, r++)

m = m == d ? 0 : m; // OR, less portably: m = m & -((signed)(m - d) >> s);

7樓:spiritsaway

int dv7(int input)

else

else }

這裡簡單的解釋一下吧,當前限定為非負整數,下面不再贅述。

如果a=8*b+c 其中c小於8 ,則a/7=b+(b+c)/7,這個式子就是整個的遞迴體。根據整數的二進位制表示,我們可以這樣得到b,c b=a>>3, c=a&7。

諸如此類的二進位制位操作技巧在Hacker's Delight 這本書中有非常多,在TAOCP 4A中也有提及相關技巧,本題只是最基礎的一種。

ps Hacker's Delight 已有中文版,叫做演算法心得,有興趣的可以去看一下。

最後,抄一段hacker's delight 裡面的答案。

unsigned divu7(unsigned n)

8樓:Leon

只使用減法就可以了

迴圈減法,每次減7,知道不夠減為止,減得次數就是結果的整數部分,剩下的就是餘數。

任何整數除以7個很有意思的特性,就是小數部分是固定的六種答案,也就是所謂的無限迴圈小數。知道餘數了,就可以通過餘數得知是那種迴圈方式,從而算出小數點後的任意精確位數了。。。

乙個數除以乙個不為零的數,商不是有限小數就是無限迴圈小數嗎

王者渣渣 如果把小數點後每十位看做一組,那麼一共可以出現10的10次方種組合。然後把十個組合看做一大組,可以出現10的10的10的10次方,並且可以繼續往下推 所以,我認為無限不迴圈小數可以存在。題主給出的推理中有乙個問題,那就是餘數不能一出現重複就判斷迴圈,而是要往後推,推很多迴圈節,一直重複才能...

如何快速判斷乙個數可被 7 整除?

雲在青天水在瓶 小學奧數題。假如我們有乙個數字 我瞎打的 把數從後往前三位一段分段 分成746,994,293,198,369,937,391,288,7 然後按序號是奇數或偶數分組 奇陣列 746,293,369,391,7偶數組 994,198,937,288 然後對兩組分別求和 得出奇陣列 1...

乙個數除以越接近0的數,數值越大,那為什麼乙個數除以0等於0?

換想家 1 1為什麼等於2 因為1顆石頭 一顆石頭 2顆 0除以0為什麼出等與0 因為壓根就沒有石頭 為什麼1 0不等於1 因為根據倒數定理1除0等於 我的部隊損失慘重 裝睡的人不是你叫不醒,而是他一直是醒的,還需要你叫嗎?要醒醒的反而是你。by你自己 好吧,是這樣子的 0 0 0 1 0 眾所周知...