-
对于一个大问题,分成几个小问题,依次解决
-
对于测试用例的考虑方向:
(1). 极值(最大值、最小值…)
(2). 特殊值 (数据范围的分界点等等)
(3). 普通数据(取一些普通数据做检测) -
一句个人理解:题目上说的,和我想的,可以不一样,只要最后达成目的就OK
ps:所有讨论的前提都是在输入合法的基础上进行的
例题 水仙花数的相关问题水仙花数的定义:对于三位数abc,满足 aaa + bbb + ccc = abc 的数字为水仙花数
问题1:判断给出的数字 x 是否为水仙花数按数位拆开,根据定义判断即可
#include#include int main(int argc, char *argv[]) { int x; scanf("%d", &x); int a = x / 100; int b = x / 10 % 10; int c = x % 10; if(a*a*a + b*b*b + c*c*c == x) printf("YESn"); else printf("NOn"); return 0; }
换个角度,abc一定要是数字么?
#include问题2:输出全部水仙花数#include int main(int argc, char *argv[]) { int a, b, c; char d; scanf("%c", &d); a = d - '0'; scanf("%c", &d); b = d - '0'; scanf("%c", &d); c = d - '0'; if(a*a*a + b*b*b + c*c*c == a*100 + b*10 + c) printf("YESn"); else printf("NOn"); // 题目上说的,和我想的,可以不一样,只要最后达成目的就OK return 0; }
显然,问题2是问题1的一个子问题。
增加遍历所有三位数的循环即可。
#include问题3:逆序输出 13579#include int main(int argc, char *argv[]) { int i; for(i = 100; i <= 999; i++){ int x = i; int a = x / 100; int b = x / 10 % 10; int c = x % 10; if(a*a*a + b*b*b + c*c*c == x) printf("%dn", i); } return 0; }
一眼题。
#include问题4:逆序输出 X(X是一个数)#include int main(int argc, char *argv[]) { printf("97531n"); return 0; }
每次取最后一位数,然后输出即可
#include#include int main(int argc, char *argv[]) { int x; scanf("%d", &x); while(x){ printf("%d", x%10); x /= 10; } return 0; }
思考,上述代码考虑所有情况了么?
if x = 123
if x = 0
if x = -123
if x = 123.456
if x = 1234567891234567899876543211223
显然没能解决所有情况。
测试数据的一点点扩展~~
#include#include int main(int argc, char *argv[]) { char a[1005]; scanf("%s", a); int len = strlen(a), i; for(i = len-1; i >= 0; i--) printf("%c", a[i]); return 0; }
关于一个函数递归的写法,(按需查看~):
#include问题5: 对于数字x,按位依次输出数字 x#include void f(){ char c = getchar(); if(c == 'n') return; f(); printf("%c", c); } int main(int argc, char *argv[]) { f(); return 0; }
你会怎么想?
#include#include int main(int argc, char *argv[]) { int x; // or long long x; scanf("%d", &x); // or scanf("%lld", &x); printf("%d", x); // or printf("%lld", x); return 0; }
x 一定要是数字么?
#include问题 6:正整数a和b,a + b = ?#include int main(int argc, char *argv[]) { char c; while(c = getchar(), c != 'n'){ printf("%c", c); } return 0; }
#include#include int main(int argc, char *argv[]) { int a, b; scanf("%d %d", &a, &b); printf("%d", a+b); return 0; }
如果,a 很大很大,超过 MAX_longlong
#include问题7:不使用strlen(),计算一行字符串的长度#include #include char a[1005], b[1005]; int c[1005]; int main(int argc, char *argv[]) { scanf("%s", a); scanf("%s", b); int lenA = strlen(a), lenB = strlen(b), i; if(lenA < lenB){ for(i = 0; i < lenB; i++){ char tmp = a[i]; a[i] = b[i]; b[i] = tmp; } } lenA = strlen(a), lenB = strlen(b); for(i = 1; i <= lenB; i++) c[lenA-i] = a[lenA-i]-'0' + b[lenB-i]-'0'; for(i = lenB+1; i <= lenA; i++) c[lenA-i] = a[lenA-i]-'0'; int flag = 0; for(i = lenA - 1; i >= 0; i--){ if(c[i]+flag > 9) c[i] = c[i] + flag - 10, flag = 1; else c[i] = c[i] + flag, flag = 0; } if(flag) printf("1"); for(i = 0; i < lenB; i++) printf("%d", c[i]); return 0; }
或者说,如何得到一行带空格的字符(当然,可以使用gets)
#include#include int main(int argc, char *argv[]) { char c, a[105]; int i = 0; while(c = getchar(), c != 'n'){ a[i++] = c; } a[i] = ' '; printf("%d", i); return 0; }
一个大问题,分成几个小问题,依次解决
问题8:询问字符串 A 在 B 中出现的次数#include问题8:#include #include int main(int argc, char *argv[]) { char a[1005], b[1005]; scanf("%s %s", a, b); int lenA = strlen(a), lenB = strlen(b); int cnt = 0, i, j; for(i = 0; i < lenB; i++){ int flag = 1; for(j = 0; j < lenA; j++){ if(b[i+j] == a[j]){ continue; } else{ flag = 0; break; } } if(flag == 1) cnt = cnt + 1; } printf("%d", cnt); return 0; }
定义 f(x) = …
定义 g(x) = f(f(x)),求 g(x)
问题9: 统计 num 出现的次数,依次输出 问题10:冒泡排序 问题11:奇数在前,偶数在后


