- 数组只有在放在main函数外面时,才可以开得很大;放在main函数内时,数组稍大就会异常退出。
- 如果要从数组a复制k个元素到数组b,可以这样做:
memcpy(b,a,sizeof(int) * k)
- 如果数组a和b都是浮点型的,复制时要写成
memcpy(b,a,sizeof(double) * k)
- 使用memcpy函数要包含头文件string.h
- 如果需要把数组a全部复制到数组b中,可以写得简单一些:
memcpy(b,a,sizeof(a))
- 在很多情况下,最好是在做一件事之前检查是不是可以做,而不要做完再后悔。因为“悔棋”往往比较麻烦。
scanf("%s", s)
会读入一个不含空格、TAB和回车符的字符串,存入字符数组s。- 如果是字符串数组chars[maxn] [maxl],可以用“scanf(“%s”, s[i])”读取第i个字符串。
scanf("%s", s)
遇到空白字符会停下来。- %5d,它表示按照5位数打印,不足5位在前面补空格。
strchr
的作用是在一个字符串中查找单个字符。- printf输出到屏幕,fprintf输出到文件,而sprintf输出到字符串。sprintf应该保证写入的字符串有足够的空间。
- C语言的字符串是以空字符“\0”结尾的。
- 函数
strlen(s)
的作用是获取字符串s的实际长度。字符串中的各个字符依次是s[0], s[1],…, s[strlen(s)-1],而s[strlen(s)]正是结束标记“\0”。 - 由于字符串的本质是数组,它也不是“一等公民”,只能用
strcpy(a, b)
,strcmp(a, b)
,strcat(a, b)
来执行“赋值”、“比较”和“连接”操作,而不能用“=”、“==”、“<=”、“+”等运算符。上述函数都在string.h中声明。 - “\n”表示换行,“\\”表示反斜杠,“\””表示引号,“\0”表示空字符。
- 语句
printf("%d %o %x\n", a)
将把整数a分别按照十进制、八进制和十六进制输出。
程序3-2 开灯问题
有n盏灯,编号为1~n。第1个人把所有灯打开,第2个人按下所有编号为2的倍数的开关(这些灯将被关掉),第3个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),依此类推。一共有k个人,问最后有哪些灯开着?输入n和k,输出开着的灯的编号。k≤n≤1000。
样例输入:
7 3
样例输出:
1 5 6 7
#include<stdio.h>
#include<string.h>
#define maxn 1010
int a[maxn];
int main() {
int n, k;
memset(a, 0, sizeof(a));
while(scanf("%d%d", &n, &k)!=EOF) {
int first = 1;
for(int i=1;i<=k;i++) {
for(int j=1; j<=n; j++) {
if(j%i == 0) {
a[j] = !a[j];
}
}
}
for(int i = 1; i<=n; i++) {
if(a[i]) {
if(first) {
first = 0;
} else {
printf(" ");
}
printf("%d", i);
}
}
printf("\n");
}
return 0;
}
- memset(a,0,sizeof(a))的作用是把数组a清零,它也在string.h中定义。虽然也能用for循环完成相同的任务,但是用memset又方便又快捷。
- 为了避免输出多余空格,设置了一个标志变量first,可以表示当前要输出的变量是否为第一个。第一个变量前不应有空格,但其他变量都有。
程序3-3 蛇形填数
在n×n方阵里填入1,2,…,n×n,要求填成蛇形。n≤8。
#include<stdio.h>
#include<string.h>
#define maxn 20
int a[maxn][maxn];
int main() {
int n;
while(scanf("%d", &n) != EOF) {
int x, y, tot = 0;
memset(a, 0, sizeof(a));
tot = a[x=0][y=n-1] = 1;
while(tot < n*n) {
while(x+1<n && !a[x+1][y]) {
a[++x][y] = ++tot;
}
while(y-1>=0 && !a[x][y-1]) {
a[x][--y] = ++tot;
}
while(x-1>=0 && !a[x-1][y]) {
a[--x][y] = ++tot;
}
while(y+1<n && !a[x][y+1]) {
a[x][++y] = ++tot;
}
}
for(x = 0; x < n; x++) {
for(y=0; y < n; y++) {
printf("%3d", a[x][y]);
}
printf("\n");
}
}
return 0;
}
程序3-4 竖式问题
找出所有形如abc*de(三位数乘以两位数)的算式,使得在完整的竖式中,所有数字都属于一个特定的数字集合。输入数字集合(相邻数字之间没有空格),输出所有竖式。每个竖式前应有编号,之后应有一个空行。最后输出解的总数。
#include<stdio.h>
#include<string.h>
int main() {
int count = 0;
char s[20], buf[99];
scanf("%s", s);
for(int abc = 111; abc <=999; abc ++) {
for(int de = 11; de <=99; de++) {
int x = abc * (de%10);
int y = abc * (de/10);
int z = abc * de;
sprintf(buf, "%d%d%d%d%d",abc,de,x,y,z);
int ok = 1;
for(int i=0; i<strlen(buf); i++) {
if(strchr(s, buf[i]) == NULL) {
ok = 0;
}
}
if(ok) {
printf("<%d>\n", ++count);
printf("%5d\nX%4d\n-----\n%5d\n%4d\n-----\n%5d\n\n", abc, de, x, y, z);
}
}
}
printf("The number of solutions = %d\n", count);
return 0;
}
转载自:Meteor_0723