吉林大学2020程序基础设计mooc期末试题题解
前言
博主为吉林大学数据科学与大数据技术2020级新生,早就听闻csdn是技术爱好者
的平台。作为一名初次接触编程的新生,从csdn上受用匪浅~~其实是上课不听~~
在这个学期的末尾,同样希望为这个社区贡献一份力量。写出自己的第一份题解,
能力有限,还希望大家多多指教。
1.降序数(15分)
问题描述:编写程序,判断给定自然数n是否为降序数。降序数是指对于n=d1d2d3…dk,有:di>=di+1,i=1,2,…,k-1。例如:54321就是一个降序数。
输入:一个自然数n
输出:如果n是降序数,则输出YES,否则输出NO
样例:输入:543 输出:YES
/* 本题题主采用的方法是把整数以字符类型形式存入字符数组,通过比较数组中各元素的大小关系进行判断 */
# include <stdio.h>
# include <string.h> //别忘记加头文件
//用来装数字的字符数组
char c[105];
int main()
{
//字符数组的有效长度
int len;
//输入数字
gets(c);
//测数组的长度
len=strlen(c);
//判断是否是降序数的问题
int f=0;
for(int i=0;i<len-1;i++)
for(int j=i+1;j<len;j++)
if(c[i]<c[j]) f=1; //字符类型先转换成整数类型(根据ASCII码),再进行整数的比较
//输出
if(f) printf("NO");
else printf("YES");
return 0;
}
2.组合数计算(15分)
问题描述:编写程序计算从m个物体中选取n个物体所组成的组合数目(m>=n>0)。如果用f(m,n)表示这个组合数,这里可以得到一个分段函数的定义:
当m=n时,f(m,n)=1;
当n=1时,f(m,n)=m;
m<=0或n<=0或m<n时,f(m,n)=-1;
其他情况时,f(m,n)=f(m-1,n)+f(m-1,n-1);
输入:两个整数,中间以一个西文空格字符间隔,第一个为m的值,第二个是n的值。
输出:一个整数。
样例1:输入 -3 2 输出:-1
样例2:输入 2 -1 输出:-1
样例3:输入 4 1 输出:4
样例4:输入 5 5 输出:1
样例5:输入 5 2 输出:10
/这种递归问题,千篇一律老方法了, 照抄就行/
# include <stdio.h>
# include <string.h>
//定义递归函数
int f(int ,int );
int main()
{
int m,n;
scanf("%d%d",&m,&n);
printf("%d",f(m,n));
return 0;
}
int f(int m,int n) /*注意一定要加else*/
{
if(m==n) return 1;
else if(n==1) return m;
else if(m<=0||n<=0||m<n) return -1;
else return f(m-1,n)+f(m-1,n-1);
}
3.统计词频(20分)
问题描述:输入6个单词,查找第6个单词在前5个单词中出现的次数。
输入:6个单词
输出:一个整数(次数)
样例:输入 Mary Olivia Donald Olivia Linda Olivia 输出:2
# include <stdio.h>
# include <string.h>
//与第六个单词相同的单词总数
int ans;
//二维字符数组,用来装单词
char s[10][10];
int main()
{
for(int i=1;i<=6;i++) //将单词送入字符数组中
scanf("%s",s[i]);
char *p; //要进行比较的单词,题主用的指针进行记录
p=s[6];
for(int i=1;i<=5;i++) /*比较的过程,用到了string.h的strcmp函数,字符串相同时返回值为0*/
if(strcmp(p,s[i])==0)
ans++;
printf("%d",ans); //输出总数
return 0;
}
4.生成有序序列(20分)
问题描述:设整数集合 M 定义如下:1∈M;若x∈M , 则2x+1∈M , 3x+1∈M;没有别的整数属于集合 M。编程序按递增顺序生成并输出集合M的无重复的前n(n<50)项。
输入:一个整数n
输出:n个无重复的递增整数,整数之间以一个西文空格间隔。
样例1:输入3 输出1 3 4
样例2:输入 10 输出1 3 4 7 9 10 13 15 19 21
样例3:输入 15 输出 1 3 4 7 9 10 13 15 19 21 22 27 28 31 39
/这题题主用了一些自己的歪门邪道,用上了一部分二叉树的性质,大家看看就好/
# include <stdio.h>
# define size 1008611
//装数据的数组
int a[size];
//数组长度
int n;
//输出数据的有效长度
int k;
int main()
{
scanf("%d",&n);
int t1=2*2*2*2*2*2*2*2*2-1;
int t2=2*2*2*2*2*2*2*2*2*2-1;
a[1]=1;
for(int i=1;i<=t1;i++) //二叉树的运算
{
a[2*i]=2*a[i]+1;
a[2*i+1]=3*a[i]+1;
}
int f=1; //冒泡排序
int temp;
while(f)
{
f=0;
for(int i=1;i<=t2-1;i++)
if(a[i]>a[i+1])
{
temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;
f=1;
}
}
for(int i=t2;i>=2;i--)
for(int j=i-1;j>=1;j--)
{
if(a[i]==a[j])
a[i]=0;
}
printf("%d",a[1]); //输出数组
k=2;
for(int i=2;k<=n;i++)
if(a[i]!=0)
{
printf(" %d",a[i]); //输出有效值
k++;
}
return 0;
}
5.十六进制大整数加法(20分)
问题描述:编写程序,从键盘读入形如X + Y=的表达式计算结果,其中X和Y都是合法且长度不超过64位的十六进制非负整数,结果中所有字符均大写且无多余的零。
样例1:输入 1234+1234=输出0X2468
样例2:输入 0000+12A= 输出0X12A
样例3:输入 12ff+1= 输出 0X1300
# include <stdio.h>
# include <string.h>
//定义中间转换器
int temp;
//定义十六进制字符串长度
int len1,len2;
//两个转换成数的数组
int a[105],b[105];
//定义最长和最短
int mx,mn;
//输入字符串的原始字符数组
char s_1[105],s_2[105];
//用来交换的字符数组
char swap[105];
//用来装答案的字符数组
char ans[105];
//字符最长的数组和字符最短的数组
char max[105],min[105];
//转换字符为整数的函数
int swi(char );
//输出函数
void trans(int );
int main()
{
int h=1;
//把A输入进字符数组
char c;
c=getchar();
while(c!='+')
{
s_1[h++]=c;
c=getchar();
}
//初始化h
h=1;
//把B输入进字符数组
c=getchar();
while(c!='=')
{
s_2[h++]=c;
c=getchar();
}
//测长度
len1=strlen(s_1+1);
len2=strlen(s_2+1);
//进行比较,重新组织字符数组的数据
if(len1>len2)
{
mx=len1; mn=len2;
for(int i=1;i<=len1;i++) max[i]=s_1[i];
for(int i=1;i<=len2;i++) min[i]=s_2[i];
} else
{
mx=len2; mn=len1;
for(int i=1;i<=len2;i++) max[i]=s_2[i];
for(int i=1;i<=len1;i++) min[i]=s_1[i];
}
//将长度小的数组错位存储到swap数组中
for(int i=mx-mn+1,j=1;i<=mx;i++,j++)
swap[i]=min[j];
//将字符转换成整型,数值大的那个
for(int i=1;i<=mx;i++)
{
temp=swi(max[i]);
a[i]=temp;
}
//将字符转换成整形,数值小的那个
for(int i=mx-mn+1;i<=mx;i++)
{
temp=swi(swap[i]);
b[i]=temp;
}
//开始相加,并进位
for(int i=mx;i>=mx-mn+1;i--)
a[i]+=b[i];
for(int i=mx;i>=1;i--)
if(a[i]>=16)
{
a[i]-=16;
a[i-1]++;
}
//找到第一个不为0的数
int key=-1;
for(int i=0;i<=mx;i++)
if(a[i]!=0)
{
key=i;
break;
}
//分情况输出
if(key==-1) printf("0");
else
{
printf("0X");
for(int i=key;i<=mx;i++)
trans(a[i]);
}
return 0;
}
int swi(char x)
{
switch(x)
{
case '0': return 0;
case '1': return 1;
case '2': return 2;
case '3': return 3;
case '4': return 4;
case '5': return 5;
case '6': return 6;
case '7': return 7;
case '8': return 8;
case '9': return 9;
case 'A': return 10; case 'a': return 10; //注意大小写输入的情况哦
case 'B': return 11; case 'b': return 11;
case 'C': return 12; case 'c': return 12;
case 'D': return 13; case 'd': return 13;
case 'E': return 14; case 'e': return 14;
case 'F': return 15; case 'f': return 15;
}
}
void trans(int q)
{
if(q>=0&&q<=9) printf("%d",q); //小于9和大于9的情况要区分开
else
printf("%c",q+55);
}
写在最后
高山仰止,景行行止。虽不能至,心向往之。
技术无涯,人生有界。
愿每个人都能找到自己热爱的那份事业