IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C语言的一些例题 -> 正文阅读

[C++知识库]C语言的一些例题

前言

  1. 对于一个大问题,分成几个小问题,依次解决

  2. 对于测试用例的考虑方向:
    (1). 极值(最大值、最小值…)
    (2). 特殊值 (数据范围的分界点等等)
    (3). 普通数据(取一些普通数据做检测)

  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");
	
	// 题目上说的,和我想的,可以不一样,只要最后达成目的就OK 
	
	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;	// or long long x;
	scanf("%d", &x); // or scanf("%lld", &x);
	
	printf("%d", x); // or printf("%lld", 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:奇数在前,偶数在后

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-16 11:12:18  更:2022-05-16 11:13:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 19:32:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码