一、判断是否为素数
bool is_prime(int n){
i=2;
while(i<=sqrt(n)){
if(n/i==0)
return false;
i++;
}
return true;
}
二、最大公约数
int gbc(int a,int b){
return b==0 ? a:gbc(b,a%b);
}
三、最上递增增长序列
for ( j=1; j<len; j++ )
for ( i=0; i<j; i++ )
if ( a[j]>a[i] && dp[j]<dp[i]+1 )
dp[j] = dp[i]+1;
四、进制长度(x>>=1表示右移动一位)
int BitLength(int x)
{
int d = 0;
while (x > 0) {
x >>= 1;
d++;
}
return d;
}
五、质因数分解
void reduce(int n){
int m=n;
for(int i=2;i<m/2;i++){
if(n%i==0)
printf("%d ",i);
n/=i;
}
}
六、任意进制转化
void conversion(char s[], char s2[], long d1, long d2){
int num=0,i,t;
//按照进制 d1 将字符串 s 转换为十进制数 num
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(int j=0;j<i/2;j++){ //将字符逆置
char c = s2[j];
s2[j] = s2[i-j];
s2[i - j] = c;
}
s2[j+1] = '\0';
}
七、大数加法
char [] add(char a[] , char b[]){
if(strlen(a)<strlen(b)){
char temp [] = {};
strcpy(a,temp);
strcpy(a,b);
strcpy(b,temp);
}
len1 = strlen(a);
len2 = strlen(b);
int num1,num2,flag=0,num;
while(len1>0){
num1 = a[len1-1]-'0';
if(len2>0)
num2 = b[len2-1]-'0';
else
num2 = 0;
num = nun1 + num2 +flag;
a[len1-1] = num%10 + '0';
flag = num/10;
len1--;
len2--;
}
if(flag==1)
a[len1] = '1';
return a;
}