數論基礎代碼合集

歐幾里德

#include<iostream>
using namespace std;
int hcf(int a,int b)??????
{int r=0;while(b!=0){r=a%b;a=b;b=r;}return(a);
}
lcd(int u,int v,int h) //u=a,v=b,h為最小公約數=hcf(a,b);
{return(u*v/h);
}
int main()
{int a,b,x,y;cin>>a>>b;x=hcf(a,b);y=lcd(a,b,x);cout<<x<<" "<<y<<endl;return 0;
}

擴展歐幾里德

#include <iostream>
using namespace std;
__int64 ext_euclid(__int64 a,__int64 b, __int64 &x, __int64 &y)
{int t;__int64 d;if (b==0) {x=1;y=0;return a;}d=ext_euclid(b,a %b,x,y);t=x;x=y;y=t-a/b*y;return d;
}
void modular_equation(__int64 a,__int64 b,__int64 c)//ax = b(mod n)
{__int64 d;__int64 x,y;d = ext_euclid(a,b,x,y);if ( c % d != 0 )printf("No answer\n");else{x = (x * c/d) % b ;// 第一次求出的x ;__int64 t = b/d;x = (x%t + t)%t;printf("%I64d\n",x);//最小的正數的值for (int i=0;i<d;i++)printf("The %dth answer is : %ld\n",i+1,(x+i*(b/d))%b); //所有的正數值}
}
/*函數返回值為gcd(a,b),并順帶解出ax+by=gcd(a,b)的一個解x,y,對于不定方程ax+by=c的通解為:x=x*c/d+b/d*ty=y*c/d+a/d*t當c%gcd(a,b)!=0時,不定方程無解.*/

?

中國剩余定理

#include <iostream>
using namespace? std;int ext_euclid(int a,int b,int &x,int &y)? //求gcd(a,b)=ax+by
{int t,d;if (b==0) {x=1;y=0;return a;}d=ext_euclid(b,a %b,x,y);t=x;x=y;y=t-a/b*y;return d;
}int China(int W[],int B[],int k)?? //W為按多少排列,B為剩余個數?? W>B? K為組數
{int i;int d,x,y,a=0,m,n=1;for (i = 0;i<k;i++)n *= W[i];for (i=0;i<k;i++){m=n/W[i];d=ext_euclid(W[i],m,x,y);a=(a+y*m*B[i])%n;}if (a>0return a;elsereturn(a+n);
}int main(){int B[100],W[100];??????????????????????????????? 求int k ;?????????????????????????????????????????? a = 2( mod 5 )cin >> k ;???????????????????????????????? ???????a = 3( mod 13)for(int i = 0 ; i < k ;i++)??????????????????????????? 的解{?????????????????????????????????????????????? 2cin >> W[i];????????????????????????????????? 5 2cin >> B[i];?????????????????????????????????? 13 3?}?????????????? ????????????????????????????????輸出 42cout<<China(W,B,k)<<endl;return 0;}

?

歐拉函數

求小于n的所有歐拉數

#include <iostream>using namespace std;int phi[1000];???? //數組中儲存每個數的歐拉數void genPhi(int n)//求出比n小的每一個數的歐拉數(n-1的){int i, j, pNum = 0 ;memset(phi, 0, sizeof(phi)) ;phi[1] = 1 ;for(i = 2; i < n; i++){if(!phi[i]){for(j = i; j < n; j += i){if(!phi[j])phi[j] = j;phi[j] = phi[j] / i * (i - 1);}}}}

n的歐拉數

int eular(int n){int ret=1,i;for (i=2;i*i<=n;i++)if (n%i==0){n/=i,ret*=i-1;while (n%i==0)n/=i,ret*=i;}if (n>1)ret*=n-1;return ret;??? //n的歐拉數}

行列式計算

#include <iostream>using namespace std;int js(int s[100][100],int n){int z,j,k,r,total=0;int b[100][100]; ?/*b[N][N]用于存放,在矩陣s[N][N]中元素s[0]的余子式*/if(n>2){for(z=0;z<n;z++){for(j=0;j<n-1;j++)for(k=0;k<n-1;k++)if(k>=z)b[j][k]=s[j+1][k+1];?elseb[j][k]=s[j+1][k];if(z%2==0)r=s[0][z]*js(b,n-1); /*遞歸調用*/elser=(-1)*s[0][z]*js(b,n-1);total=total+r;}}else if(n==2)total=s[0][0]*s[1][1]-s[0][1]*s[1][0];return total;}

排列

long A(long n,long m)?? //n>m{long a=1;while(m!=0)? {a*=n;n--;m--;}return a;}

組合

long C(long n,long m)???? //n>m{long i,c=1;i=m;while(i!=0)?? {c*=n;n--;i--;}while(m!=0)? {c/=m;m--;}return c;}

大數乘大數

#include <iostream>
#include <string>
using namespace std;
char a[1000],b[1000],s[10000];
void mult(char a[],char b[],char s[])???? //a被乘數,b乘數,s為積
{int i,j,k=0,alen,blen,sum=0,res[65][65]={0},flag=0;char result[65];alen=strlen(a);blen=strlen(b);for (i=0;i<alen;i++)for (j=0;j<blen;j++) res[i][j]=(a[i]-'0')*(b[j]-'0');for (i=alen-1;i>=0;i--){for (j=blen-1;j>=0;j--) sum=sum+res[i+blen-j-1][j];result[k]=sum%10;k=k+1;sum=sum/10;}for (i=blen-2;i>=0;i--){for (j=0;j<=i;j++) sum=sum+res[i-j][j];result[k]=sum%10;k=k+1;sum=sum/10;}if (sum!=0) {result[k]=sum;k=k+1;}for (i=0;i<k;i++) result[i]+='0';for (i=k-1;i>=0;i--) s[i]=result[k-1-i];s[k]='\0';while(1){if (strlen(s)!=strlen(a)&&s[0]=='0')strcpy(s,s+1);elsebreak;}
}int main(){cin>>a>>b;mult(a,b,s);cout<<s<<endl;return 0;}

大數乘小數

#include <iostream>using namespace std;char a[100],t[1000];void mult(char c[],int m,char t[])? // c為大數,m<=10,t為積{int i,l,k,flag,add=0;char s[100];l=strlen(c);for (i=0;i<l;i++)s[l-i-1]=c[i]-'0';for (i=0;i<l;i++){k=s[i]*m+add;if (k>=10){s[i]=k%10;add=k/10;flag=1;}else{s[i]=k;flag=0;add=0;}}if (flag){l=i+1;s[i]=add;}elsel=i;for (i=0;i<l;i++)t[l-1-i]=s[i]+'0';t[l]='\0';}int main(){int i;cin>>a>>i;mult(a,i,t);cout<<t<<endl;return 0;}

大數加法

#include <iostream>#include <string>using namespace std;char a[1000],b[1000],s[10000];void add(char a[],char b[],char s[])//a被加數,b加數,s和{int i,j,k,up,x,y,z,l;char *c;if (strlen(a)>strlen(b)) l=strlen(a)+2; else l=strlen(b)+2;c=(char *) malloc(l*sizeof(char));i=strlen(a)-1;j=strlen(b)-1;k=0;up=0;while(i>=0||j>=0){if(i<0) x='0'; else x=a[i];if(j<0) y='0'; else y=b[j];z=x-'0'+y-'0';if(up) z+=1;if(z>9) {up=1;z%=10;} else up=0;c[k++]=z+'0';i--;j--;}if(up) c[k++]='1';i=0;c[k]='\0';for(k-=1;k>=0;k--)s[i++]=c[k];s[i]='\0';}int main(){cin>>a>>b;add(a,b,s);cout<<s<<endl;return 0;}

?

大數減法

#include <iostream>using namespace std;char a[1000],b[1000],s[10000];void sub(char a[],char b[],char s[]){int i,l2,l1,k;l2=strlen(b);l1=strlen(a);s[l1]='\0';l1--;for (i=l2-1;i>=0;i--,l1--){if (a[l1]-b[i]>=0)s[l1]=a[l1]-b[i]+'0';else{s[l1]=10+a[l1]-b[i]+'0';a[l1-1]=b[l1-1]-1;}}k=l1;while(a[k]<0) {a[k]+=10;a[k-1]-=1;k--;}while(l1>=0) {s[l1]=a[l1];l1--;}loop:if (s[0]=='0'){l1=strlen(a);for (i=0;i<l1-1;i++) s[i]=s[i+1];s[l1-1]='\0';goto loop;}if (strlen(s)==0) {s[0]='0';s[1]='\0';}}int main(){cin>>a>>b;sub(a,b,s);cout<<s<<endl;return 0;}

?

大數階乘

#include <iostream>#include <cmath>using namespace std;long a[10000];int factorial(int n)???????? //n為所求階乘的n!的n{int i,j,c,m=0,w;a[0]=1;for(i=1;i<=n;i++){c=0;for(j=0;j<=m;j++){a[j]=a[j]*i+c;c=a[j]/10000;a[j]=a[j]%10000;}if(c>0) {m++;a[m]=c;}}w=m*4+log10(a[m])+1;printf("%ld",a[m]); //??????? 輸出for(i=m-1;i>=0;i--) //printf("%4.4ld",a[i]);//printf("\n");return w;??????????? //返回值為階乘的位數}

?

儲存方法很巧,每一個a[i]中存四位,不足四位在前加0補齊

?

?

大數求余

int mod(int B)???? //A為大數,B為小數{int i = 0,r = 0;while( A[i] != '\0' ){r=(r*10+A[i++]-'0')%B;}return r ;??? //r為余數}

高精度任意進制轉換

#include <iostream>#include <string>using namespace std;char s[1000],s2[1000];?? // s[]:原進制數字,用字符串表示,s2[]:轉換結果,用字符串表示long d1,d2;?? // d1:原進制數,d2:需要轉換到的進制數void conversion(char s[],char s2[],long d1,long d2){long i,j,t,num;char c;num=0;for (i=0;s[i]!='\0';i++){if (s[i]<='9'&&s[i]>='0') t=s[i]-'0'; else t=s[i]-'A'+10;num=num*d1+t;}i=0;while(1){t=num%d2;if (t<=9) s2[i]=t+'0'; else s2[i]=t+'A'-10;num/=d2;if (num==0) break;i++;}for (j=0;j<=i/2;j++){c=s2[j];s2[j]=s2[i-j];s2[i-j]=c;}s2[i+1]='\0';}int main(){while (1){cin>>s>>d1>>d2;conversion(s,s2,d1,d2);cout<<s2<<endl;}return 0;}

判斷一個數是否素數

#include <iostream>//基本方法,n為所求數,返回1位素數,0為合數

#include <cmath>

using namespace std;

int comp(int n){

int i,flag=1;

??? for (i=2;i<=sqrt(n);i++)

??? if (n%i==0) {flag=0;break;}

??? if (flag==1) return 1; else return 0;}

素數表

int prime(int a[],int n) ???????????//小于n的素數{?? int i,j,k,x,num,*b;n++;n/=2;b=(int *)malloc(sizeof(int)*(n+1)*2);a[0]=2;a[1]=3;num=2;for(i=1;i<=2*n;i++)b[i]=0;for(i=3;i<=n;i+=3)for(j=0;j<2;j++){x=2*(i+j)-1;while(b[x]==0){a[num++]=x;for(k=x;k<=2*n;k+=x)b[k]=1;}}return num; }??????????????? //小于n的素數的個數}bool flag[1000000];void prime(int M)? ?????????????//01表{???? int i , j;int sq = sqrt(double(M));?????for(i = 0 ;i < M ;i ++)flag[i] = true;????flag[1] = false;?? flag[0] = false;for(i = 2 ;i <= sq ;i++)if(flag[i]){for(j = i*i ;j < M ;j += i)flag[j] = false;}}

???? Miller_Rabin隨機素數測試算法?? ?

??????? 說明:這種算法可以快速地測試一個數是否??

??????? 滿足素數的必要條件,但不是充分條件。不??

??????? 過也可以用它來測試素數,出錯概率很小,??

??????? 對于任意奇數n>2和正整數s,該算法出錯概率??

??????? 至多為2^(-s),因此,增大s可以減小出錯概??

??????? 率,一般取s=50就足夠了。

#include<iostream>#include <cmath>using namespace std;int Witness(int a, int n)??{??int i, d = 1, x;??for (i = ceil( log( (float) n - 1 ) / log(2.0) ) - 1; i >= 0; i--)????{??x = d;??d = (d * d) % n;??if ( (d == 1) && (x != 1) && (x != n-1) )return 1;??if ( ( (n - 1) & ( 1<<i ) ) >0 )d = (d * a) % n;??}??return (d == 1 ? 0 : 1);??????????}??int Miller_Rabin(int n, int s)??{??int j, a;??for (j = 0; j < s; j++)??{????a = rand() * (n - 2) / RAND_MAX + 1;??if (Witness(a, n))return 0;??}??return 1;????????}??int main(){int x;cin>>x;cout<<Miller_Rabin(x , 50)<<endl;return 0;}

?

整數拆分不可重復

#include <iostream>#include <memory>using namespace std;const int MAX = 500;long long data[MAX][MAX];int main(){int i,j;memset(data, 0, sizeof(int)*MAX);for(i = 0; i < MAX; i++)data[0][i] = 0;for(i = 0; i < MAX; i++){for(j = 0; j < MAX; j++){int sum = j*(j+1)/2;if(i > sum) data[i][j] = 0;else if(i == sum) data[i][j] = 1;else{if(i == j) data[i][j] = 1 + data[i][j-1];else if(i < j) data[i][j] = data[i][i];else data[i][j] = data[i-j][j-1] + data[i][j-1];}}}int n;while(cin >> n)cout << data[n][n] << endl;return 0;}整數拆分積最大int data[100];void main(int n;){????? int k = 2;for(; n >= k; n-=k,k++)data[k] = k;for(int i = k-1; i >= 2 && n; i--, n--)data[i]++;data[k-1] += n;for(int j = 2; j < k; j++)cout << data[j] << " ";cout << endl; }

整數的無序拆分(可重復)

#include <iostream>?????? //求出可分解個數#include <memory>using namespace std;const int MAX = 600;long long data[MAX][MAX];int main(){int i,j;memset(data, 0, sizeof(int)*MAX);for(j = 0; j < MAX; j++)data[0][j] = 0;for(i = 1; i < MAX; i++){for(j = 1; j < MAX; j++){if(i == j)data[i][j] = data[i][j-1]+1;else if(i < j)data[i][j] = data[i][i];elsedata[i][j] = data[i][j-1]+data[i-j][j];}}?????int n;while(cin >> n)cout << data[n][n] << endl;return 0;}

整數的無序拆分(可重復)

#include <iostream>?? //列出分解情況#include <memory>using namespace std;const int MAX = 300;int data[MAX];int main(){int i,n;cin >> n;for(i = 0; i < n; i++){data[i] = 1;printf("1");}printf("\n");int size = n;while(size > 1){int t, p, r;t = data[size-1] + data[size-2];p = t / (data[size-2]+1);r = t % (data[size-2]+1);t = data[size-2]+1;i = size - 2;size = size - 2 + p;for(; i < size; i++)data[i] = t;data[size-1] += r;for(i = 0; i < size; i++)printf("%d", data[i]);printf("\n");}return 0;}

約瑟夫環

void f(){int n , k , m , i , j , start;while(cin>>n>>k>>m )?? //n代表有多少個人 , k表示叫到k的人出列 , m 表示第一次誰先開始叫{start = 0;if( !n && !k && !m)return 0;for(i = 1 ;i < n; i++){start = (start + k) % i;}start++;start = (start + m) % n;if(!start)cout<<n<<endl;elsecout<<start<<endl;}return ;}#include <stdio.h>main(){int n, m, i, s=0;printf ("N M = "); scanf("%d%d", &n, &m);for (i=2; i<=n; i++) s=(s+m)%i;printf ("The winner is %d\n", s+1);}

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/444504.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/444504.shtml
英文地址,請注明出處:http://en.pswp.cn/news/444504.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++:03---引用類型

一、概念 C++中的一種新的變量類型,作用是為變量取別名二、引用規則 引用被創建時必須被初始化(即必須指向一個對象,因此引用一旦被初始化,就不能再指向其他對象)int a = 10; int &p = a; //正確 int &p2; //錯誤,引用必須初始化引用的數據類型必須與被引用的…

三個博弈基礎

&#xff08;一&#xff09;巴什博奕&#xff08;Bash Game&#xff09;&#xff1a;只有一堆n個物品&#xff0c;兩個人輪流從這堆物品中取物&#xff0c;規定每次至少取一個&#xff0c;最多取m個。最后取光者得勝。 顯然&#xff0c;如果nm1&#xff0c;那么由于一次最…

(十五)nodejs循序漸進-高性能游戲服務器框架pomelo之Protobuf模塊

消息壓縮 在實際編程中&#xff0c;為了減少數據傳輸帶寬的消耗&#xff0c;提高傳輸效率&#xff0c;pomelo提供了對消息的壓縮&#xff0c;包括基于字典的對route的壓縮和基于protobuf的對具體傳輸數據的壓縮。 route壓縮 在實際編程中&#xff0c;網絡帶寬的有效數據負載…

C++:13---多態和虛函數表

多態的意思為“以一個public基類的指針/引用,尋址一個派生類對象”。 “多態”的關鍵在于通過基類指針或引用調用一個虛函數時,編譯時不確定到底調用的是基類還是派生類的函數,運行時才確定。這是如何實現的呢?請看下面的程序,該程序演示了多態類對象存儲空間的大小。 #in…

leetcode96. 不同的二叉搜索樹 動歸vs數學?

給定一個整數 n&#xff0c;求以 1 ... n 為節點組成的二叉搜索樹有多少種&#xff1f; 示例: 輸入: 3 輸出: 5 解釋: 給定 n 3, 一共有 5 種不同結構的二叉搜索樹: 1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 …

Redis:06---數據庫管理

一、服務器中的數據庫Redis服務器將所有數據庫都保存在服務器狀態redis.h/redisServer結構的db數組中&#xff0c;db數組的每個項都是一個redis.h/redisDb結構&#xff0c;每個redisDb結構代表一個數據庫&#xff1a;struct redisServer {// ...redisDb *db; // 一個數組&#…

leetcode95. 不同的二叉搜索樹 II

給定一個整數 n&#xff0c;生成所有由 1 ... n 為節點所組成的二叉搜索樹。 示例: 輸入: 3 輸出: [ [1,null,3,2], [3,2,null,1], [3,1,null,null,2], [2,1,3], [1,null,2,null,3] ] 解釋: 以上的輸出對應以下 5 種不同結構的二叉搜索樹&#xff1a; 1 3 …

在同一局域網下連接共享文件夾失敗,提示:你不能訪問共享文件夾,因為你組織的安全策略阻止未經身份驗證的來賓訪問

1.嘗試打開guest訪問。 &#xff08;1&#xff09;使用鍵盤 win R 鍵&#xff0c;打開運行窗口&#xff0c;并輸入 gpedit.msc 打開本地組策略編輯器窗口 &#xff08;2&#xff09;選擇計算機配置------->管理模板-------->網絡-------->Lanman工作站。 &#…

(十五)深入淺出TCPIP之Hello CDN

什么是CDNCDN 其實是 Content Delivery Network 的縮寫&#xff0c;即“內容分發網絡”。CDN是將媒體資源&#xff0c;動靜態圖片(Flash) &#xff0c;HTML, CSS, JS等等內容緩存到距離你更近的互聯網數據中心&#xff0c;從而讓用戶進行共享資源&#xff0c;實現縮減站點間的響…

Redis:07---Redis數據結構

一、五大數據結構Redis可以存儲鍵與5種不同數據結構類型之間的映射&#xff0c;這5種數據結構類型分別為&#xff1a;STRING&#xff1a;字符串LIST&#xff1a;列表SET&#xff1a;集合HASH&#xff1a;散列ZSET&#xff1a;有序集合TYPE命令用來獲得鍵的數據類型&#xff0c;…

C++:14---虛繼承,虛函數,多態

一、多級混合繼承 下面先介紹菱形繼承 //菱形繼承 class A { public: int data; }; class B:public A { public: int data; }; class C:public A { public: int data; }; class D:public B,public C { public: int data; };int main() { D c; D.data=1; D.B::data=2;//訪問B中的…

(十四)nodejs循序漸進-高性能游戲服務器框架pomelo之開發Treasures游戲

#Tutorial 2 -- Treasures ##描述 Treasures 游戲是從 LordOfPomelo 中抽取出來&#xff0c;去掉了大量的游戲邏輯&#xff0c;用以更好的展示 Pomelo 框架的用法以及運作機制。 Treasures 很簡單&#xff0c;輸入一個用戶名后&#xff0c;會隨機得到一個游戲角色&#xff0c;…

leetcode243. 最短單詞距離(vip題)好像挺簡單?

給定一個單詞列表和兩個單詞 word1 和 word2&#xff0c;返回列表中這兩個單詞之間的最短距離。 示例: 假設 words ["practice", "makes", "perfect", "coding", "makes"] 輸入: word1 “coding”, word2 “practice”…

談談蘋果應用內支付(IAP)的坑

一、請求商品 下面是請求商品的代碼: - (void)validateProductIdentifier:(NSArray *)productIdentifier {SKProductsRequest *productRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithArray:productIdentifier]];self.request = productRe…

leetcode204. 計數質數(vip題)

統計所有小于非負整數 n 的質數的數量。 示例: 輸入: 10 輸出: 4 解釋: 小于 10 的質數一共有 4 個, 它們是 2, 3, 5, 7 。 思路&#xff1a;篩法&#xff0c;見代碼。 class Solution {public int countPrimes(int n) {// 1. 給數加上標記byte[] nums new byte[n];for (i…

如何使得客戶端和服務器端完美配合做IOS應用內付費

配置Developer.apple.com 登錄到Developer.apple.com,然后進行以下步驟: 為應用建立建立一個不帶通配符的App ID用該App ID生成和安裝相應的Provisioning Profile文件。配置iTunes Connect 登錄到iTunes Connet,然后進行以下步驟: 用該App ID創建一個新的應用。在該應用中…

IOS內購流程從0-1手把手教會

蘋果掌握著可能是全球最重要的APP分發渠道,然而30%的抽成近年來也被人批評,現在蘋果似乎也看到反對意見了,從2021年1月1日開始,部分小型企業的分成費用降低到15%。 據報道,蘋果將于2021年1月1日啟動App Store小企業項目,會降低他們的抽成費用。針對年收入不足100萬美元的…

leetcode217. 存在重復元素(vip題)超簡單

給定一個整數數組&#xff0c;判斷是否存在重復元素。 如果任何值在數組中出現至少兩次&#xff0c;函數返回 true。如果數組中每個元素都不相同&#xff0c;則返回 false。 示例 1: 輸入: [1,2,3,1] 輸出: true 示例 2: 輸入: [1,2,3,4] 輸出: false 示例 3: 輸入: [1,1,…

訂單數據持久化和驗證相關解決方案

訂單數據持久化 有時候蘋果支付在支付完成后,從蘋果服務器返回收據的過程中可能會掉單(可能是網絡問題,可能是蘋果BUG,也有一部分是開發者自身埋的坑),因此我們需要一個訂單持久化的機制來保障。 首先根據內購商品ID(此商品ID是在蘋果后臺建好的內購商品)、用戶信息(…

IOS iap處理邏輯流程圖再次梳理

序言: 本文補全一下iOS iap處理邏輯。 iap處理邏輯 蘋果退單wiki:https://developer.apple.com/documentation/storekit/in-app_purchase/handling_refund_notifications 一、上圖主要處理了以下業務: 普通購買 自動續訂訂閱 補單處理 預防黑產 退單處理 二、除了上述業…