东华大学研究生计算机复试进阶题
1 Huffuman树



思路:先排序。每次找两个最小的数,把其中一个置为两数之和,并累加这个和值,另一个数置为-1,然后再排序,重复操作,直到只剩下一个数。
#include<stdio.h>
#define MAX_SIZE 105
void sort(int p[], int n);
int main() {
int n = 0;
int i = 0;
int fee = 0;// 费用
int p[MAX_SIZE];
scanf("%d", &n);
for (i = 0; i < n; i++)
scanf("%d", &p[i]);
sort(p, n);
while (n > 1) {
fee += (p[0] + p[1]);// 累加费用
p[1] = p[0] + p[1]; //p[1]变为两数之和
p[0] = p[n - 1];//变为最大的数,后面不将它进行排序
n--;//下次排序则少一位
sort(p, n);
}
printf("%d\n", fee);
return 0;
}
//排序
void sort(int p[], int n) {
int i = 0, j = 0;
int temp = 0;
for (i = n - 1; i > 0; i--) {
for (j = 0; j < i; j++) {
if (p[j] > p[j + 1]) {
temp = p[j];
p[j] = p[j + 1];
p[j + 1] = temp;
}
}
}
}
2 回文数



哎,这题有错,但没时间改了,快复试了,还剩90多道题没刷😭
#include<stdio.h>
int isHuiwen(int n)
{
int a[4];
int j;
int flag;
for(j=0;j<4;j++)
{
a[j]=n%10;
n=n/10;
}
if(a[0]==a[3] && a[1]==a[2])
{
flag=1;
}else{
flag=0;
}
return flag;
}
int main()
{
int i;
int n;
scanf("%d",&n);
for(i=n;i<=9999;i++)
{
if(isHuiwen(i))
{
printf("%d\n",i);
}
}
printf("\n");
return 0;
}
3 字母图形


思路:规律就是a[i][j]=abs(i-j)+‘A’

#include <cstdio>
#include <cstring>
#include<iostream>
using namespace std;
int main()
{
int n, m,cha;//n是行 m是列
while (cin>>n>>m)
{
char a[30][30];
memset(a, 0, sizeof(a));
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
cha = abs(i - j);
for (int k = 0; k < 26; k++)//cha必须属于26字母
{
if (k == cha)
{
a[i][j] = cha + 'A';
//'A'+相应的数字就等于A后面的字母
}
}
}
}
for (int i = 1; i <=n ; i++)
{
for (int j = 1; j <= m; j++)
{
cout << a[i][j];
}
cout << endl;
}
}
return 0;
}
4 大阶乘计算

5 回形取数


思路:按照下,右,上,左的顺序依次输出,我写的代码里末尾有一个空格,导致输出结果不正确,剩下的由你改咯
#include<iostream>
using namespace std;
int a[200][200];
int m, n;
int main()
{
cin >> m >> n;
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
cin >> a[i][j];
}
}
int i=0, j=0, k=0, l=0;
int sum = m * n;
while (sum)
{
/*向下走*/
for (; i < m && a[i][j] != -1; i++)
{
cout << a[i][j] << " ";
a[i][j] = -1;
sum--;
}
if(i>0)//此时i=m,需要减1
i--;
if(j<n-1&&j>=0) //此时j要往右移一个
j++;
/*向右走*/
for (; j < n && a[i][j] != -1; j++)
{
cout << a[i][j] << " ";
a[i][j] = -1;
sum--;
}
if(j>0)
j--;
if(i>1&&i<m)
i--;
/*向上走*/
while (i>=0 && a[i][j] != -1)
{
cout << a[i][j] << " ";
sum--;
a[i][j] = -1;
i--;
}
if (i == -1)
i++;
if (j > 1 && j < n)
j--;
/*向左走*/
while (j >= 0 && a[i][j] != -1)
{
cout << a[i][j] << " ";
sum--;
a[i][j] = -1;
j--;
}
if(j<n-1)
j++;
if (i >= 0 && i < n - 1)
i++;
}
return 0;
}
7 Sine之舞

#include<stdio.h>
/*这一题应该考察的是用递归的方式解决问题,但我搞不定这种,靠的就是观察公式规律,拆分部分打印*/
void An_output(int n){
//打印式子An
if(n==1)printf("sin(1)");
else{
printf("sin(1");
int i;
for(i=2;i<=n;i++){
if(i%2==0)printf("+sin(%d",i);
else printf("-sin(%d",i);
}
for(i=0;i<n;i++)printf(")");
}
}
void Sn_output(int n){
//已知An后,打印输出Sn
if(n==1){
An_output(1);
printf("+1");
}
else{
int i;
for(i=0;i<n-1;i++)printf("(");
for(i=1;i<=n-1;i++){
An_output(i);
printf("+%d)",n-i+1);
}
An_output(n);
printf("+1");
}
}
int main(){
int n;
scanf("%d",&n);
Sn_output(n);
return 0;
}
8 矩形面积交


思路:判断第二个矩形有没有点a在第一个矩形范围内(某个点a的横坐标大于第一个矩形横坐标较小的点小于横坐标较大的点,并且a的纵坐标同样满足要求,那么点a在第一个矩形范围内),若有,则求出相交范围的长和宽即可(长:第一个矩形横坐标的较大者减去a点的横坐标;宽:按照求长同样的方法求得)
#include<stdio.h>
#include<math.h>
void swap(double *a, double *b);
double max(double a, double b);
double min(double a, double b);
int main() {
double area = 0;// 相交的面积
double x11 = 0, y11 = 0, x12 = 0, y12 = 0;// 第一个矩形
double x21 = 0, y21 = 0, x22 = 0, y22 = 0;// 第二个矩形
double x1 = 0, y1 = 0, x2 = 0, y2

这篇文章包含一系列编程题目,涉及到数据压缩的Huffman树、判断回文数的方法、矩阵乘法的模拟、字符串大小写不敏感对比以及时间的转换。这些题目涵盖排序、递归、动态规划和字符串处理等多种算法和技术。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



