困难——排序和查找算法~~日期转换

小结

困难——指针数组 1道题
困难——字符指针作函数参数 0道题
困难——动态数组 0道题
困难——改错题+趣味题+字符串+综合 没有写在这儿
困难——排序和查找算法 0道题
困难——穷举与递推 4道题
困难——矩阵运算 5道题
困难——二维数组处理 1道题
困难——数值计算 2道题
困难——分类统计 2道题
困难——累加累乘 1道题
困难——输出图形 2道题
困难——最值计算 3道题
困难——数组 2道题
困难——日期转换 1道题

困难——指针数组

在这里插入图片描述

#include  <stdio.h>
#define   MAX_LEN  10
#define   N         150
#include <stdlib.h>
void SortString(char *ptr[], int n); // 必须使用指针数组!!! 这时指针数组啊, 先与[]结合. 
main()
{
    int    i, n;
    char   *pStr[N];
    printf("How many countries?\n");
    scanf("%d",&n);
    char ch = getchar(); // 处理\n, 题干又没有给清楚. 
    printf("Input their names:\n");
    for (i=0; i<n; i++)
    {
    	pStr[i] = (char*) malloc(10*sizeof(char));
    	//char ch = getchar(); // 这儿为什么又不需要了呢? 反正记住scanf与gets有个细节. 
        gets(pStr[i]); // 没分配空间啊
    }
    SortString(pStr, n);
    printf("Sorted results:\n");
    for (i=0; i<n; i++)
    {
        puts(pStr[i]);
        free(pStr[i]);  // free 
    }
}
 
void SortString(char *ptr[], int n)
{
    int    i, j;
    char  *temp;
    for (i=0; i<n-1; i++)
    {
        for (j = i+1; j<n; j++)
        {
            if (strcmp(ptr[j], ptr[i]) < 0) // 索引排序 
            {
                temp = ptr[j];
                ptr[j] = ptr[i];
                ptr[i] = temp;
            }
        }
    }
}

困难——字符指针作函数参数 0道题

困难——动态数组 0道题

困难——改错题+趣味题+字符串+综合 没有写在这儿.

困难——排序和查找算法 0道题

困难——穷举与递推 4道题

在这里插入图片描述

// 我这样已经处理了输入问题了, 但不知道为什么还是过不了.
#include<stdio.h>
int f(int n)
{
	int i;
	int res = 1;
	for(n--; n; n--)
	{
		res = (res+1) * 2;
	}
	return res;
}
/*
fflush(stdin)比如你写个程序只允许输入数字,然后就可以循环,
如果你这时输入了一个字符,这时一个字符就是非法得了,一直保留在缓存空间里,
如果不处理掉可能会照成死循环…这时你就可以用这个代码清除缓存。
*/ 
int main()
{
	int n;
	printf("Input days:\n");
	while(1)
	{
		if(scanf("%d", &n) == 0) 
		{
			fflush(stdin); 
		} 
		else if (n > 0) 
		{
			printf("x=%d", f(n));
			break;
		}
		printf("Input days:\n"); // 不习惯用do while 
	}
	return 0;
} 

在这里插入图片描述

#include<stdio.h>

int main()
{
	int total;
	scanf("%d", &total);
	int i, j, k, cnt = 0;
	for (i = 0; i <= 30; i ++)
	{
		for (j = 0; j <= 30; j ++)
		{
			for (k = 0; k <= 30; k ++)
			{
				if (i+j+k == 30 && i + 2*j + 5*k == total)
				{
					printf("%2d,%2d,%2d\n", i, j, k);
					cnt ++;
				}
			}
		}
	}
	printf("%d\n", cnt);
	return 0;
} 

在这里插入图片描述
在这里插入图片描述

//这种题好气啊, 题干描述不完整, 而且又不给个样例, 不给样例是这sse的通病.
//还要求不能填入重复数字: 你说这题干垃圾不垃圾.
//网上找了一个代码, 但感觉写的好凌乱, 于是自己用了个骚操作(用#define带参数).
//又重写一次, 这道这么无趣的题浪费了我近一个小时. 多么优雅的代码
#include<stdio.h>
#define f(a) for(a = 2; a <= 5; a++)
int main()
{
	printf("The possible table satisfied above conditions are:\n");
	int a[6], cnt = 0; 
	a[0] = 1; a[5] = 6;
	f(a[1])f(a[2])f(a[3])f(a[4]) // 懒得写4个循环 
	{
		if (a[1] < a[2] && a[3] < a[4] && a[1] < a[4] && a[1] * a[2] * a[3] * a[4] == 2 * 3 * 4 * 5) //巧妙构思. 
		{
			printf("\nNo.:%d", ++cnt);
			printf("\n%3d%3d%3d", a[0], a[1], a[2]);
			printf("\n%3d%3d%3d", a[3], a[4], a[5]);				
		} 
	}
	return 0;
} 

在这里插入图片描述

// 这道题题干描述得就很好.
#include<stdio.h>
#include<math.h>
/*
提示:当i超过30以后,2^i-1的值会很大,不能用long型变量来存储,必须使用double类型来存储。
对于double类型变量x(不是整型)不能执行求余运算,即不能用x%i == 0来判断x是否能被i整除,
可以使用x/i == (long long)(x/i)来判断x是否能被i整除。
*/ 
int IsPrime(double x)
{
	if (x < 2) return 0;
	int i;
	for (i = 2; i <= sqrt(x); i ++)
	{
		if (x/i == (long long)(x/i)) return 0;
	}
	return 1;
} 
int main()
{
	int n;
	printf("Input n:\n");
	scanf("%d", &n);
	int i, count = 0;
	double x = 0;
	for (i = 1; i <= n; i ++)
	{
		x = (x + 1) * 2 - 1;
		if(IsPrime(x)) 
		{
			printf("2^%d-1=%.0f\n", i, x);
			count ++;
		}
	}
	printf("count=%d\n", count);
	return 0;
} 

困难——矩阵运算 5道题(有2道相同)

在这里插入图片描述

// 这种有样例的题描述得多么清晰啊, md.
#include<stdio.h>
#include<math.h>
int main()
{
	int m, n, i, j, k, a[100][100];
	printf("\n输入行数:");
	scanf("%d", &m);
	printf("\n输入列数:");
	scanf("%d", &n);
	for (i = 0; i < m; i ++)
	{
		printf("第%d行?\n", i);
		for (j = 0; j < n; j ++)
		{
			scanf("%d", &a[i][j]);
		}
	}
	for (i = 0; i < m; i ++)
	{
		for (j = 0; j < n; j ++)
		{
			printf("%5d", a[i][j]);
		}
		printf("\n");
	}
	
	int cnt = 0;
	for (i = 0; i < m; i ++)
	{
		int posMax_j = 0;
		for (j = 0; j < n; j ++) 
		{
			if (a[i][j] > a[i][posMax_j]) posMax_j = j;
		}
		
		int posMin_i = 0;
		for (k = 0; k < m; k ++) 
		{
			if (a[k][posMax_j] < a[posMin_i][posMax_j]) posMin_i = k;
		}
		if (posMin_i == i) 
		{
			printf("\n第%d行,第%d列的%d是鞍点\n", posMin_i, posMax_j, a[posMin_i][posMax_j]);
			cnt ++;
		}
	}
	if (cnt == 0) printf("\n矩阵中无鞍点!\n");
	return 0;
} 
// 极其简单无聊的一题.
#include<stdio.h>
#include<math.h>
#define N 100
void Transpose(int a[][N], int n)
{
	int i, j;
	for (i = 0; i < n; i ++)
	{
		for (j = i; j < n; j ++)
		{
			int t = a[i][j];
			a[i][j] = a[j][i];
			a[j][i] = t;
		}
	}
}
void InputMatrix(int a[][N], int n)
{
	int i, j;
	for (i = 0; i < n; i ++)
	{
		for (j = 0; j < n; j ++)
		{
			scanf("%d", &a[i][j]);
		}
	}
}
void PrintMatrix(int a[][N], int n)
{
	int i, j;
	for (i = 0; i < n; i ++)
	{
		for (j = 0; j < n; j ++)
		{
			printf("%d\t", a[i][j]);
		}
		puts("");
	}
}
int main()
{
	int m, n, a[N][N];
	printf("Input n:\n");
	scanf("%d", &n);
	printf("Input %d*%d matrix:\n", n, n);
	InputMatrix(a, n);
	Transpose(a, n);	
	printf("The transposed matrix is:\n");
	PrintMatrix(a, n);
	return 0;
} 

在这里插入图片描述

// 没有通过, 但在自己编译器上过了. 估计是sse上面题干没描述清除, 有些输入提示信息没有给.
#include<stdio.h>
#include<math.h>
#define N 100
void f(int a[5][5])
{
	int i, j;
	int sum = 0, tsum = 0;
	for (i = 0; i < 5; i ++) sum += a[i][i], tsum += a[4-i][i];
	if(tsum != sum)
	{
		//printf("%d %d\n", tsum, sum);
		printf("It is not a magic square!\n");
		return ;
	}
	for (i = 0; i < 5; i ++)
	{
		tsum = 0;
		for (j = 0; j < 5; j ++)
		{
			tsum += a[i][j];
		}
		if(tsum != sum) 
		{
			//printf("%d %d\n", tsum, sum);
			printf("It is not a magic square!\n");
			return ;
		}
	}
	for (j = 0; j < 5; j ++)
	{
		tsum = 0;
		for (i = 0; i < 5; i ++)
		{
			tsum += a[i][j];
		}
		if(tsum != sum) 
		{
			//printf("%d %d\n", tsum, sum);
			printf("It is not a magic square!\n");
			return ;
		}
	}
	
	printf("It is a magic square!\n");
	for (i = 0; i < 5; i ++)
	{
		for (j = 0; j < 5; j ++)
		{
			printf("%4d", a[i][j]);
		}
		puts("");
	}
}
int main()
{
	int a[5][5];
	int i, j;
	for (i = 0; i < 5; i ++)
	{
		for (j = 0; j < 5; j ++)
		{
			scanf("%d", &a[i][j]);
		}
	}
	f(a);
	return 0;
} 

在这里插入图片描述

真的好烦这sse, 多半时间都用于处理输入输出了.

困难——二维数组处理 1道题

在这里插入图片描述

无聊题

困难——数值计算 2道题

在这里插入图片描述

#include<stdio.h>
#include<math.h>
#define N 100

int main()
{
	char ch;
	int res;
	scanf("%d", &res);
	while((ch = getchar()) != '=')
	{
		
		int t;
		scanf("%d", &t);
		
		switch(ch)
		{
			case'+':
				res += t;
				break;
			case'-':
				res -= t;
				break;
			case'*':
				res *= t;
				break;
			case'/':
				res /= t;
				break;
			default:
				printf("错误的运算符:%c\n", ch);
				return 0;
		}
	}
	printf("%d", res);
	
	return 0;
} 

在这里插入图片描述

#include<stdio.h>
#include<math.h>
int f(int n)
{
	if (n == 0 || n == 1) return 1;
	return n * f(n - 1);
}
void Func(int n)
{
	if (n < 0 || n > 10)
	{
		printf("Input error!\n");
		return ;
	}
	int i, sum = 0;
	for (i = 1; i <= n; i ++)
	{
		sum += f(i);
	}
	sum %= 1000000;
	printf("%d", sum);
}
int main()
{
	int n;
	printf("Input n:");
	scanf("%d", &n);
	Func(n);
	
	return 0;
} 

困难——分类统计 2道题

// 题干有些长. 完善代码.
// 题干描述的很清晰, 也给了运行样例, 就写的很舒服.
#include<stdio.h>
#define max 40

int fun(int score[], int m, int below_score[], int below_index[])
{
	int i, sum = 0, j = 0;
	for (i = 0; i < m; i ++) sum += score[i];
	sum /= m;
	for (i = 0; i < m; i ++)
	{
		if (score[i] < sum) 
		{
			below_score[j] = score[i];
			below_index[j++] = i;
		}
	}
	return j;
}
int ReadScore(int score[])
{
	int x, *p = score;
	while((scanf("%d", &x)) && x != -1)
	{
		*p++ = x; // <==> *p = x, p ++;
	}
	return p - score; // 巧妙. 
}
void main()
{
    int a[max], n = -1;
    int i;
    int below_score[max], below_index[max], below_n;
    n = ReadScore(a); 
    below_n = fun(a, n, below_score, below_index); 
    if (n == 0) 
    {
        printf("there are no valid scores\n");
        exit(0);
    }
    printf("the number of the class:%d\n", n);
    printf("the number under the average score: %d\n", below_n);
    for (i = 0; i < below_n; i++)
    {
        printf("the %dth score is: %d\n", below_index[i] + 1, below_score[i]);
    }
 }

在这里插入图片描述

// 虽然这些题很简单, 但我做题的目的是提高熟练度.
#include<stdio.h>
#define N 40

float aver(float score[],int n)
{
	int i;
	float sum = 0;
	for (i = 0; i < n; i ++)
	{
		sum += score[i];
	}
	sum /= n;
	int cnt = 0;
	for (i = 0; i < n; i ++)
	{
		if (score[i] > sum) cnt ++;
	}
	printf("Average score is %10.2f\n", sum);
	printf("The number of students in more than average %d\n", cnt);
}
int main()
{
	int n;
	float a[N];
	scanf("%d", &n);
	int i;
	for (i = 0; i < n; i ++)
		scanf("%f", &a[i]);
	aver(a, n);
	return 0;
}

困难——累加累乘 1道题

在这里插入图片描述

#include<stdio.h>
const double eps = 1e-4; 
int main()
{
	double sum = 0;
	int i, flag = 1;
	for (i = 1; 1; i ++)
	{
		sum += flag * 1.0 / i;
		flag = -flag;
		if(1.0 / i < eps) break;
	} 
	printf("sum = %f\n", sum);
	return 0;
}

困难——输出图形 2道题

在这里插入图片描述

// 这种题好无聊, 不知道有没有什么简便点的方法. 注意: i从1开始肯定比从0开始方便.
// 主要是难在计算空格字符, 思考后可以吧代码写得简洁一些. 但我就这样保持原样.
#include<stdio.h>

int main()
{
	int n;
	printf("Enter length:");
	scanf("%d", &n);
	int i, j, k;
	for (i = 1; i <= 2*n - 1; i ++)
	{
		int cnt1, cnt2, cnt3, cnt4;
		if (i == 1 || i == 2*n - 1)
		{
			cnt1 = n - 1;
			cnt2 = n;
			cnt3 = cnt4 = 0;
		}
		else if (i > 1 && i <= n)
		{
			cnt1 = n - i;
			cnt2 = 1;
			cnt3 = (n + 2 * (n - 1) - 2 - 2 * cnt1);
			cnt4 = 1; 
		}
		else if (i > n && i <= 2*n - 1)
		{
			int j = 2 * n - i;
			cnt1 = n - j;
			cnt2 = 1;
			cnt3 = (n + 2 * (n - 1) - 2 - 2 * cnt1);
			cnt4 = 1; 
		}
		for (j = 0; j < cnt1; j ++) printf("%c", ' ');
		for (j = 0; j < cnt2; j ++) printf("%c", '*');
		for (j = 0; j < cnt3; j ++) printf("%c", ' ');
		for (j = 0; j < cnt4; j ++) printf("%c", '*');
		printf("\n");
	}
	return 0;
}

在这里插入图片描述

#include<stdio.h>

int main()
{
	int n;
	printf("请输入树的层数:");
	scanf("%d", &n);
	int i, j, k;
	
	for (i = 1; i <= n; i ++)
	{
		int tline = i + 1;
		for (j = 1; j <= tline; j ++)
		{
			int cnt1, cnt2;
			cnt2 = 2 * j - 1; 
			cnt1 = (2 * (n + 1) - 1 - cnt2) / 2;
			for (k = 0; k < cnt1; k ++) printf("%c", ' ');
			for (k = 0; k < cnt2; k ++) printf("%c", '*');
			printf("\n");
		}
	} 
	for (k = 0; k < n; k ++) printf("%c", ' ');
	printf("|\n");
	for (k = 0; k < n; k ++) printf("%c", '=');
	printf("V");
	for (k = 0; k < n; k ++) printf("%c", '=');
	return 0;
}

困难——最值计算 3道题

在这里插入图片描述

#include<stdio.h>

void Input(int *p, int m, int n)
{
	int i, j;
	for (i = 0; i < m; i++)
	{
		for (j = 0; j < n; j ++)
		{
			scanf("%d", (p + i * n + j));
		}	
	}	
}

int FindMax(int *p, int m, int n, int *pRow, int *pCol)
{
	int i, j;
	int max = *p;
	*pRow = *pCol = 0;
	for (i = 0; i < m; i ++)
	{
		for (j = 0; j < n; j ++)
		{
			if (*(p + i * n + j) > max)
			{
				max = *(p + i * n + j);
				*pRow = i;
				*pCol = j;
			}
		}
	}
}

int main()
{
	int a[3][4], m = 3, n = 4, row, col;
	printf("Please input your data:\n");
	Input(&a[0][0], m, n);
	FindMax(&a[0][0], m, n, &row, &col);
	printf("The maximum is %d, which is in row %d, colum %d\n", a[row][col], row, col);
	return 0;
}

在这里插入图片描述

全是处理输入输出, 无不无聊?

在这里插入图片描述

#include<stdio.h>

void SwapMaxMin(int a[100], int n)
{
	int min, max, pmin, pmax;
	min = max = a[0];
	pmin = pmax = 0;
	int i;
	for (i = 0; i < n; i ++)
	{
		if (a[i] < min)
		{
			min = a[i];
			pmin = i;
		}
		if (a[i] > max)
		{
			max = a[i];
			pmax = i;
		}
	}
	int t = a[pmin];
	a[pmin] = a[pmax];
	a[pmax] = t;
}

int main()
{
	int n;
	printf("Input n(n<=10):");
	scanf("%d", &n);
	printf("Input %d numbers:", n);
	int i, a[100];
	for (i = 0; i < n; i ++) scanf("%d", &a[i]);
	SwapMaxMin(a, n);
	printf("Exchange results:");
	for (i = 0; i < n; i ++) printf("%5d", a[i]);
	return 0;
}

困难——数组 2道题

在这里插入图片描述

无聊, 写了一会发现一会儿int, 一会儿float的, 烦死了, 给爷爬.

在这里插入图片描述

不会写也不想写.

困难——日期转换 1道题

在这里插入图片描述

这道题我已经做了很多遍了.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值