数论基础代码合集

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

#include

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);

else

break;

}

}

int main()

{

cin>>a>>b;

mult(a,b,s);

cout<<s<<endl;

return 0;}

大数乘小数

=========

#include

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©;

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;

}

else

l=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

#include

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(lsizeof(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

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

#include

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

#include

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 //基本方法,n为所求数,返回1****位素数,0为合数

#include

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

#include

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

#include

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        //求出可分解个数

#include

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];

else

data[i][j] = data[i][j-1]+data[i-j][j];

}

}

int n;

while(cin >> n)

cout << data[n][n] << endl;

return 0;

}

整数的无序拆分(可重复)

================

#include    //列出分解情况

#include

using namespace std;

const int MAX = 300;

int data[MAX];
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

金三银四马上就到了,希望大家能好好学习一下这些技术点

学习视频:

大厂面试真题:

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
ory>

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];

else

data[i][j] = data[i][j-1]+data[i-j][j];

}

}

int n;

while(cin >> n)

cout << data[n][n] << endl;

return 0;

}

整数的无序拆分(可重复)

================

#include    //列出分解情况

#include

using namespace std;

const int MAX = 300;

int data[MAX];
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。[外链图片转存中…(img-iDMqH9Sf-1713719206057)]

[外链图片转存中…(img-86elhkSq-1713719206058)]

[外链图片转存中…(img-1ltP5N7g-1713719206058)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

金三银四马上就到了,希望大家能好好学习一下这些技术点

学习视频:

[外链图片转存中…(img-Vc3BZDTD-1713719206058)]

大厂面试真题:

[外链图片转存中…(img-0FDG7U73-1713719206058)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值