7.1 简单枚举
如果数据量小,完全可以使用暴力枚举的方法,不必浪费时间思考。
7.1.1 除法
枚举一个数,然后通过这个数*n得到另一个数,从而减少枚举量。
c
#include <stdio.h> #include <string.h> const int maxn = 10; bool check(int a, int b, int n) { // a < b char s1[maxn]; char s2[maxn]; bool num[10]; bool z = 0; memset(num, 0, sizeof(num)); sprintf(s1, "%d", a); int len = strlen(s1); if(len < 5) { num[0] = 1; z = 1; } int t; for(int i = 0; i < len; i++) { t = s1[i] - '0'; if(num[t]) return false; else num[t] = 1; } sprintf(s2, "%d", b); len = strlen(s2); if(len > 5) return false; for(int i = 0; i < len; i++) { t = s2[i] - '0'; if(num[t]) return false; else num[t] = 1; } for(int i = 0; i < 10; i++) if(! num[i]) return false; if(z) printf("%s/0%s=%d\n", s2, s1, n); else printf("%s/%s=%d\n", s2, s1, n); return true; } const int maxnum = 1000000; int main() { int n, j; while(~scanf("%d", &n)) { for(int i = 1; i < maxnum; i++) { j = i * n; check(i, j, n); // printf("%d ", i); } printf("\n"); } return 0; }
7.1.2 最大乘积
直接暴力枚举两个起点即可。
c
#include <stdio.h> const int maxn = 1000; int main() { int n; int qu[maxn]; int product; int max; while(~scanf("%d", &n)) { max = 0; for(int i =0 ; i< n ;i++) scanf("%d", &qu[i]); for(int i = 0; i <n ;i++) { for(int j = i+1; j < n; j++) { product = 1; for(int k = i; k <= j; k++) product = product * qu[k]; max = max > product ? max : product; } } printf("%d\n", max); } return 0; }
7.1.3 分数拆分
c
#include <stdio.h> #include <queue> using namespace std; struct group { int x; int y; group(){} group(int _x, int _y) { x = _x; y = _y; } }; int main(int argc, const char *argv[]) { int k, cnt; while(~scanf("%d", &k)) { int x; queue <group> q; cnt = 0; for(int i = k+1; i <= 2*k; i++) { if((i * k) % (i - k) == 0) { x = (i*k) / (i-k); if(x >= i) { cnt ++; q.push(group(x, i)); } } } printf("%d\n", cnt); group a; while(!q.empty()) { a = q.front(); q.pop(); printf("1/%d = 1/%d + 1/%d\n", k, a.x, a.y); } } return 0; }
7.1.4 双基回文数
又熟悉了下进制的转换~
c
#include <iostream> #include <stdio.h> using namespace std; const int maxn = 1000; int num[maxn]; bool trans(int n, int b) { int l = 0; while(n != 0) { num[l++] = n % b; n /= b; } for(int i = 0; i < l/2; i++) if(num[i] != num[l-i-1]) return false; // printf("b: %d\n", b); return true; } int main() { int n, i; int cnt; bool found; while(~scanf("%d", &n)) { while(1) { cnt = 0; found = false; for(int i = 2; i <= 10; i++) { if(trans(n, i)) cnt++; if(cnt > 1) { printf("%d\n", n); found = 1; break; } } if(found) break; n++; } } return 0; }
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。