素数:
int prime(int n) //验证素数
{
int i, x, t;
t = (int)(sqrt(n));
for(i = 2; i <= t; i++)
if(n%i == 0) return 1;
return 0;
}
公约公倍数:完全不需要额外判断大小
int gcd(int m,int n){
return n ? gcd(n, m % n) : m;
}
int lcm(int m,int n){
return (m*n)/gcd(m,n);
}
_____________________________________
int n_gcd(int* nums, int numsSize){
for (int i = 1; i < numsSize; ++i) {
nums[0]= gcd(nums[0],nums[i]);
}
return nums[0];
}
int n_lcm(int* nums, int numsSize){
for (int i = 1; i < numsSize; ++i) {
nums[0]= lcm(nums[0],nums[i]);
}
return nums[0];
}
分解质因数:
void Decompose_prime_factors(int n){
::printf("%d=",n);
for (int i = 2; i <= n; ++i) {
if (n%i==0){
::printf("%d",i);
n/=i;
if (n!=1)::printf("*");
i=1;
}
// if (n==1) return ;
}
}
凯撒:
void fun(char a[],int act)
{
for (int i = 0; i < strlen(a); i++)
if (a[i] >= 'a' && a[i] <= 'z')
a[i] = (a[i] - 'a' + act + 26) % 26 + 'a';
else if (a[i] >= 'A' && a[i] <= 'Z')
a[i] = (a[i] - 'A' + act + 26) % 26 + 'A';
}
排序:(lld或lf)
void bubble_d(r)_sort(int arr[], int len) {
int i, j;
for (i = 0; i < len - 1; i++)
for (j = 0; j < len - 1 - i; j++)
if (arr[j] <(>) arr[j + 1]) {
arr[j] ^= arr[j+1];
arr[j+1] ^= arr[j];
arr[j] ^= arr[j+1];
}
}
sort(arr,arr+len);
sort(vec.begin(),vec.end());
完数判断:(lld或lf)
void p_num(int a,int b){
for (int i = a; i <= b ; ++i) {
int s=1;
for (int j = 2; j <=(i/2) ; ++j) {
if(i%j==0) s+=j;
}
if(i==s){
printf("get %d=1",i);
for (int j = 2; j <= (i/2); ++j) {
if(0==i%j) printf("+%d",j);
}
printf("\n");
}
}
}
守形判断:(lld或lf)
void same_num(int a,int b){
int cont=0,s,tail;
for (int i = a; i <= b; ++i) {
s=i*i;
int n=1,m=i;
while (m>0){
n*=10;m/=10;
}
tail=s%n;
if(i==tail){
cont++;
printf("%d: %d^2=%d\n",cont,i,s);
}
}
}
排列:
A m
n
int A(int n, int m) {
int res = 1;
for (int i = m; i >= 1; i--) {
res *= n; //n × n-1 × n-2 × ... n-m,m就是需要减1的次数
n--;
}
}
组合数:
C n
m
int cnm(int n,int m){
if(n==0) return 1;
if(n==1) return m;
return m*cnm(n-1, m-1)/n;
}
int C(int n, int m) {
m = Math.min(m, n-m);
int numerator = A(n, m); //分子
int denominator = A(m, m); //分母
return numerator / denominator;
}
进制转换:一般大家默认二进制,八进制,十进制,十六进制分别用字符:bin, oct, dec, hex 来表示
scanf("%x",&a);
printf("%d",a);
____________________________________
n进制-->10进制
void tranP_fun(int x,int p){
//x输入数字 p该数的进制数
int y=0,product=1;
while(x!=0){
y=y+(x%10)*product;
x=x/10;
product*=p;
}
printf("%d",y);
}
________
10-->n
void tran10_fun(int x,int p){
//x为十进制数,p为目标进制大小
int a[100]; //存放余数
int count=0;
while (1){
a[count++]=x%p;//=cont,cont++;
x/=p;
if(x==0)break;
}
for(int i=count-1;i>=0;i--){ //++之后-1;
printf("%d",a[i]);
}
}
______________________________
p进制乘法表:
int res,p;
char d[17]="0123456789abcdef";
::scanf("%d",&p);
for (int i = 1; i < p; ++i) {//纵向
::printf(" %c ",d[i]);
for (int j = 1; j <= i; ++j) {//横向
res=i*j;
if(res<p) ::printf(" %c ",d[res]);
else ::printf(" %c%c ",d[(res/p)],d[res%p]);
}
::printf("\n");
}
去重:
len = strlen(arr);
vector<char> vec ;
sort(vec.begin(),vec.end());
for (int i = 0; i < len; ++i)
vec.push_back(arr[i]);
vec.erase(unique(vec.begin(), vec.end()), vec.end());
_______________________
char arr[100];
gets(arr);
int len = strlen(arr);
sort(arr,arr+len);
len= unique(arr,arr+len)-arr;
for (int i = 0; i < len; ++i) ::printf("%c",arr[i]);
_______________________
int len=strlen(arr);
for (int i = 0; i < len; i++) {
if(arr[i]>='A'&&arr[i]<='Z'){
int f=1;
for (int k = 0; k < strlen(ar); ++k) {
if(arr[i]==ar[k]) f=0;
}
if(f){ar[j]=arr[i];
j++;
flag=0;
}
}
}
ar[j]=NULL;!!!!
混合字符或底层进制换算机制:
long long fun(char a[])
{ int flag=1;
static long long result;
for (int i = 0; i < strlen(a); i++){
if(a[i]=='-')flag=-1;
if(a[i]>='1'&&a[i]<='9'){
result=result*16+a[i]-48;
continue;
}
else if(a[i]=='A'||a[i]=='a'){result=result*16+10;
continue;}
else if(a[i]=='B'||a[i]=='b'){result=result*16+11;
continue;}
else if(a[i]=='C'||a[i]=='c'){result=result*16+12;
continue;}
else if(a[i]=='D'||a[i]=='d'){result=result*16+13;
continue;}
else if(a[i]=='E'||a[i]=='e'){result=result*16+14;
continue;}
else if(a[i]=='F'||a[i]=='f'){result=result*16+15;
continue;}
}
return flag*result;
}
字符与数:
字符串转整数:在 <stdlib.h> 头文件中
C 库函数 *int atoi(const char str) 把参数 str 所指向的字符串转换为一个整数(类型为 int 型)。
可以num= atoi(token);
C 库函数 **double strtod(const char *str, char endptr) 把参数 str 所指向的字符串转换为一个浮点数(类型为 double 型)。
比较麻烦,直接抄:
double ret;
char str[5];char *ptr;
gets(str);
::printf("%f", ::strtod(str,&ptr));
数转字符:
itoa (表示 integer to alphanumeric)是把整型数转换成字符串的一个函数。
//value: 要转换的整数,string: 转换后的字符串,radix: 转换进制数
char str[5];
int i=168;
int tense=16;
itoa(i,str,tense);
puts(str);
批量复制:
C 库str函数 **char *strcpy(char dest, const char src) 把 src 所指向的字符串复制到 dest 。
char str[100];
::strcpy(str,"123");
::puts(str);
批量分割:
C 库函数 char *strtok(char str, const char delim) 分解字符串 str 为一组字符串,delim** 为分隔符。
- str -- 要被分解成一组小字符串的字符串。
- delim -- 包含分隔符的 C 字符串。返回值
第一次调用strtok函数时,这个函数将忽略间距分隔符并返回指向在str字符串找到的第一个符号的指针,丢掉分隔符sep,添加NULL字符结尾(可以理解为用NULL替换了sep).
通过调用一系列的strtok函数,更多的符号将从str字符串中分离出来.每次调用strtok函数时,都将通过在找到的符号后插入一个NULL字符(丢掉sep)来修改str字符串.
为了读取str中的下一个符号,调用strtok函数时str参数为NULL,这会引发strtok函数在已修改过的str字符串查找下一个符号.
该函数返回被分解的第一个子字符串,如果没有可检索的字符串,则返回一个空指针。
编辑
IP判断:
while (~scanf("%s",str[i])){
char *token;
flag=1;
token= strtok(str[i],".");
while (token!=0){
num= atoi(token);
if(num>255||num<=0) flag=0;
token= strtok(NULL,".");
}
if(flag)printf("Y\n");
else printf("N\n");
i++;
}
万年历:
int fun_Time(int year, int month, int day) {
if(month == 1 || month == 2) {
month += 12;
--year;
}
int week = -1;
week = (day + 2 * month + 3 * (month + 1) / 5 + year + year / 4 -year / 100 +year / 400) % 7 + 1;
//(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%7
return week;
}
补充:
| 18 | double ceil(double x)
返回大于或等于 x 的最小的整数值。 |
| ---- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
| 19 | double fabs(double x)
返回 x 的绝对值。 |
| 20 | double floor(double x)
返回小于或等于 x 的最大的整数值。 |
| 21 | double fmod(double x, double y)
返回 x 除以 y 的余数。 |