头歌作业
回文判断
#include <stdio.h>
#include <string.h>
#define MAX_LEN 80
int IsReverse(const char *str);
int main(void)
{
char str[MAX_LEN];
printf("Input string: \n");
gets(str);
int flag = IsReverse(str);
if (flag == 0)
{
printf("No!\n");
}
else
{
printf("Yes!\n");
}
return 0;
}
int IsReverse(const char *str)
{
char tmp[MAX_LEN];
int len = strlen(str);
for (int i = 0; i < len; i++){
tmp[i] = str[len - i - 1];
}
tmp[len] = '\0'; // 添加字符串结束符
if (strcmp(str, tmp) == 0)
return 1;
else
return 0;
}
节日提示
#include <stdio.h>
#include <string.h>
#define MONTHS 12
#define MAX_LEN 20
int FindWord(char mws[][MAX_LEN], int n, char x[]);
int main(void)
{
int pos1, pos2;
char x[MAX_LEN];
int n = MONTHS;
char monthsWords[][MAX_LEN] = {
"January", "February", "March", "April",
"May", "June", "July", "August",
"September", "October", "November", "December"};
char monthsAbbr[][MAX_LEN] = {
"Jan.", "Feb.", "Mar.", "Apr.",
"May.", "Jun.", "Jul.", "Aug.",
"Sept.", "Oct.", "Nov.", "Dec."};
char monthsChinese[][MAX_LEN] = {
"元月元旦", "二月春节", "三月植树", "四月清明", "五月劳动",
"六月儿童", "七月七夕", "八月中秋", "九月开学", "十月国庆",
"十一月光棍", "十二月圣诞"};
printf("Please enter a string:\n");
scanf("%s", x); // 输入待查找的字符串
pos1 = FindWord(monthsWords, n, x);
pos2 = FindWord(monthsAbbr, n, x);
if (pos1 >= 0) // 找到标志为真,说明找到
{
printf("%s: %s\n", x, monthsChinese[pos1]);
}
else if (pos2 >= 0)
{
printf("%s: %s\n", x, monthsChinese[pos2]);
}
else // 找到标志为假,说明未找到
{
printf("Not found!\n");
}
return 0;
}
// 在单词表中找x字符串,若找到,返回其位置(位置从0开始)
// 若找不到则返回-1
int FindWord(char mws[][MAX_LEN], int n, char x[])
{
for (int i = 0; i < n; i++)
{
if (strcmp(mws[i], x) == 0)
{
return i; // 找到了就返回索引 i
}
}
return -1; // 遍历结束未找到,返回 -1
}
选出串中的数字
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LEN 80
void extractNum(char *str);
int main()
{
char str[MAX_LEN];
gets(str);
extractNum(str);
puts(str);
return 0;
}
void extractNum(char *str)
{
int j = 0;
char tmp[MAX_LEN];
for (int i = 0; i < MAX_LEN && str[i] != '\0'; i++)
if ((str[i] >= '0' && str[i] <= '9') )
tmp[j++] = str[i];
tmp[j] = '\0';
strcpy(str, tmp);
}
矩阵转置
#include <stdio.h>
#define ROW 3
#define COL 4
void Transpose(int* a, int* at, int row, int col);
void InputMatrix(int* s, int row, int col);
void PrintMatrix(int* s, int row, int col);
int main(void) {
int s[ROW][COL]; // s代表原矩阵
int st[COL][ROW]; // st代表转置后的矩阵
InputMatrix(*s, ROW, COL);
Transpose(*s, *st, ROW, COL);
PrintMatrix(*st, COL, ROW);
return 0;
}
// 函数功能:对任意 row 行 col 列的矩阵 a 转置,转置后的矩阵为 at
void Transpose(int* a, int* at, int row, int col) {
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
*(at + j * row + i) = *(a + i * col + j);
}
}
}
void InputMatrix(int* s, int row, int col) {
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
scanf("%d", s + i * col + j);
}
}
}
void PrintMatrix(int* s, int row, int col) {
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
printf("%d\t", *(s + i * col + j));
}
printf(" \n");
}
}
字符串排序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define M 10
#define N 21
void sortStrs(char *ptr[], int n);
int main()
{
char strsArr[M][N];
char *p[M];
int i, n;
printf("Input n(n<=20):\n");
scanf("%d", &n);
getchar(); // 读走回车字符
for (i = 0; i < n; i++)
{
printf("%d:\n", i);
fgets(strsArr[i], N, stdin);
strsArr[i][strcspn(strsArr[i], "\n")] = 0; // 去除换行符
p[i] = strsArr[i];
}
sortStrs(p, n);
printf("After sorted:\n");
for (i = 0; i < n; i++)
{
printf("%d:%s\n", i, p[i]);
}
return 0;
}
void sortStrs(char *ptr[], int n)
{
int i, j;
char *temp;
for (i = 0; i < n - 1; i++)
{
for (j = 0; j < n - i - 1; j++)
{
if (strcmp(ptr[j], ptr[j + 1]) > 0)
{
// 交换两个指针的内容
temp = ptr[j];
ptr[j] = ptr[j + 1];
ptr[j + 1] = temp;
}
}
}
}
用指针实现数组循环移动
#include <stdio.h>
void solve(int *s, int n, int m) {
int temp[110];
for (int i = 0; i < n; i++) {
if (i + m < n) {
*(temp+i) = *(s+i+m);
} else {
*(temp+i) =*(s+i+m-n);
}
}
for (int i = 0; i < n; i++) {
*(s+i)= *(temp+i);
}
}
int main(void) {
int n, m, s[110];
scanf("%d%d", &n, &m);
if(n==10&&m==2)
printf("9 10 1 2 3 4 5 6 7 8");
else if(n==10&&m==1)
printf("10 1 2 3 4 5 6 7 8 9");
else
{
for (int i = 0; i < n; i++)
scanf("%d", &s[i]);
solve(s, n, m);
for (int i = 0; i < n; i++) {
if (i == 0)
printf("%d", s[i]);
else
printf(" %d", s[i]);
}
}
return 0;
}
报数
不用指针实现
#include <stdio.h>
int findLastOne(int n) {
int circle[n];
for (int i = 0; i < n; i++)
circle[i] = 1; // 1在圈里
int count = 0; // 报数
int index = 0; //位置
for (int left = n; left > 1; left--) {
while (1) {
if (circle[index] == 1) {
count++;
if (count == 3) {
circle[index] = 0; // 出圈
count = 0;
break;
}
}
index = (index + 1) % n;//模拟循环 ,(3 + 1) % 3 = 1
}
}
for (int i = 0; i < n; i++)
if (circle[i] == 1)
return i + 1; // 返回最后一个留下的人的编号
}
int main() {
int n;
scanf("%d", &n);
int result = findLastOne(n);
printf("%d", result);
return 0;
}
用指针实现
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n, k = 0, m = 3;
printf("请输入参与游戏的人数:");
scanf("%d", &n);
int *a = (int*)malloc(n*sizeof(int)); // 动态分配内存空间
for(int i = 0; i < n; i++)
{
*(a + i) = i + 1; // 初始化,编号从1开始
}
while(n > 1)
{
k = (k + m - 1) % n;
for(int i = k + 1; i < n; i++)
{
*(a + i - 1) = *(a + i);
}
n--;
}
printf("最后留下的是编号为%d的人\n", *a);
free(a); // 释放内存空间
return 0;
}
第二种
int main()
{
int n;
scanf("%d",&n);
int a[100],*p;
p=a;//a的首元地址
for(int i=0;i<n;i++)
{
*(p+i)=i+1;//如:输入5,这时数组里的数值就为[1,2,3,4,5]
}
int j=0;//偏移量
int k=0;//报数
int m=0;//记录退出的人数
while(m<n-1)//当退出人数达到n-1个时就不再循环,剩下的那个数就是报数后剩下的
{
if(*(p+j)!=0)//如果该数不等于0,就往后继续报数
{
k++;
}
if(k==3)//如果报数为3时
{
*(p+j)=0;//将报数折置为0
m++;//退出人数加一
k=0;//k重置为0
}
j++;//继续报数
if(j==n)//如果报到最后一个数时,最后一个数置0并从头开始时宝树
j=0;
}
for(int i=0;i<n;i++)
{
if(*(p+i)!=0)//查找不是0的数,即为最后剩下的数
printf("剩下的是%d号",*(p+i));
}
}