小结
困难——指针数组 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道题
这道题我已经做了很多遍了.