【第22期】观点:IT 行业加班,到底有没有价值?

第3章 数组与字符串

原创 2015年11月20日 16:22:35

3.1 数组

程序3.1 逆序输出(读入一些整数,不超过100个,逆序输出到一行中)
#include <stdio.h>
#define maxn 105   //常常难以精确计算出需要的数组大小,数组一般会比声明的稍大一点,会更保险
int buf[maxn];     //因为局部变量存放在堆栈段中,若放在函数体内可能会导致栈溢出,一般在全局部分声明较大的数组
int main()
{
	int x, n = 0;
	while(scanf("%d", &x) == 1)
		buf[n++] = x;
	for(int i = n-1; i >= 1; i--)
		printf("%d ", buf[i]);
	printf("%d\n", buf[0]);
	return 0;
}
在头文件<string.h>中定义了函数memcpy和memset
#include<stdio.h>
#include <string.h>
int main()
{
	int a[5], b[5] = {1, 2, 3, 4, 5};
	memset(a, 1, sizeof(a));   //memset是对每个字节赋值,而int有4字节(32位),则每个元素为00000001000000010000000100000001,即16843009
	memcpy(b, a, sizeof(int) * 4);  //是将a的前4个元素赋值给b;若需要全部赋值,则用memcpy(b, a, sizeof(a))
	for(int i = 0; i<5; i++)
		printf("%d ",a[i]);
	printf("\n");
	for(int i = 0; i<5; i++)
		printf("%d ",b[i]);
	return 0;
}
程序3.2 开灯问题(编号为1~n的n盏灯,刚开始灯全部关闭,第1个人将按下所有的灯,第2个人按下编号为2的倍数的灯,第3个人按下编号为3的倍数的灯……一共有k个人,问最后哪些灯是开着的)
算法分析:先用一个数组a[maxn],其中a[1],a[2],……a[n]分别表示1~n的灯是否开着,最初给数组全部初始化为0,之后当有人按下灯后,令a[i] = !a[i](之后a[i]为0或者1),最后根据if(a[i])来判断输出。
#include<stdio.h>
#include <string.h>
#define maxn 1010
int a[maxn];
int main()
{
	int n, k;
	memset(a, 0, sizeof(a));
	scanf("%d%d", &n, &k);
	for(int i = 1; i <= k; i++){
		for(int j = i; j <= n; j+=i){  //for(int j = 1; j <= n; j++) if(j %i == 0) a[j] = !a[j];
			a[j] = !a[j];
		}
	}
	int first = 1;
	for(int i = 1; i <= n; i++){
		if(a[i]) 
		{ 
			if(first) { printf("%d", i); first = 0; }
			else printf(" %d", i);
		}
	}
	printf("\n");
	return 0;
}
蛇形填数:(在n*n方阵中填入1,2,……,n*n,要求填成蛇形,起点是在右上角(1, n)处)
算法分析:用一个int a[maxn][maxn]生成一个整型的二维数组并初始化为0,“笔”的轨迹是下,左,上,右的循环,朝一个方向走,直到遇到边界(大于n或者小于1或者已经被赋值的点)时停止走,走的同时给数组赋值。直至走到第n*n步。。。
#include <stdio.h>
#include <string.h>
#define maxn 20
int a[maxn][maxn];
int main()
{
	memset(a, 0, sizeof(a));
	int n;
	scanf("%d", &n);
	a[1][n] = 1;
	int x = 1, y = n, count = 1;
	while(count < n*n){
		while(x+1 <= n && !a[x+1][y]) a[++x][y] = ++count;  //不断往下走,并且填数,先判断,再移动,而不应该走完之后再退回来,对于a[x][y]而言往下走的元素为a[x+1][y],判断为0后再对a[++x][y]赋值
		while(y-1 >= 1 && !a[x][y-1]) a[x][--y] = ++count;
		while(x-1 >= 1 && !a[x-1][y]) a[--x][y] = ++count;
		while(y+1 <= n && !a[x][y+1]) a[x][++y] = ++count;
	}
	for(x = 1; x <= n; x++){
		for(y = 1; y <= n; y++){
			printf("%5d", a[x][y]);
		}
		printf("\n");
	}
	return 0;
}

3.2 字符数组

竖式问题(输入数字集合,找出所有形如abc*de的算式,使得其对应完整的竖式内,所有数字都属于此数字集合,输出所有竖式,要求竖式前带有序号,之后有个空行,并输出解的总数)
算法分析:用字符串形式输入数字集合方便后续查找,尝试所有的abc和de,判断是否满足条件,可先将abc,de,abc*d,abc*e以及abc*de用sprintf放入一个字符串中,再对此字符串的每个字符用strchr进行查找,看是否全部位于数字集合类。
#include <stdio.h>
#include <string.h>
char set[20], buf[100];
int main()
{
	int kase = 0;
	scanf("%s", set);
	for(int abc = 100; abc <= 999; abc++){
		for(int de = 10; de <= 99; de++){
			int tmp1 = abc * (de/10), tmp2 = abc * (de%10), sum = abc * de;
			sprintf(buf, "%d%d%d%d%d", abc, de, tmp1, tmp2, sum);
			int tag = 1;
			for(int i = 0; buf[i]; ++i)
				if(strchr(set, buf[i]) == NULL) tag = 0;
			if(tag){
				printf("<%d>\n", ++kase);
				printf("%5d\nX%4d\n-----\n%5d\n%4d\n-----\n%5d\n\n", abc, de, tmp1, tmp2, sum);
			}
		}
	}
	printf("The number of solutions = %d\n", kase);
	return 0;
}
补充:在头文件<stdio.h>中,printf是输出到屏幕,sprintf是输出到字符串,fsprintf是输出到文件中,sprintf的用法如下:
#include <stdio.h>
int main()
{
	char *who = "I";
    char *whom = "CSDN";
	char s[99];
	sprintf(s, "%s love %s.", who, whom);
	printf("%s\n", s);                  //输出I love CSDN.
	sprintf(s, "%.3f", 3.141592654);
	printf("%s", s);                    //输出3.142
	return 0;
}
对于一维数组的scanf("%s", s);和二维数组中第i行的输入scanf("%s", s[i]);,和输入单个变量一样,遇到空白(空格,换行及退格)时读取输入,字符串本质是数组,可以用strcpy(a, b),strcmp(a, b),strcat(a, b)来进行操作。数组中需多预留1字节来保存字符串。”\"以及“"”都可以表示双引号。

3.3 竞赛题目选讲

例题3.1 Tex中的引号(将普通文本的双引号格式" "变为Tex格式的双引号格式`` ’’)
例题3.2 WERTYU (将手放在键盘上,稍不注意就会往右错一位,如想输入Q就会变成输入W等,要求将错误的输入还原成正确的输入)
例题3.3 回文词
例题3.4 猜数字游戏的提示

3.4 注解与习题





























版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

第3章 C# 程序的流程控制

第3章 C 程序的流程控制 1 C 程序的分支语句 11 if语句 12 多分支ifelse语句 13 switch语句 14 分支语句的嵌套 2 C 程序的循环语句 21 while语句 22 do...

PHP - Smarty模板引擎 - 翻译 - Manual手册 - Chapter 3. Basic Syntax第3章 基础语法 - Comments注释

PHP - Smarty模板引擎 - 翻译 - Manual手册 - Chapter 3. Basic Syntax第3章 基础语法 - Comments注释 Comments 注释 Template comments are surrounded by asterisks, a...

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

第3章 数组和字符串

第3章 数组和字符串 学习要求和笔记: √  掌握for循环的使用方法 √  掌握while和do-while循环的使用方法 √  学会使用计数器和累加器 ...

[How Tomcat Works]第4章 Tomcat默认连接器

[How Tomcat Works]第4章 Tomcat默认连接器 2010年06月29日   第3 章的连接器工作得很好,而且本可以设计地更好。但是,我们只是将它设计成教学工具,来介绍Tomcat 4 的默认连接器。理解第3 章的连接器,是理解Tomcat 4 默认连 接器的关键。第4 章将...

紫书第3章 数组和字符串

刘汝佳《算法竞赛入门经典(第2版)》第3章数组和字符串中,所有UVa习题的题解汇总。
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)