除余定理c語言,帶余除法c語言編程

本文目錄一覽:

C語言怎麼求餘數

1、首先,我們需要打開任意編程軟件,小編使用的是Dev c++

2、然後,我們需要新建一個源代碼, 如下圖所示

3、然後我們需要輸入代碼

#include stdio.h

int main()

{

int i=0;

scanf(“%d”,i);

int j;

j=i%2;

printf(“%d”,j);

return 0;

}

表示取輸入的數除以二的 餘數 。

4、最後,我們編譯測試,我們輸入9,得到的結果為1,正確。

拓展資料:

C語言里對於有一些符號是不能直接輸出的,因為被C語言佔用了。所以有一些符號是需要特殊的方式才能輸出的。比如你說的%號,%號在C語言里是求餘數的符號,如果需要輸出%的話,你需要連續寫2個%才能輸出。如:printf(“x%%y=%f\n”,e);

C語言取余的原理是怎麼回事?比如31%21=10 這個值是什麼得到的?

a=b×c﹢d.用a÷b=c余d。這裡c是商,d為餘數。取余就是對某個除數b求餘數d的運算。所以上面結果為10.

C語言取余的原理是怎麼回事? 比如 int X,Y X-X/Y*Y=x%y

取余實際上就是模運算

基本理論

基本概念:

給定一個正整數p,任意一個整數n,一定存在等式 n = kp + r ;

其中k、r是整數,且 0 ≤ r p,稱呼k為n除以p的商,r為n除以p的餘數。

對於正整數p和整數a,b,定義如下運算:

取模運算:a % p(或a mod p),表示a除以p的餘數。

模p加法:(a + b) % p ,其結果是a+b算術和除以p的餘數,也就是說,(a+b) = kp +r,則(a + b) % p = r。

模p減法:(a-b) % p ,其結果是a-b算術差除以p的餘數。

模p乘法:(a * b) % p,其結果是 a * b算術乘法除以p的餘數。

說明:

1. 同餘式:正整數a,b對p取模,它們的餘數相同,記做 a ≡ b % p或者a ≡ b (mod p)。

2. n % p得到結果的正負由被除數n決定,與p無關。例如:7%4 = 3, -7%4 = -3, 7%-4 = 3, -7%-4 = -3。

!–[if !supportLineBreakNewLine]–

!–[endif]–

基本性質

(1)若p|(a-b),則a≡b (% p)。例如 11 ≡ 4 (% 7), 18 ≡ 4(% 7)

(2)(a % p)=(b % p)意味a≡b (% p)

(3)對稱性:a≡b (% p)等價於b≡a (% p)

(4)傳遞性:若a≡b (% p)且b≡c (% p) ,則a≡c (% p)

運算規則

模運算與基本四則運算有些相似,但是除法例外。其規則如下:

(a + b) % p = (a % p + b % p) % p (1)

(a – b) % p = (a % p – b % p) % p (2)

(a * b) % p = (a % p * b % p) % p (3)

ab % p = ((a % p)b) % p (4)

結合率: ((a+b) % p + c) % p = (a + (b+c) % p) % p (5)

((a*b) % p * c)% p = (a * (b*c) % p) % p (6)

交換率: (a + b) % p = (b+a) % p (7)

(a * b) % p = (b * a) % p (8)

分配率: ((a +b)% p * c) % p = ((a * c) % p + (b * c) % p) % p (9)

重要定理:若a≡b (% p),則對於任意的c,都有(a + c) ≡ (b + c) (%p);(10)

若a≡b (% p),則對於任意的c,都有(a * c) ≡ (b * c) (%p);(11)

若a≡b (% p),c≡d (% p),則 (a + c) ≡ (b + d) (%p),(a – c) ≡ (b – d) (%p),

(a * c) ≡ (b * d) (%p),(a / c) ≡ (b / d) (%p); (12)

若a≡b (% p),則對於任意的c,都有ac≡ bc (%p); (13)

編輯本段

基本應用

1.判別奇偶數

奇偶數的判別是模運算最基本的應用,也非常簡單。易知一個整數n對2取模,如果餘數為0,則表示n為偶數,否則n為奇數。

C++實現功能函數:

/*

函數名:IsEven

函數功能:判別整數n的奇偶性。能被2整除為偶數,否則為奇數

輸入值:int n,整數n

返回值:bool,若整數n是偶數,返回true,否則返回false

*/

bool IsEven(int n)

{

return (n % 2 == 0);

}

2.判別素數

一個數,如果只有1和它本身兩個因數,這樣的數叫做質數(或素數)。例如 2,3,5,7 是質數,而 4,6,8,9 則不是,後者稱為合成數或合數。

判斷某個自然數是否是素數最常用的方法就是試除法:用比該自然數的平方根小的正整數去除這個自然數,若該自然數能被整除,則說明其非素數。

C++實現功能函數:

/*

函數名:IsPrime

函數功能:判別自然數n是否為素數。

輸入值:int n,自然數n

返回值:bool,若自然數n是素數,返回true,否則返回false

*/

bool IsPrime(unsigned int n)

{

unsigned maxFactor = sqrt(n); //n的最大因子

for (unsigned int i=2; i=maxFactor; i++)

{

if (n % i == 0) //n能被i整除,則說明n非素數

{

return false;

}

}

return true;

}

3. 最大公約數

求最大公約數最常見的方法是歐幾里德算法(又稱輾轉相除法),其計算原理依賴於定理:gcd(a,b) = gcd(b,a mod b)

證明:a可以表示成a = kb + r,則r = a mod b

假設d是a,b的一個公約數,則有d|a, d|b,而r = a – kb,因此d|r

因此d是(b,a mod b)的公約數

假設d 是(b,a mod b)的公約數,則d | b , d |r ,但是a = kb +r

因此d也是(a,b)的公約數

因此(a,b)和(b,a mod b)的公約數是一樣的,其最大公約數也必然相等,得證。

C++實現功能函數:

/*

函數功能:利用歐幾里德算法,採用遞歸方式,求兩個自然數的最大公約數

函數名:Gcd

輸入值:unsigned int a,自然數a

unsigned int b,自然數b

返回值:unsigned int,兩個自然數的最大公約數

*/

unsigned int Gcd(unsigned int a, unsigned int b)

{

if (b == 0)

return a;

return Gcd(b, a % b);

}

/*

函數功能:利用歐幾里德算法,採用迭代方式,求兩個自然數的最大公約數 函數名:Gcd

輸入值:unsigned int a,自然數a

unsigned int b,自然數b

返回值:unsigned int,兩個自然數的最大公約數

*/

unsigned int Gcd(unsigned int a, unsigned int b)

{

unsigned int temp;

while (b != 0)

{

temp = a % b;

a = b;

b = temp;

}

return a;

}

4.模冪運算

利用模運算的運算規則,我們可以使某些計算得到簡化。例如,我們想知道3333^5555的末位是什麼。很明顯不可能直接把3333^5555的結果計算出來,那樣太大了。但我們想要確定的是3333^5555(%10),所以問題就簡化了。

根據運算規則(4)ab % p = ((a % p)b) % p ,我們知道3333^5555(%10)= 3^5555(%10)。由於3^4 = 81,所以3^4(%10)= 1。

根據運算規則(3) (a * b) % p = (a % p * b % p) % p ,由於5555 = 4 * 1388 + 3,我們得到3^5555(%10)=(3^(4*1388) * 3^3)(%10)=((3^(4*1388)(%10)* 3^3(%10))(%10)

=(1 * 7)(%10)= 7。

計算完畢。

利用這些規則我們可以有效地計算X^N(% P)。簡單的算法是將result初始化為1,然後重複將result乘以X,每次乘法之後應用%運算符(這樣使得result的值變小,以免溢出),執行N次相乘後,result就是我們要找的答案。

這樣對於較小的N值來說,實現是合理的,但是當N的值很大時,需要計算很長時間,是不切實際的。下面的結論可以得到一種更好的算法。

如果N是偶數,那麼X^N =(X*X)^[N/2];

如果N是奇數,那麼X^N = X*X^(N-1) = X *(X*X)^[N/2];

其中[N]是指小於或等於N的最大整數。

C++實現功能函數:

/*

函數功能:利用模運算規則,採用遞歸方式,計算X^N(% P)

函數名:PowerMod

輸入值:unsigned int x,底數x

unsigned int n,指數n

unsigned int p,模p

返回值:unsigned int,X^N(% P)的結果

*/

unsigned int PowerMod(unsigned int x, unsigned int n, unsigned int p)

{

if (n == 0)

{

return 1;

}

unsigned int temp = PowerMod((x * x)%p, n/2, p); //遞歸計算(X*X)^[N/2]

if ((n 1) != 0) //判斷n的奇偶性

{

temp = (temp * x) % p;

}

return temp;

}

5.《孫子問題(中國剩餘定理)》

在我國古代算書《孫子算經》中有這樣一個問題:

“今有物不知其數,三三數之剩二,五五數之剩三,七七數之剩二,問物幾何?”意思是,“一個數除以3餘2,除以5餘3,除以7餘2.求適合這個條件的最小數。”

這個問題稱為“孫子問題”.關於孫子問題的一般解法,國際上稱為“中國剩餘定理”.

我國古代學者早就研究過這個問題。例如我國明朝數學家程大位在他著的《算法統宗》(1593年)中就用四句很通俗的口訣暗示了此題的解法:

三人同行七十稀,五樹梅花甘一枝,七子團圓正半月,除百零五便得知。

“正半月”暗指15。”除百零五”的原意是,當所得的數比105大時,就105、105地往下減,使之小於105;這相當於用105去除,求出餘數。

這四句口訣暗示的意思是:當除數分別是3、5、7時,用70乘以用3除的餘數,用21乘以用5除的餘數,用15乘以用7除的餘數,然後把這三個乘積相加。加得的結果如果比105大,就除以105,所得的餘數就是滿足題目要求的最小正整數解。

根據剩餘定理,我把此種解法推廣到有n(n為自然數)個除數對應n個餘數,求最小被除數的情況。輸入n個除數(除數不能互相整除)和對應的餘數,計算機將輸出最小被除數。

C++實現功能函數:

/*

函數名:ResidueTheorem

函數功能:運用剩餘定理,解決推廣了的孫子問題。通過給定n個除數(除數不能互相整除)和對應的餘數,返回最小被除數

輸入值:unsigned int devisor[],存儲了n個除數的數組

unsigned int remainder[],存儲了n個餘數的數組

int length,數組的長度

返回值:unsigned int, 最小被除數

*/

unsigned int ResidueTheorem(const unsigned int devisor[], const unsigned int remainder[], int length)

{

unsigned int product = 1; //所有除數之乘積

for (int i=0; ilength; i++)//計算所有除數之乘積

{

product *= devisor[i];

}

//公倍數數組,表示除該元素(除數)之外其他除數的公倍數

unsigned int *commonMultiple = new unsigned int(length);

for (int i=0; ilength; i++)//計算除該元素(除數)之外其他除數的公倍數

{

commonMultiple[i] = product / devisor[i];

}

unsigned int dividend = 0; //被除數,就是函數要返回的值

for (int i=0; ilength; i++)//計算被除數,但此時得到的不是最小被除數

{

unsigned int tempMul = commonMultiple[i];

//按照剩餘理論計算合適的公倍數,使得tempMul % devisor[i] == 1

while (tempMul % devisor[i] != 1)

{

tempMul += commonMultiple[i];

}

dividend += tempMul * remainder[i]; //用本除數得到的餘數乘以其他除數的公倍數

}

delete []commonMultiple;

return (dividend % product); //返回最小被除數

}

6. 凱撒密碼

凱撒密碼(caeser)是羅馬擴張時期朱利斯o凱撒(Julius Caesar)創造的,用於加密通過信使傳遞的作戰命令。

它將字母表中的字母移動一定位置而實現加密。注意26個字母循環使用,z的後面可以堪稱是a。

例如,當密匙為k = 3,即向後移動3位時,若明文為”How are you!”,則密文為”Krz duh btx!”。

凱撒密碼的加密算法極其簡單。其加密過程如下:

在這裡,我們做此約定:明文記為m,密文記為c,加密變換記為E(key1,m)(其中key1為密鑰),

解密變換記為D(key2,m)(key2為解密密鑰)(在這裡key1=key2,不妨記為key)。

凱撒密碼的加密過程可記為如下一個變換:c≡m+key (mod n) (其中n為基本字符個數)

同樣,解密過程可表示為:m≡c+key (mod n) (其中n為基本字符個數)

C++實現功能函數:

/*

函數功能:使用凱撒密碼原理,對明文進行加密,返回密文 函數名:Encrypt

輸入值:const char proclaimedInWriting[],存儲了明文的字符串

char cryptograph[],用來存儲密文的字符串

int keyey,加密密匙,正數表示後移,負數表示前移

返回值:無返回值,但是要將新的密文字符串返回

*/

void Encrypt(const char proclaimedInWriting[], char cryptograph[], int key)

{

const int NUM = 26; //字母個數

int len = strlen(proclaimedInWriting);

for (int i=0; ilen; i++)

{

if (proclaimedInWriting[i] = ‘a’ proclaimedInWriting[i] = ‘z’)

{//明碼是大寫字母,則密碼也為大寫字母

cryptograph[i] = (proclaimedInWriting[i] – ‘a’ + key) % NUM + ‘a’;

}

else if (proclaimedInWriting[i] = ‘A’ proclaimedInWriting[i] = ‘Z’)

{//明碼是小寫字母,則密碼也為小寫字母

cryptograph[i] = (proclaimedInWriting[i] – ‘A’ + key) % NUM + ‘A’;

}

else

{//明碼不是字母,則密碼與明碼相同

cryptograph[i] = proclaimedInWriting[i];

}

}

cryptograph[len] = ‘\0’;

}

/*

函數功能:使用凱撒密碼原理,對密文進行解密,返回明文 函數名:Decode

輸入值:char proclaimedInWriting[],用來存儲明文的字符串

const char cryptograph[],存儲了密文的字符串

int keyey,解密密匙,正數表示前移,負數表示後移(與加密相反)

返回值:無返回值,但是要將新的明文字符串返回

*/

void Decode(const char cryptograph[], char proclaimedInWriting[], int key)

{

const int NUM = 26; //字母個數

int len = strlen(cryptograph);

for (int i=0; ilen; i++)

{

if (cryptograph[i] = ‘a’ cryptograph[i] = ‘z’)

{//密碼是大寫字母,則明碼也為大寫字母,為防止出現負數,轉換時要加個NUM

proclaimedInWriting[i] = (cryptograph[i] – ‘a’ – key + NUM) % NUM + ‘a’;

}

else if (cryptograph[i] = ‘A’ cryptograph[i] = ‘Z’)

{//密碼是小寫字母,則明碼也為小寫字母

proclaimedInWriting[i] = (cryptograph[i] – ‘A’ – key + NUM) % NUM + ‘A’;

}

else

{//密碼不是字母,則明碼與明密相同

proclaimedInWriting[i] = cryptograph[i];

}

}

proclaimedInWriting[len] = ‘\0’;

}

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/250845.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-13 13:32
下一篇 2024-12-13 13:32

相關推薦

  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演着非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29
  • Python按位運算符和C語言

    本文將從多個方面詳細闡述Python按位運算符和C語言的相關內容,並給出相應的代碼示例。 一、概述 Python是一種動態的、面向對象的編程語言,其按位運算符是用於按位操作的運算符…

    編程 2025-04-29
  • Python餘弦定理求第三邊長

    本文將從以下幾個方面對Python餘弦定理求第三邊長進行詳細闡述: 一、餘弦定理簡介 餘弦定理是解決三角形問題的基本工具之一,它可以用於求解三角形的邊長和角度。其公式如下: c² …

    編程 2025-04-29
  • Python語言由荷蘭人為中心的全能編程開發工程師

    Python語言是一種高級語言,很多編程開發工程師都喜歡使用Python語言進行開發。Python語言的創始人是荷蘭人Guido van Rossum,他在1989年聖誕節期間開始…

    編程 2025-04-28
  • Python語言設計基礎第2版PDF

    Python語言設計基礎第2版PDF是一本介紹Python編程語言的經典教材。本篇文章將從多個方面對該教材進行詳細的闡述和介紹。 一、基礎知識 本教材中介紹了Python編程語言的…

    編程 2025-04-28
  • Python語言實現人名最多數統計

    本文將從幾個方面詳細介紹Python語言實現人名最多數統計的方法和應用。 一、Python實現人名最多數統計的基礎 1、首先,我們需要了解Python語言的一些基礎知識,如列表、字…

    編程 2025-04-28
  • Python除法運算代碼用法介紹

    本文將從以下方面詳細地介紹Python除法運算的代碼:Python除法的類型、Python除法的運算規則、Python除法的應用實例等。 一、Python除法的類型 Python中…

    編程 2025-04-28

發表回復

登錄後才能評論