习题
1.指针
1
int main()
{
char* a[] = { "work","at","alibaba" };
char** pa = a;
pa++;
printf("%s\n", *pa);
return 0;
}
int main()
{
char* c[] = { "ENTER","NEW","POINT","FIRST" };
char** cp[] = { c + 3,c + 2,c + 1,c };
char*** cpp = cp;
printf("%s\n", **++cpp);
printf("%s\n", *-- * ++cpp + 3);
printf("%s\n", *cpp[-2] + 3);
printf("%s\n", cpp[-1][-1] + 1);
return 0;
}
2.变种水仙花数
变种水仙花数 - Lily Number:把任意的数字,从中间拆分成两个数字,比如1461 可以拆分成(1和461)
(14和61),(146和1),如果所有拆分后的乘积之和等于自身,则是-Lily Number.
例如:655= 6* 55+ 65 * 5 求出 5位数中的所有 Lily Number.
输入描述:无 输出描述:一 行,5位数中的所有 Lily Number,每两个数之间间隔一个空格
由题意可得:三位数可查分成两组,四位数可拆分成三组,那么五位数即可拆分成四组;
#include<math.h>
int main()
{
int i = 0;
for (i = 10000; i <= 99999; i++)
{
int j = 0;
int sum = 0;
for (j = 1; j <= 4; j++)
{
int m = i / (int)pow(10, j);
int n = i % (int)pow(10, j);
sum += m * n;
}
if (sum == i)
{
printf("%d ", i);
}
}
return 0;
}
3.字符串左旋
实现一个函数,可以左旋字符串中的k个字符。
例如:abcd
左旋一个字符得到dcda
1.左旋1个字符:将第一个字符用tmp
接收,然后后面的字符按循序打印,然后再将tmp
放在最后。
左旋k个字符:循环k%len
次
#include<string.h>
void left_move(char arr[], int k)
{
int len = strlen(arr);
int j = 0;
for (j = 0; j < k % len; j++)
{
char tmp = arr[0];
int i = 0;
for (i = 0; i < len - 1; i++)
{
arr[i] = arr[i + 1];
}
arr[len - 1] = tmp;
}
}
int main()
{
int k = 0;
scanf("%d", &k);
char arr[20] = "abcdef";
left_move(arr, k);
printf("%s\n", arr);
return 0;
}
2.逆序思想:第一步,将要左旋的字符逆序;第二步,将不左旋的字符逆序;第三步,将整个字符串逆序。
#include<string.h>
reverse(char* left, char* right)
{
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
void left_move(char arr[], int k)
{
int len = strlen(arr);
k = k % len;
reverse(arr, arr + k - 1);
reverse(arr + k, arr + len - 1);
reverse(arr, arr + len - 1);
}
int main()
{
char arr[20] = "abcdef";
int k = 0;
scanf("%d", &k);
left_move(arr, k);
printf("%s\n", arr);
return 0;
}
4.杨氏矩阵
杨氏矩阵:矩阵的每行从左到右递增,每列从上到下递增
在这样的矩阵中查找某个数字是否存在。
因为每一行最后一个数是该行最大的数,如果这个数 < k,那就说明该行所有的数字都小于k,此时应该让下一行最后一个数去和k比较。
每一列最上面的数字是该列最小的数字,如果这个数字 > k,就说明该列所有的数都 > k,此时应该让上一列第一个数去和k比较。
void find_k(int arr[3][3], int k, int r, int c)
{
int x = 0;
int y = c - 1;
while (x<r &&y>=0)
{
if (arr[x][y] < k)
{
x++;
}
else if (arr[x][y] > k)
{
y--;
}
else
{
printf("找到了,下标是:%d %d\n",x,y);
return 0;
}
}
printf("找不到\n");
}
int main()
{
int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
int k = 5;
int x = 3;
int y = 3;
find_k(arr, k, x, y);
return 0;
}
void find_k(int arr[][4], int k, int* px, int* py)
{
int x = 0;
int y = *py - 1;
int flag = 0;
while (x < *px && y >= 0)
{
if (arr[x][y] < k)
{
x++;
}
else if (arr[x][y] > k)
{
y--;
}
else
{
*px = x;
*py = y;
return 0;
}
}
//找不到
*px = -1;
*py = -1;
}
int main()
{
int arr[2][4] = { 1,2,3,4,5,6,7,8, };
int k = 5;
int x = 2;
int y = 4;
find_k(arr, k, &x, &y);
if (x == -1 && y == -1)
{
printf("找不到\n");
}
else
{
printf("找到了,下标是:%d %d\n", x, y);
}
return 0;
}
5.打印空心三角形
//*
//* *
//* *
//* *
//* * * * *
多组输入
int main()
{
int n = 0;
int i = 0;
int j = 0;
while (scanf("%d", &n) == 1)
{
for (i = 0; i < n; i++)
{
for (j = 0; j <= i; j++)
{
if (i == j || j == 0 || i == n - 1)
{
printf("* ");
}
else
{
printf(" ");
}
}
printf("\n");
}
}
return 0;
}
6. X形图案
输入描述:多组输入,一个整数(2-20),表示输出的行数,也表示组成“X”的正斜线和反斜线的长度
输出描述:针对每行输入,输出用“*”组成的X形图形
int main()
{
int n = 0;
while (scanf("%d", &n) == 1)
{
int i = 0;
int j = 0;
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
if (i == j || i + j == n - 1)
{
printf("*");
}
else
printf(" ");
}
printf("\n");
}
}
return 0;
}
7.序列中删除指定数字
一个整数序列 (可能有重复的整数),现删除指定的某一个整数,输出删除指定数字之后的序列,序列
中未被删除数字的前后位置没有发生改变。
数据范围:序列长度和序列中的值都满足 1≤n≤ 50
输入描述:
第一行输入一个整数(1≤n≤ 50)。
第二行输入n个整数,输入用空格分隔的n个整数,
箪三行输入根要进行删除的一个整数。
输出描述:
输出为一行,删除指定数字之后的序列。
int main()
{
int n = 0;
scanf("%d", &n);
int arr[50] = { 0 };
int i = 0;
for (i = 0; i < n; i++)
{
scanf("%d ", &arr[i]);
}
int del = 0;
scanf("%d", &del);
i = 0;//遍历数组
int j = 0;//记录可以存档数据的当前位置
for (i = 0; i < n; i++)
{
if (arr[i] != del)
{
arr[j] = arr[i];
j++;
}
}
for (i = 0; i < j; i++)
{
printf("%d ", arr[i]);
}
return 0;
}