1. 整数に関するプログラム 1.1 値の交換 (1) void swap(int* A, int* B){ int t; t = *A; *A = *B; *B = t; } (2) void swap(int* A, int* B){ *B = *A ^ *B; *A = *A ^ *B; *B = *A ^ *B; } (3) void reverceArray(int N, int A[]){ for(int i=0; i < 1 / 2; i++) swap(&A[i], &A[N-i-1]); } 1.2 2値の最大・最小 (1) int max2(int A,int B){ if(A>=B) return A; else return B; } int min2(int A,int B){ f(A<=B) return A; else return B; } (2) int max2(int A, int B){ return (A + B + abs(A - B)) / 2; } int min2(int A, int B){ return (A + B - abs(A - B)) / 2; } 1.3 3値以上の最大値 (1) int max3(int A, int B, int C){ return max2(max2(A, B), C); } (2) int max3(int A, int B, int C){ int R = A; /* 仮の最大値をAとする */ if(R < B) R = B; /* 仮の最大値 < B なら仮の最大値 = B */ if(R < C) R = C; /* 仮の最大値 < C なら仮の最大値 = C */ return R; } (3) int maxN(int N, int A[]){ int R = A[0]; /* 最大値をA[0]とし,最大値 < A[i] なら最大値 = A[i] */ for(i = 1; i=10; NN /= 10, R++); return R; } (2) int CountDigits2(int N){ return (int) log10((double)N) + 1; } 1.6 閏年かどうかの判定 int leapYear(int Y){ if((Y % 100) == 0) if((Y % 400) != 0) return 0; else return 1; if((Y % 4) == 0) return 1;else return 0; } 1.7 年月日から曜日を求める int DayOfWeek(int Y, int M, int D){ if(M < 3){ Y = Y - 1; M = M + 12;} return (Y + Y / 4 - Y / 100 + Y / 400 + (13 * M + 8) / 5 + D) % 7; } 1.8 組合せの個数 (1) int comb(int N,int R){ if((R==0)||(R==N)) return 1; if( R==1 ) return N; return comb(N-1,R-1)+comb(N-1,R); } (2) int comb2(int N, int R){ /* comb(N, 1)から計算をはじめ */ int i, j, C[17]; /* 計算結果をC[]に格納する  */ if((N - R) < R) R = N-R; /* comb(N, R)==comb(N, N - R) */ if( R == 0 ) return 1; if( R == 1 ) return N; for(i = 2; i <= R; i++) C[i-1] = i+1; for(i = 1; i <= N ? R - 1; i++){ C[0] = i + 2; for(j = 1; j < R; j++) C[j] = C[j - 1] + C[j]; } return C[R-1]; } 1.9 正整数の乗除算 int mult(int A, int B){ /* 乗算 */ int R; for(R = 0; A != 0; A >>= 1, B <<= 1) if(A & 1) R += B; return R; } void div(int A, int B, int* D, int* R){ /* 除算 Dに商,Rに剰余を返す */ int DD, AA, BB, C; for(DD = 0, AA = A; AA >= B; BB >>= 1, C >>= 1, AA -= BB, DD += C) for(C = 1, BB = B; AA >= BB; BB <<= 1, C <<= 1); *D = DD; *R = AA; return; } 1.10  最大公約数 int GCD(int A, int B){ int W; A = abs(A); B = abs(B); /* 正の数に限定する */ if(A < B) swap(&A, &B); /* 被除数を大きい数とする */ while(B != 0){ W = A % B; A = B; B = W;} /* ユークリッドの互除法 */ return A; } 1.11  素数 (1) i nt getPrime1(int NLimit, int Prime[]){ int i,n; int nPrime = 0; /* nPrime:素数の数 */ for(int n = 2; n<= NLimit; n++){ for(i = 2; i < n; i++) if((n % i) == 0) break; if(n == i) Prime[nPrime++] = n; /* 割り切れない場合に素数とする */ } return nPrime; } (2) int getPrime2(int NLimit, int Prime[]){ int i, n; int nPrime = 2; /* nPrime:素数の数 */ Prime[0] = 2; Prime[1] = 3; for(int n = 5; n <= NLimit; n++){ int iflag=true; /*既に格納されている素数で割る */ for(i=0; i D){ if((N % D) == 0){ N /= D; if(nF >= MX) return -nF; F[nF++]=D; } else{ D += TB[i]; if(i==3) i--; else i++;} } if(nF >= MX) return -nF; F[nF++] = N; return nF; }