吉林大学2020程序基础设计mooc期末试题题解

吉林大学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);
}



写在最后

高山仰止,景行行止。虽不能至,心向往之。
技术无涯,人生有界。
愿每个人都能找到自己热爱的那份事业

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值