當前位置:首頁 » 操作系統 » 模演算法

模演算法

發布時間: 2022-01-29 23:54:43

❶ 模運算符%的定義

2.6 運算符
C語言的內部運算符很豐富,運算符是告訴編譯程序執行特定算術或邏輯操作的符號。C語言有三大運算符:算術、關系與邏輯、位操作。另外, C還有一些特殊的運算符,用於完成一些特殊的任務。

2.6.1 算術運算符
表2 - 5列出了C語言中允許的算術運算符。在C語言中,運算符「 +」、「-」、「*」和「 /」的用法與大多數計算機語言的相同,幾乎可用於所有C語言內定義的數據類型。當「 /」被用於整數或字元時,結果取整。例如,在整數除法中, 1 0 / 3 = 3。
一元減法的實際效果等於用- 1乘單個操作數,即任何數值前放置減號將改變其符號。模運算符「%」在C語言中也同它在其它語言中的用法相同。切記,模運算取整數除法的余數,所以「%」不能用於float和double類型。

表2-5 算術運算符
運算符 作用 運算符 作用
- 減法,也是一元減法 % 模運算
+ 加法 -- 自減(減1)
* 乘法 ++ 自增(增1)
/ 除法

下面是說明%用法的程序段。
int x,y;
x = 10;
y = 3;
printf("%d",x/y); /* 顯示3 */
printf("%d",x%y) ; /* 顯示1 ,整數除法的余數* /
x = 1 ;
y = 2 ;
printf("%d,%d",x/y,x%y) ; /* 顯示0,1 */
最後一行列印一個0和一個1,因為1 / 2整除時為0,余數為1,故1 % 2取余數1。

2.6.2 自增和自減
C語言中有兩個很有用的運算符,通常在其它計算機語言中是找不到它們的—自增和自減運算符, + +和- -。運算符「 + +」是操作數加1,而「- -」是操作數減1,換句話說:x = x + 1 ; 同+ + x ; x = x - 1 ; 同- - x ;
自增和自減運算符可用在操作數之前,也可放在其後,例如: x = x + 1;可寫成+ + x;或x + +;但在表達式中這兩種用法是有區別的。自增或自減運算符在操作數之前, C語言在引用操作數之前就先執行加1或減1操作;運算符在操作數之後, C語言就先引用操作數的值,而後再進行加1或減1操作。請看下例:
x = 1 0;
y = ++x;
此時,y = 11。如果程序改為:
x = 10 ;
y = x++ ;
則y = 10。在這兩種情況下, x都被置為11,但區別在於設置的時刻,這種對自增和自減發生時刻的控制是非常有用的。
在大多數C編譯程序中,為自增和自減操作生成的程序代碼比等價的賦值語句生成的代碼要快得多,所以盡可能採用加1或減1運算符是一種好的選擇。
下面是算術運算符的優先順序:
最高 ++、--
-(一元減)
*、/、%
最低 +、-
編譯程序對同級運算符按從左到右的順序進行計算。當然,括弧可改變計算順序。C語言處理括弧的方法與幾乎所有的計算機語言相同:強迫某個運算或某組運算的優先順序升高。

2.6.3 關系和邏輯運算符
關系運算符中的「關系」二字指的是一個值與另一個值之間的關系,邏輯運算符中的「邏輯」二字指的是連接關系的方式。因為關系和邏輯運算符常在一起使用,所以將它們放在一起討論。
關系和邏輯運算符概念中的關鍵是True(真)和Flase(假)。C語言中,非0為True,0為Flase。使用關系或邏輯運算符的表達式對Flase和Ture分別返回值0或1 (見表2 - 6 )。

表2-6 關系和邏輯運算符
關系運算符 含義 關系運算符 含義
> 大於 <= 小於或等於
>= 大於等於 == 等於
< 小於 != 不等於

邏輯運算符 含義
&& 與
|| 或
! 非

表2 - 6給出於關系和邏輯運算符,下面用1和0給出邏輯真值表。
關系和邏輯運算符的優先順序比算術運算符低,即像表達式10>1+12的計算可以假定是對表
達式10>( 1 + 12)的計算,當然,該表達式的結果為Flase。
在一個表達式中允許運算的組合。例如:
10>5&&!(10<9)||3<=4
p q p&&q p||q !p
0 0 0 0 1
0 1 0 1 1
1 0 0 1 0
1 1 1 1 0

這一表達式的結果為True。
下表給出了關系和邏輯運算符的相對優先順序:
最高 !
>= <=
== !=
&&
最低 ||
同算術表達式一樣,在關系或邏輯表達式中也使用括弧來修改原計算順序。
切記,所有關系和邏輯表達式產生的結果不是0就是1,所以下面的程序段不僅正確而且將在屏幕上列印數值1。
int x;
x = 100;
printf("%d",x>10);

2.6.4 位操作符
與其它語言不同,C語言支持全部的位操作符( Bitwise Operators)。因為C語言的設計目的是取代匯編語言,所以它必須支持匯編語言所具有的運算能力。位操作是對位元組或字中的位(bit)進行測試、置位或移位處理,這里位元組或字是針對C標准中的char和int數據類型而言的。位操作不能用於float、double、long double、void或其它復雜類型。表

2 - 7給出了位操作
的操作符。位操作中的AND、OR和NOT(1的補碼)的真值表與邏輯運算等價,唯一不同的是位操作是逐位進行運算的。

表2-7 位操作符
操作符 含義 操作符 含義
& 與(AND) ~ 1的補(NOT)
| 或(OR) >> 右移
^ 異或(XOR) << 左移

下面是異或的真值表。
表2-8 異或的真值表
p q p^q
0 0 0
1 0 1
1 1 0
0 1 1

如表2 - 8所示,當且僅當一個操作數為True時,異或的輸出為True,否則為Flase。
位操作通常用於設備驅動程序,例如數據機程序、磁碟文件管理程序和列印機驅動程序。這是因為位操作可屏蔽掉某些位,如奇偶校驗位(奇偶校驗位用於確保位元組中的其它位不會發生錯誤通常奇偶校驗位是位元組的最高位)。
通常我們可把位操作A N D作為關閉位的手段,這就是說兩個操作數中任一為0的位,其結果中對應位置為0。例如,下面的函數通過調用函數read_modem( ),從數據機埠讀入一個字元,並將奇偶校驗位置成0。

[例2 - 4 ]
Char get_char_from_modem()
{
char ch;
ch=read_modem(); /*從數據機埠中得到一個字元* /
return(ch&127);
}
位元組的位8是奇偶位,將該位元組與一個位1到位7為1、位8為0的位元組進行與操作,可將該位元組的奇偶校驗位置成0。表達式ch&127正是將ch中每一位同127數字的對應位進行與操作,結果ch的位8被置成了0。在下面的例子中,假定c h接收到字元"A"並且奇偶位已經被置位。
奇偶位

110000001 內容為『A』的c h,其中奇偶校驗位為1
011111111 二進制的127執行與操作
& 與操作
-----------
=010000001 去掉奇偶校驗的『A』

位操作OR與AND操作相反,可用來置位。任一操作數中為1的位將結果的對應位置1。如下所示,128|3的情況是:
1000000 128的二進制
0000011 3的二進制
| 或操作
----------
=1000011 結果

異或操作通常縮寫為XOR,當且僅當做比較的兩位不同時,才將結果的對應位置位。如下所示,異或操作127 ^ 12 0的情況是:
01111111 127 的二進制
01111000 120 的二進制
^ 異或操作
---------
=00000111 結果
一般來說,位的AND、OR和XOR操作通過對操作數運算,直接對結果變數的每一位分別處理。正是因為這一原因(還有其它一些原因),位操作通常不像關系和邏輯運算符那樣用在條件語句中,我們可以用例子說明這一點:假定X = 7,那麼x && 8為Ture( 1 ) ,而x & 8卻為Flase( 0 )。
記住,關系和邏輯操作符結果不是0就是1。而相似的位操作通過相應處理,結果可為任意值。換言之,位操作可以有0或1以外的其它值,而邏輯運算符的計算結果總是0或1。
移位操作符>>和<<將變數的各位按要求向或向左移動。右移語句通常形式是:
variable >>右移位數
左移語句是:
variable << 左移位數
當某位從一端移出時,另一端移入0(某些計算機是送1,詳細內容請查閱相應C編譯程序用戶手冊)。切記:移位不同於循環,從一端移出的位並不送回到另一端去,移去的位永遠丟失了,同時在另一端補0。
移位操作可對外部設備(如D/A轉換器)的輸入和狀態信息進行解碼,移位操作還可用於整數的快速乘除運算。如表2 - 9所示(假定移位時補0),左移一位等效於乘2,而右移一位等效於除以2。

表2-9 用移位操作進行乘和除
字元x 每個語句執行後的x x的值
x=7 00000111 7
x<<1 00001110 14
x<<3 01110000 112
x<<2 11000000 192
x>>1 01100000 96
x>>2 00011000 24

每左移一位乘2,注意x < < 2後,原x的信息已經丟失了,因為一位已經從一端出,每右移一位相當於被2除,注意,乘後再除時,除操作並不帶回乘法時已經丟掉的高位。
反碼操作符為~。~的作用是將特定變數的各位狀態取反,即將所有的1位置成0,所有的0位置成1。
位操作符經常用在加密程序中,例如,若想生成一個不可讀磁碟文件時,可以在文件上做一些位操作。最簡單的方法是用下述方法,通過1的反碼運算,將每個位元組的每一位取反。
原位元組 00101100
第一次取反碼 11010011
第二次取反碼 00101100
注意,對同一行進行連續的兩次求反,總是得到原來的數字,所以第一次求反表示了位元組的編碼,第二次求反進行解碼又得到了原來的值。
可以用下面的函數encode( )對字元進行編碼。

[例2 - 5 ]
char encode(ch)
char ch;
{
return (~ch);
}

2.6.5 ?操作符
C語言提供了一個可以代替某些if - then - else語句的簡便易用的操作符?。該操作符是三元的,其一般形式為:
EXP1? EXE2: EXP3
EXP1,EXP2和EXP3是表達式,注意冒號的用法和位置。
操作符「?」作用是這樣的,在計算EXP1之後,如果數值為True,則計算EXP2,並將結果作為整個表達式的數值;如果E XP1的值為Flase,則計算EXP3,並以它的結果作為整個表達式的值,請看下例:
x = 10;
y = x> 9? 100: 200;
例中,賦給y的數值是100,如果x被賦給比9小的值,y的值將為200,若用if - else語句改寫,有下面的等價程序:
x = 10;
if(x>9) y=100;
else y=200;
有關C語言中的其它條件語句將在第3章進行討論。

2.6.6 逗號操作符
作為一個操作符,逗號把幾個表達式串在一起。逗號操作符的左側總是作為void(無值),這意味著其右邊表達式的值變為以逗號分開的整個表達式的值。例如:
x = ( y = 3 , y + 1 ) ;
這行將3賦給y,然後將4賦給x,因為逗號操作符的優先順序比賦值操作符優先順序低,所以必須使用括弧。
實際上,逗號表示操作順序。當它在賦值語句右邊使用時,所賦的值是逗號分隔開的表中最後那個表達式的值。例如,
y = 10;
x = (y = y - 5 , 2 5 / y ) ;
執行後,x的值是5,因為y的起始值是1 0,減去5之後結果再除以2 5,得到最終結果。
在某種意義上可以認為,逗號操作符和標准英語的and是同義詞。

2.6.7 關於優先順序的小結
表2 - 1 0列出了C語言所有操作符的優先順序,其中包括將在本書後面討論的某些操作符。注意,所有操作符(除一元操作符和?之外)都是左結合的。一元操作符( *,&和-)及操作符「?」則為右結合。
表2-10 C語言操作符的優先順序
最高級 ()[] →
!~ ++ -- -(type) * & sizeof
* / %
+ -
<< >>
<= >=
== !=
& ^ |
&&
||
?
= += -= *= /=
最低級,
2.7 表達式
表達式由運算符、常量及變數構成。C語言的表達式基本遵循一般代數規則,有幾點卻是與C語言緊密相關的,以下將分別加以討論。

2.7.1 表達式中的類型轉換
混合於同一表達式中的不同類型常量及變數,應均變換為同一類型的量。C語言的編譯程序將所有操作數變換為與最大類型操作數同類型。變換以一次一操作的方式進行。具體規則如下:

1 ) 所有char及short int 型量轉為int型,所有float轉換為double。
2) 如操作數對中一個為long double ,另一個轉換為long double。① 要不然,一個為double,另一個轉為doub le。② 要不然,一個為long,另一個轉為long。③ 要不然,一個為unsigned,另一個轉為unsigned。
一旦運用以上規則。每一對操作數均變為同類型。注意,規則2 )有幾種必須依次應用的條件。
圖2 - 1示出了類型轉換。首先, char ch轉換成int,且floatf 轉換成double;然後ch /i的結果轉換成doubl e,因為f * d是double;最後由於這次兩個操作數都是double,所以結果也是double。.

2.7.2 構成符cast
可以通過稱為cast的構成符強迫一表達式變為特定類型。其一般形式為:
(type)expression
( type)是標准C語言中的一個數據類型。例如,為確保表達式x / 2的結果具有類型float,可寫為:
(float)x / 2
通常認為cast是操作符。作為操作符, cast是一元的,並且同其它一元操作符優先順序相同。
雖然cast在程序中用得不多,但有時它的使用的確很有價值。例如,假設希望用一整數控制循環,但在執行計算時又要有小數部分。

[例2 - 6 ]
main()
{
int i;
for(i+1;i<=100;++i)
printf("%d/2 is :%f",i,(float)i/2);
}
若沒有cast( float),就僅執行一次整數除;有了cast就可保證在屏幕上顯示答案的小數部分。

2.7.3 空格與括弧
為了增加可讀性,可以隨意在表達式中插入tab和空格符。例如,下面兩個表達式是相同的。
x = 10 / y *( 127 / x );
x = 10 / y *( 127 / x );
冗餘的括弧並不導致錯誤或減慢表達式的執行速度。我們鼓勵使用括弧,它可使執行順序更清楚一些。例如,下面兩個表達式中哪個更易讀一些呢?
x = y / 2 - 34 * temp & 127;
x = ( y / 2 ) - ( ( 34 * temp) & 127);

2.7.4 C語言中的簡寫形式
C語言提供了某些賦值語句的簡寫形式。例如語句:
x = x + 10;
在C語言中簡寫形式是:
x + = 10;
這組操作符對+ =通知編譯程序將X + 1 0的值賦予X。這一簡寫形式適於C語言的所有二元操作符(需兩個操作數的操作符)。在C語言中,variable=variable1 operator expression;與variable1 operator=expression相同。

請看另一個例子:
x = x - 1 0 0 ;
其等價語句是
x - = 100;
簡寫形式廣泛應用於專業C語言程序中,希望讀者能熟悉它。
參考資料:http://www.code365.com/programe/c/jcjc/200512152154037317.htm

❷ C語言當中的模運算

模就是除以除數然後取余啊,比如3%5那就是3除以5然後去余數,那就是商是0餘3 啊,結果就是3~~~~~

java,取模運算(%);

例如:
n是隨機數,那麼n%10就是0~9中的一個數。無論n是多大的數,n%10隻能是0~9之間的一個數,其中10就是操作數。

❹ c++的取模運算

取模運算就是求余運算

3 % 19 就表示 3除以19的余數
3%19=3

19%3=1
表示:19/3=6...1
也就是19除以3 等於6餘1
%運算只需要余數,也就是1

❺ 什麼是模運算要怎麼取模

「模」是「Mod」的音譯,模運算多應用於程序編寫中。 Mod的含義為求余。模運算在數論和程序設計中都有著廣泛的應用,從奇偶數的判別到素數的判別,從模冪運算到最大公約數的求法,從孫子問題到凱撒密碼問題,無不充斥著模運算的身影。雖然很多數論教材上對模運算都有一定的介紹,但多數都是以純理論為主,對於模運算在程序設計中的應用涉及不多。

❻ 取模是怎麼運算的希望可以講通俗一點

對於整型數a,b來說,取模運算或者求余運算的方法都是:

1、求整數商: c = [a/b];

2、計算模或者余數: r = a - c×b。

求模運算和求余運算在第一步不同,取余運算在取c的值時,向0 方向舍入(fix()函數);而取模運算在計算c的值時,向負無窮方向舍入(floor()函數)。

(6)模演算法擴展閱讀:

取模運算重要定理:

1、若a≡b (% p),則對於任意的c,都有(a + c) ≡ (b + c) (%p)。

2、若a≡b (% p),則對於任意的c,都有(a * c) ≡ (b * c) (%p)。

3、若a≡b (% p),c≡d (% p),則 (a + c) ≡ (b + d) (%p),(a - c) ≡ (b - d) (%p),(a * c) ≡ (b * d) (%p)。

❼ 大數快速求模演算法

樓上的全不明白樓主的意思,樓主要的是演算法,不是程序你們懂嗎!!!
我只能說你們不懂什麼叫真正的演算法,你們只是計算機的傀儡,我看了你們回答非常生氣,高校教出來的就是這種「人才」,連演算法都不懂。還不如我一高中生。嚴重BS樓上的,尤其是說java語言的那位。

我來告訴你
這個問題用遞推解決
首先要你承認一個公式,我是習慣pascal語言的,c++怕寫錯,反正只是演算法,你忍一下。

不知道你要的演算法是大整數對long取余還是大整數對大整數取余。

先說對long取余,這個簡單
先承認兩個公式:ab mod c=((a mod c)(b mod c)) mod c
(a+b) mod c=(a mod c+b mod c) mod c

然後遞推,先算1 mod c,然後10 mod c ,100 mod c。。。用數組存一下,遞推方法是10^n mod c=((10^(n-1) mod c)*10) mod c

再加,讓k=0,
for a:=1 to l do
k:=(k+num[a]*exp10[a]) mod c

這樣最後k就是結果。

補充:我不知道你說哪裡耗時間,這個演算法是位數的一次函數。

再說大整數對大整數取余,這個需要模仿你平常做的除法來做高精度除法,說明白了就是模擬除法,這個沒什麼好說的,只要你編程能力足夠就寫得出來,你可以上網上搜一下,我這就不寫了,因為我也不能保證一次寫對,因為寫一個高精度除法需要高精度加法和乘法,代碼稍微有點繁。

不bs樓上的了,我錯了。lrj當然認識,見過他很多回了。我不是你說的那種被動接受的人,我們學校沒有人懂,全部都是自學的,看到了你說用java解決很生氣而己,樓主的意思是演算法。
至於oier,我們都很崇拜lrj,市面上基本沒有什麼適合初學者的書,資來源是網路。
像很多高校,教出來的學計算機系的「程序員」根本不懂演算法,導致很多程序效率低下,比如我曾看到一個ip地址資料庫這位「牛」用o(n)的演算法掃描找對應的ip地址,然後改成其它方法了居然還很高興地說現在10幾次就可以確定了。再比如我們的「老師」,從學校計算機系畢業,來了什麼也不懂,最垃圾的模擬都不會,背包都不知道是啥,所以我內心裡對一些人排斥。對不起。
但是有一點我不認同,不是大多數的oier都像你說的那樣。
還有,就是我很不喜歡你的明白樓主是什麼意思卻不去回答而用java塘塞過去。
那不是狂妄,那是失望。這種問題竟然要等到我一個高中生來回答,而上面竟然又有人用java搪塞,我對現在演算法普及程序感到非常的失望,很傷心。

一樓我不明白的就是你怎麼估計?相當於你說你去買份飯沒說怎麼做,相當模糊,樓主要的是具體的演算法。

❽ 模運算是怎麼樣的模3運算是什麼意思

計算機中的模運算是求余數,
模3運算是求某個數除以3的余數,
比如8 mod 3=2

❾ 數學中的"求模運算"是如何計算的

求模就是求余數,比如mod(8,3)=2,mod(9,3)=0

❿ 數字信號處理中的模N運算是什麼意思啊 求解

我不懂數字信號,
但是我知道模N運算,
就是把一切數先進行模運算。拿10來說:14就是模4,19就是模9,也就是把它們減去10的倍數後的最簡數,所謂模N運算,就是在這個模中進行加減乘除運算(乘除需要特定的模可以運算)

熱點內容
解壓到當前文件夾右鍵 發布:2024-04-26 03:57:08 瀏覽:979
html5android教程視頻下載 發布:2024-04-26 03:09:59 瀏覽:867
伺服器的描述是什麼 發布:2024-04-26 03:08:32 瀏覽:394
個人加密 發布:2024-04-26 03:01:23 瀏覽:521
linuxusbgadget 發布:2024-04-26 02:52:54 瀏覽:304
我的世界空島世界伺服器地址 發布:2024-04-26 01:39:08 瀏覽:248
尼爾機械紀元加密 發布:2024-04-26 01:37:11 瀏覽:868
在控制台輸出sql語句 發布:2024-04-26 01:08:12 瀏覽:432
動畫java 發布:2024-04-26 01:02:40 瀏覽:12
得力文件夾5302 發布:2024-04-26 00:21:32 瀏覽:91