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