c++基础练习题(字符判断、简单约瑟夫环、三角形类型、大整数相加、二进制加法、字符串中的数字、子串问题等)

目录

1.字符判断(switch语句)

2.简单约瑟夫环问题(循环)

3.三角形类型(if语句)

4.【问题描述】实现一个简单的菜单程序,运行时显示:“Menu:A(dd) D(elete) S(ort) Q(uit),Select one:”提示用户输入。A表示增加;D表示删除,S表示排序,Q表示退出。输入为A、D、S时分别提示“数据已经增加、删除、排序。”,输入为Q时程序结束。循环结构和选择结构套用。其中,选择结构要求用switch语句完成。【输入形式】单个字符【输出形式】字符对应的操作结果【样例输入】

5.m!+n!之和(while)

6.数的分解(if语句)

8.子串问题(函数、字符串、指针)

9.字符串中的数字(字符串、循环)

10.大整数相加(字符串、数组、循环)

11两个单链表的合并

12链表的插入排序

13.二进制加法

14.约数的个数


1.字符判断(switch语句)

【问题描述】从键盘任意输入一个字符,编程判断该字符是数字字符、大写字符、小写字符、空格还是其他字符。请用switch语句实现。

【输入形式】一个字符

【输出形式】是哪种类型的字符

【样例输入】A

【样例输出】Uppercase Letter

【样例说明】输出时,用Digit、Uppercase Letter、Lowercase Letter、Blank Space、Others分别代表数字字符、大写字符、小写字符、空格、其他字符

【注意】如果用char ch; cin>>ch; 是无法准确判断空格字符的。请换用其他的输入方式,例如scanf或getchar或cin.get等

【提示】如果输入 + - (  ) 中的任意一个,请试一试你的答案是否正确吧

#include <iostream>
#include<bits/stdc++.h>
using namespace std;

int main()
{
    char ch;
   ch=getchar();
   if(ch>='A'&& ch<='Z')cout<<"Uppercase Letter"<<endl;
   else if(ch>='a'&&ch<='z')cout<<"Lowercase Letter"<<endl;
   else if(ch>='0'&&ch<='9')cout<<"Digit"<<endl;
   else if(ch>=' ')cout<<"Blank Space"<<endl;
   else
    cout<<"Others"<<endl;

   return 0;
}

2.简单约瑟夫环问题(循环)

【问题描述】有n个人围成一圈,按顺序从1到n编号。从第1个人开始报数,报数3的人退出圈子,下一个人从1开始重新报数,报数3的人退出圈子。如此循环,直到留下最后一个人。问留下来的人的编号。

【输入形式】考虑如下两种情况:

(1)如果n超出"n must be a natural number less than 10000",则打印"n is out of range of valid values.",其中n应该用如上输入的具体的n数值代替。

(2)如果n是有效范围的数值,则打印"Last No. is:",然后直接在冒号后面输出最后留下来的人的编号。

【运行时的输入输出样例1】(下划线部分表示输入)

Input n(n must be a natural number less than 10000):5

Last No. is:4

【运行时的输入输出样例2】(下划线部分表示输入)

Input n(n must be a natural number less than 10000):100000

100000 is out of range of valid values.

【测试数据】一共9组测试数据:1,2,3,10,0,90,10000,10001,-1,其中0,-1,10001都不是有效范围的值。

【注意】目前还未学习数组,请大家用迭代法实现

#include <iostream>
#include<bits/stdc++.h>
using namespace std;

//用队列进行解决比较方便,
//1初始时把所有元素都放到队列
//2.队头前两个元素放到队尾,把队头出栈
//3.重复步骤2,直到队列只剩一个元素


queue<int> Q;
void func(int n){
   for(int i=1;i<=n;i++){
     Q.push(i);
   }
   while(!Q.empty()){
   for(int i=0;i<=2;i++)
   {
       Q.push(Q.front());//将队首元素放到队尾去
       Q.pop();
   }
   cout<<Q.front()<<" ";
   Q.pop();
}
}

int main()
{
    int n;
    cin>>n;
    if(n>=1&&n<=10000)func(n);
    else cout<<n<<"is out of range of valid values."<<endl;

   return 0;
}

3.三角形类型(if语句)

【问题描述】根据输入的三角形的三边判断该三角形的类型:等边三角形、等腰三角形;直角三角形、锐角三角形和钝角三角形。

【输入形式】三角形的三条边

【输出形式】三角形的类型。注意:若不能构成三角形,请输出“ERROR”。等边、等腰、直角、锐角、钝角三角形分别输出:Equilateral Triangle,Isosceles Triangle,Right Triangle,Acute Triangle,Obtuse Triangle。 

【样例输入】3 3 4

【样例输出】

Isosceles Triangle
Acute Triangle

下面的三角形逻辑判断还有点问题。感兴趣的可以具体进行改写

#include <iostream>
#include<bits/stdc++.h>
using namespace std;


int main()
{
    int a,b,c;
    cin>>a;
    cin>>b;
    if(a>b)swap(a,b);
    cin>>c;
    if(c<b)swap(b,c);
    if(b<a) swap(a,b);
    cout<<a<<" "<<b<<" "<<c<<endl;
    //经过上面的步骤
    if(a+b>c){

    if(a==b==c){
        cout<<"Equilateral Triangle"<<endl;
    }
    if(a==b&&a!=c)cout<<"Isosceles Triangle"<<endl;
    if(a*a+b*b==c*c )
        cout<<"Right Triangle"<<endl;
    if(a*a+b*b<c*c)//较短的两边的平方和《较长的平方和,则为锐角三角形
        cout<<"Acute Triangle"<<endl;
    if(a*a+b*b>c*c)
        cout<<"Obtuse Triangle"<<endl;

    }

   return 0;
}

4.【问题描述】实现一个简单的菜单程序,运行时显示:“Menu:A(dd) D(elete) S(ort) Q(uit),Select one:”提示用户输入。A表示增加;D表示删除,S表示排序,Q表示退出。输入为A、D、S时分别提示“数据已经增加、删除、排序。”,输入为Q时程序结束。循环结构和选择结构套用。其中,选择结构要求用switch语句完成。
【输入形式】单个字符
【输出形式】字符对应的操作结果
【样例输入】

Q
【样例输出】
Menu: A(dd) D(elete) S(ort) Q(uit),Select one:
Added.
Menu: A(dd) D(elete) S(ort) Q(uit),Select one:
Quit.

#include <iostream>
#include<bits/stdc++.h>
using namespace std;


int main()
{
   char ch;
   cout<<"Menu:A(dd) D(elete) S(ort) Q(uit),Select one:"<<endl;
   ch=getchar();
   switch (ch){
       case 'A':cout<<"Add"<<endl;break;
       case 'D':cout<<"Delete"<<endl;break;
       case 'S':cout<<"Sort"<<endl;break;
       case 'Q':cout<<"Quit"<<endl;break;

   }
   return 0;
}

5.m!+n!之和(while)

【问题描述】输入2 个正整数m 和n,计算m!+n!。

【输入形式】从键盘输入正整数m和正整数n。

【输入输出样例1】(下划线部分表示输入)

Enter m: 3

Enter n: 8

3!+8!=40326

【样例说明】

输入提示符后要加一个空格。其中冒号后要加一个且只能一个空格。

输出语句的加号和等号两边无空格。

英文字母区分大小写。必须严格按样例输入输出。

#include <iostream>
#include<bits/stdc++.h>
using namespace std;

//计算n的阶乘

//这里用的是递归,如果时间有限制的话,就用数组正向来计算。
long int fun(int n)
{
    if(n==0||n==1)return 1;
    return n*fun(n-1);
}

int main()
{
   long int m,n;
   cout<<"Enter m: ";
   cin>>m;
   cout<<"Enter n: ";
   cin>>n;
   cout<<m<<"!+"<<n<<"!="<<fun(m)+fun(n);
   return 0;
}

#include <iostream>
#include<bits/stdc++.h>
using namespace std;

//这里用的方法是用字符串
//当然应该要用整数求余数的方法
int main()
{
   string n;
   cin>>n;
   int len=n.length();
   for(int i=0;i<len;i++)
   {
       cout<<n[i]<<" ";

   }
   cout<<endl;
   cout<<len<<endl;

}

6.数的分解(if语句)

【问题描述】给一个不多于5位的正整数,要求:分别打印出每一位数字,并求出它是几位数。

【输入形式】输入一个不多于5 位的正整数。

【输出形式】从高位到低位输出各位的数字,再输出总的位数。

【样例输入】6408

【样例输出】

6 4 0 8

4

【样例说明】有可能是1位数,也有可能是5位数哦~,比如25478

【评分标准】5组测试数据,全对则得分。请注意每个数字之间有空格,总位数在第二行显示。

#include <iostream>
#include<bits/stdc++.h>
using namespace std;


int main()
{
   string n;
   cin>>n;
   int len=n.length();
   for(int i=0;i<len;i++)
   {
       cout<<n[i]<<" ";

   }
   cout<<endl;
   cout<<len<<endl;

}

 7.求字符串s的任意子串。(字符数组参数)

编写一个函数,用来求字符串s的任意子串。函数原型为

void  SubString ( char  s[ ] , int  start , int  len , char  d[ ] ) ;

其中s是原字符串,d用来存放s中从第start个字符开始( 1≤start≤strlen(s) ),长度为len的子串。以下是完成此项工作的程序,请在计算机上调试程序以补足其中的空格。

#include <iostream>
#include<bits/stdc++.h>
using namespace std;

//下面的代码自己简单写的
void SubString(char s[],int start,int len,char d[])
{
    int j=0;
    for(int i=start;i<start+len;i++)
    {
        d[j]=s[i];
        cout<<d[j];
        j++;
    }
}

int main()
{
   char s[30]="Yang MingXiang";
   char d[30];
   SubString(s,5,9,d);
   return 0;

}

8.子串问题(函数、字符串、指针)

【问题描述】

请编写函数统计子串Substr在母串Str中出现的次数。函数原型如下,返回值为出现的次数:

int Count(char *Str, char *Substr);

【样例说明】第一行为母串、第二行为子串

【样例输入】出现的次数

abcbcbc

bcb
【样例输出】

2

#include <iostream>
#include <bits/stdc++.h>
using namespace std;

int Count(char *Str,char *Substr)
{
    int len1,len2,cnt=0;
    len1=strlen(Str);
    len2=strlen(Substr);
    int i,j,k;
    for(i=0;i<=len1-len2;i++)
    {
        for(j=0,k=i;j<len2&&Str[k]==Substr[j];j++,k++);
        if(j==len2)cnt++;
    }

 return cnt;
}

int main()
{
//char *Str="abcbcbcb";//len1=7
    //char *Substr="bcb";//len2=3
    char Str[30];
    char Substr[30];
    gets(Str);
    gets(Substr);
    cout<<Count(Str,Substr);
    return 0;
}

9.字符串中的数字(字符串、循环)

【问题描述】输入一个字符串,有数字内和非数字字符。如:a123x456 17960?302tab5876,将其中连续的数字作为一个整数,依次存放到一个数组a中。例如,123存放在a[0],456存放在a[1]......统计共有多少个整数,并输出这些整数。输入串中含有空格,可以用cin.getline(str,30,'\n')接收串,其中str是char str[50]。

【样例输入】

a123x456 17960?302tab5876

【样例输出】

5

123 456 17960 302 5876

#include <iostream>
#include<bits/stdc++.h>
using namespace std;


void func(string s)
{
    int flag;//0表示当前不是数字
    int len=s.length();
    string nums[100];
    int cnt=0;
    for(int i=0;i<len;)
    {
        if(s[i]>='0'&&s[i]<='9')
        {
            while(s[i]>='0'&&s[i]<='9')
            {
                nums[cnt]+=s[i];
                i++;
            }
            cnt++;
        }
        i++;
    }
    cout<<cnt<<endl;
    for(int i=0;i<cnt;i++)
    {
        cout<<nums[i]<<" ";
    }
}

int main()
{
    string s;
    getline(cin,s);//注意有空格时要用getline
    func(s);
    return 0;

}

10.大整数相加(字符串、数组、循环)

【问题描述】请编程实现超长位数的大整数的加法运算。
【提示】

定义字符数组接收待相加的两个超长位数的大整数,然后进行单个字符与字符之间的相加,举例如下:

char x[1000],y[1000];  int sum, carry;

sum=carry+x[i]-'0'+y[i]-'0';    

其中carry代表进位。

亦可使用结构体实现。

下面是用结构体的,有的实例不对,不知道哪里出问题l,希望大佬帮看下

#include <bits/stdc++.h>
using namespace std;

struct bigInt{
   int d[1000];
   int len;
};
bigInt change(char str[])
{
    bigInt bI;
    bI.len=strlen(str);
    for(int i=0;i<1000;++i)bI.d[i]=0;
    for(int i=0;i<bI.len;++i)
        bI.d[i]=str[bI.len-i-1]-'0';
    return bI;
}

//大整数加法
bigInt add(bigInt a,bigInt b)
{
    bigInt c;
    c.len=0;
    int carry=0;
    for(int i=0;i<a.len||i<b.len;++i)
    {
        int temp=a.d[i]+b.d[i]+carry;
        c.d[c.len]=temp%10;
        c.len++;
        carry=temp/10;
    }
    if(carry!=0)
    {
        c.d[c.len]=carry;
        c.len++;
    }
    return c;
}

//大整数减法
bigInt Sub(bigInt a,bigInt b)
{
    bigInt c;
    c.len=0;
    for(int i=0;i<a.len||i<b.len;++i)
    {
        if(a.d[i]<b.d[i])
        {
            a.d[i+1]--;
            a.d[i]+=10;
        }
        c.d[c.len]=a.d[i]-b.d[i];
        c.len++;
    }
    while(c.len-1>=1&& c.d[c.len-1]==0)
        c.len--;//除去高位的0 ,且至少保留一位0
    return c;
}

int main() {

    char str_a[1000],str_b[1000];
    gets(str_a);
    gets(str_b);
    bigInt a=change(str_a);
    bigInt b=change(str_b);
    bigInt c=Sub(a,b);
    bigInt e=add(a,b);
    cout<<"a-b= ";
    for(int i=0;i<c.len;i++)
        cout<<c.d[i];
    cout<<endl;
    cout<<"a+b= ";
    for(int i=e.len-1;i>=0;i--)
        cout<<e.d[i];
    cout<<endl;
}

下面使用string的方法,直接将大整数存为字符串,将字符串翻转进行相加。AC

#include <iostream>
#include<bits/stdc++.h>
using namespace std;


//翻转

void func(string a,string b)
{
  int len_a=a.length(),len_b=b.length();
  string result="";
  int carry=0;//向高位的进位,一定要弄初值,开始没弄初值做好久没有结果
  if(len_a>len_b)
  {
      swap(len_a,len_b);
      swap(a,b);//保证a中放的短的string
  }
  reverse(a.begin(),a.end());
  reverse(b.begin(),b.end());
  int sum;
  for( int i=0;i<len_a;i++)
  {

      int a_=a[i]-'0';//有时多定义几个变量,可以让结果简便,不然表达式太复杂,本题还需注意是字符还是字符串。
      int b_=b[i]-'0';
      sum=a_+b_+carry;
      result+=(sum%10+'0');
      carry=sum/10;


  }
  for( int i=len_a;i<len_b;i++)
  {
      sum=b[i]-'0'+carry;
      result+=(sum%10+'0');
      carry=sum/10;
  }
  if(carry==1)result=result+'1';
  reverse(result.begin(),result.end());
  cout<<result;

}

int main()
{
    string a,b;
    cin>>a>>b;//注意有空格时要用getline
    func(a,b);
    return 0;

}

11.

11两个单链表的合并

【问题描述】定义两个同种单向链表(结点中包含一个整型数和一个指向本结点类型的指针),两个链表中的数据都已经从小到大排好序了,请编制程序,合并这两个有序链表。

【输入形式】两个链表的数据,以0作为输入结束

【输出形式】合并后的数据,重复的数据请删除。

【样例输入】

1 3 5 7 9 0

1 2 3 4 5 5 8 12 0
【样例输出】

1 2 3 4 5 7 8 9 12

6.

12链表的插入排序

【问题描述】建立一个5结点的单向链表,每个结点包括:学号、姓名、性别、年龄。对其进行排序,采用插入排序法,按学号从小到大进行排列。
【输入形式】学生信息
【输出形式】排序后的信息
【样例输入】

1004 zhang f 18

1002 wang m 19

1003 zheng f 19

1001 wu m 20

1005 deng m 19
【样例输出】

1001 wu m 20

1002 wang m 19

1003 zheng f 19

1004 zhang f 18

1005 deng m 19

【样例输入】

1002 wu m 20

1001 wang m 19

1004 zheng f 19

1005 zhang f 18

1003 deng m 19

【样例输出】

1001 wang m 19

1002 wu m 20

1003 deng m 19

1004 zheng f 19

1005 zhang f 18

 高校计算机考研复试_历年真题+题解_牛客题霸_牛客网

13.二进制加法

利用了翻转的方法

#include <iostream>
#include<bits/stdc++.h>
using namespace std;

//二进制加法
//11 + 101
// 11+1
//翻转

void func(string a,string b)
{
  int len_a=a.length(),len_b=b.length();
  string result="";
  int carry=0;//向高位的进位,一定要弄初值,开始没弄初值做好久没有结果
  if(len_a>len_b)
  {
      swap(len_a,len_b);
      swap(a,b);//保证a中放的短的string
  }
  reverse(a.begin(),a.end());
  reverse(b.begin(),b.end());
  int sum;
  for( int i=0;i<len_a;i++)
  {

      int a_=a[i]-'0';//有时多定义几个变量,可以让结果简便,不然表达式太复杂,本题还需注意是字符还是字符串。
      int b_=b[i]-'0';
      sum=a_+b_+carry;
      result+=(sum%2+'0');
      carry=sum/2;


  }
  for( int i=len_a;i<len_b;i++)
  {
      sum=b[i]-'0'+carry;
      result+=(sum%2+'0');
      carry=sum/2;
  }
  if(carry==1)result=result+'1';
  reverse(result.begin(),result.end());
  cout<<result;

}

int main()
{
    string a,b;
    cin>>a>>b;//注意有空格时要用getline
    func(a,b);
    return 0;

}

14.约数的个数

如果用暴力的方法会超时,所以在求约数时用到根号n,当i*i<n,约数成对出现的,如果当前的i是约数,cnt+=2;

再判断i*i==num  ?  cnt++

本题输入n个数用while不断输入,就不用单独的数组来存储数据了。

#include <iostream>
using namespace std;

void func(int n)
{
     int cnt=0;//包括自身
     int i;
   for( i=1;i*i<n;i++)//用暴力算法会超时,约数个数都是成对出现的,
   {
    if(n%i==0)cnt+=2;
   }

   if(i*i==n)cnt++;//比自己平方大的数只有一个或者没有
   cout<<cnt<<endl;
}
int main() {
    int n,num;
    while(cin>>n)
    {
        for(int i=0;i<n;i++)
        {cin>>num;
         func(num);
        }
    }
    return 0;
}
// 64 位输出请用 printf("%lld")

  • 34
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值