数据结构题目-梦开始的地方

目录

问题 A: 31.简单计算器

问题 B: 案例 2-1.1:简单计算器

问题 C: 基础实验2-1.2:数组元素的循环左移

问题 D: 案例2-1.4:递归求简单交错幂级数的部分和

问题 E: 案例2-1.3:数列求和

问题 F: 基础实验2-2.1:整数的分类处理

问题 G: 基础实验2-2.2:求集合数据的均方差

问题 H: 最大连续子序列和问题

问题 I: 复数求和(附加代码模式)

问题 J: 复数乘积(附加代码模式)


问题 A: 31.简单计算器

内存限制:128 MB时间限制:1.000 S

评测方式:文本比较命题人:外部导入

提交:1414解决:703

返回比赛提交提交记录侧边提交

题目描述

一个最简单的计算器支持+,-,*,/ 四种运算。输入只有一行:两个参加运算的数一个操作符(+,-,*,/)。输出运算表达式的结果。考虑下面两种情况:
(1)如果出现除数为0的情况,则输出Divided by zero!
(2)如果出现 无效的操作符(即不为+,-,*,/之一),则输出:Invalid operator!

输入

输入只有一行,两个单精度float浮点数a,b和操作符op

输出

用printf的%g格式化输出计算得到的结果

样例输入 复制

34 56 +

样例输出 复制

90

提示

用%g格式化输出,例如printf("%g\n",a+b);

#include<bits/stdc++.h>
using namespace std;
int main()
{
    float a,b;
    char op;
    cin>>a>>b>>op;
    if(op=='+')
    printf("%g\n",a+b);
    else if(op=='-')
    printf("%g\n",a-b);
    else if(op=='*')
   printf("%g\n",a*b);
    else if(op=='/')
    {
        if(b==0)
        cout<<"Divided by zero!";
        else
        printf("%g\n",a/b);
    }
    else
    {
        cout<<"Invalid operator!";
    }
     
}

问题 B: 案例 2-1.1:简单计算器

内存限制:128 MB时间限制:1.000 S

评测方式:文本比较命题人:admin

提交:187解决:343

返回比赛提交提交记录侧边提交

题目描述

    模拟简单计算器的工作,假设计算器只能进行加减乘除运算,运算数和结果都是整数,4种运算符的优先级相同,按从左到右的顺序计算。

输入

输入说明,输入一个四则运算算式,(没有空格,且至少有一个操作数),遇到等号“=”说明输入结束。

输出

输出说明,输出计算式的运算结果,如果除法分母为0或有非法运算符,则输出ERROR。    

样例输入 复制

1+2*10-10/2=

样例输出 复制

10

提示

此题4种运算符的优先级相同

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int ans=0;
    cin>>ans;
  while(1)
  {
     char op;
     int temp;
     cin>>op;
     if(op=='=')
     {
         cout<<ans;
         break;
     }
     else if(op=='/')
     {
         cin>>temp;
         if(temp==0)
         {
             cout<<"ERROR";
             break;
         }
         else
         {
             ans/=temp;
         }
          
     }
     else if(op=='+')
     {
         cin>>temp;
         ans+=temp;
     }
     else if(op=='-')
     {
         cin>>temp;
         ans-=temp;
     }
     else if(op=='*')
     {
         cin>>temp;
         ans*=temp;
     }
     else
     {
         cout<<"ERROR";
         break;
     }
    }
}

问题 C: 基础实验2-1.2:数组元素的循环左移

内存限制:128 MB时间限制:1.000 S

评测方式:文本比较命题人:admin

提交:391解决:381

返回比赛提交提交记录侧边提交

题目描述

一个数组A中有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向左移动M(M>=0)个位置,即将A中的数据由(A0A1...AN-1)变换为(AM...AN-1A0A1...AM-1)(最前面的M个数据)循环移至最后面的M个位置)。

输入

第一行输入N(1<=N<=100),M(M>=0);
第二行输入N个整数

输出

输出循环左移M位以后的整数序列

样例输入 复制

8 3
1 2 3 4 5 6 7 8

样例输出 复制

4 5 6 7 8 1 2 3
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a[105];
  int n;
  cin>>n;
  int m;
  cin>>m;
  m=m%n;
    for(int i=0;i<n;i++)
    cin>>a[i];
    for(int i=m;i<n;i++)
    cout<<a[i]<<" ";
    for(int i=0;i<m;i++)
    cout<<a[i]<<" ";
}

问题 D: 案例2-1.4:递归求简单交错幂级数的部分和

内存限制:128 MB时间限制:1.000 S

评测方式:文本比较命题人:admin

提交:186解决:379

返回比赛提交提交记录侧边提交

题目描述

构造一个计算简单交错幂级数的部分和的函数:f(x,n)=x-x^2+x^3-x^4+......(-1)^(n-1)x^n。

  

输入

输入为两个数x,n.其中n为正整数,x为实数且在双精度范围内。 

输出

输出为该函数f(x,n)的返回值,保留两位小数,该返回值在双精度范围内 

样例输入 复制

0.5 12

样例输出 复制

0.33

提示 

使用递归函数

#include<bits/stdc++.h>
using namespace std;
 
 
double myfun(double x,int n)
{
  double ans;
  if(n==1)
  return x;
  else
  {
    ans=pow(-1,n-1)*pow(x,n)+myfun(x,n-1);
    return ans;
  }
   
}
 
 
int main()
{
  double x;
  int n;
  cin>>x>>n;
  cout<<fixed<<setprecision(2)<<myfun(x,n);
}

问题 E: 案例2-1.3:数列求和

内存限制:128 MB时间限制:1.000 S

评测方式:文本比较命题人:admin

提交:285解决:324

返回比赛提交提交记录侧边提交

题目描述

    给定某数字A(1=<A<=9)以及非负整数N(0=<N<=100000),求数列之和S=A+AA+AAA+...+AA..A(N个A)。例如A=1,N=3时S=1+11+111=123.

输入

输入数字A(1<=A<=9)与非负整数N。

输出

输出N项数列之和S的值

样例输入 复制

1 3

样例输出 复制

123
#include<bits/stdc++.h>
using namespace std;
int main()
{
  int a,n;
  cin>>a>>n;
  stack<int>ans;
  int mod=0;
  int temp=0;
  if(n==0)
  cout<<0;
  else{
  while(n>0)
  {
    temp=(n*a+mod)%10;
    mod=(n*a+mod)/10;
    ans.push(temp);
    n--;
  }
  if(mod!=0)
  ans.push(mod);
  while(!ans.empty())
  {
    cout<<ans.top();
    ans.pop();
  }}
}

问题 F: 基础实验2-2.1:整数的分类处理

内存限制:128 MB时间限制:1.000 S

评测方式:文本比较命题人:admin

提交:154解决:317

返回比赛提交提交记录侧边提交

题目描述

给定N个正整数,要求从中得到下列三种计算结果:
1.A1=能被三整除的最大整数
2.A2=存在整数K使之可以表示为3K+1的整数个数
3.A3=存在整数K使之可以表示为3K+2的所有整数的平均值(精确到小数点后一位)

输入

第一行输入N,随后一行输入N个正整数,所有数字不超过100

输出

一行按顺序输出A1,A2,A3的值,如果某个数字不存在则输出NONE

样例输入 复制

8
5 8 7 6 9 1 3 10

样例输出 复制

9 3 6.5

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a[105];
    int n;
    cin>>n;
    int ans1=-1;
    int ans2=0;
    int ans3=0;
    double all=0;
    for(int i=0;i<n;i++)
    cin>>a[i];
    sort(a,a+n);
    for(int i=0;i<n;i++)
    {
        if(a[i]%3==0)
        {
            ans1=a[i];
            //break;
        }
        if(a[i]%3==1)
        ans2++;
        if(a[i]%3==2)
        {
            all+=a[i];
            ans3++;
        }
    }
    if(ans1>0)
    cout<<ans1<<" ";
    else
    {
        cout<<"NONE"<<" ";
    }
    if(ans2)
    cout<<ans2<<" ";
    else
    cout<<"NONE"<<" ";
    if(ans3)
    cout<<fixed<<setprecision(1)<<all/ans3;
    else
    cout<<"NONE";    
}

问题 G: 基础实验2-2.2:求集合数据的均方差

内存限制:128 MB时间限制:1.000 S

评测方式:文本比较命题人:admin

提交:345解决:397

返回比赛提交提交记录侧边提交

题目描述

设计函数求N个给定整数的均方差

输入

第一行给定整数N,随后一行给定N个整数,所有数字不超过1000

输出

输出均方差,要求固定精度输出小数点后五位

样例输入 复制

10
6 3 7 1 4 8 2 9 11 5

样例输出 复制

3.03974

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a[1005];
    int n;
    cin>>n;
    double all=0;
    double ans=0;
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
        all+=a[i];
    }
    double aver=all/n;
     for(int i=0;i<n;i++)
     {
         ans+=pow(a[i]-aver,2);
     }
     cout<<fixed<<setprecision(5)<<sqrt(ans/n);
}

问题 H: 最大连续子序列和问题

内存限制:128 MB时间限制:1.000 S

评测方式:文本比较命题人:liuyong

提交:3366解决:1132

返回比赛提交提交记录侧边提交

题目描述

给定整数序列A1,A2,....,An,对其所有连续子序列求和,寻找累加和最大的序列。如果所有的整数都是负的,那么最大连续子序列的和为0。

输入

输入包括多组测试数据,每组测试数据一行,每行第一个为正整数n(0 < n <= 100000),表示序列长度,紧跟着n个整数,Ai  (-1001<Ai < 1001),表示序列每个元素,各个整数之间用空格隔开。

输出

针对每组测试数据,输出最大连续子序列的和,以及该最大连续子序列的起止位置。当最大连续子序列的长度为0时,序列的起止位置都输出为-1。如果有多个连续子序列的值为最大值,输出第一个连续子序列。

多组输出用换行隔开

样例输入 复制

6 -2 11 -4 13 -5 2
1 -1

样例输出 复制

20 1 3
0 -1 -1

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
 
ll a[100005];
 
int main()
{
    ll n;
    while(cin>>n){
    for(ll i=0;i<n;i++)
    cin>>a[i];
    ll temp=0;
    ll ans=0;
    ll end=0;
    int flag=1;
    for(ll i=0;i<n;i++)
    {
        if(a[i]>0)
        flag=0;
    }
    if(flag){
        cout<<"0 -1 -1"<<endl;
    continue;}
    for(ll i=0;i<n;i++)
    {
        if(temp>0)
        temp+=a[i];
        else
        {
            temp=a[i];
        }
        if(temp>ans)
        {
            ans=temp;
            end=i;
        }
    }
    ll sum=0;
 
    ll start;
    for(ll i=end;;i--)
    {
        sum+=a[i];
        if(sum==ans)
        {
            start=i;
            break;
        }
    }
    cout<<ans<<" "<<start<<" "<<end<<endl;
    }
}

问题 I: 复数求和(附加代码模式)

内存限制:128 MB时间限制:1.000 S

评测方式:文本比较命题人:liuyong

提交:893解决:642

返回比赛提交提交记录侧边提交

题目描述

从键盘读入n个复数(实部和虚部都为整数),求出n个复数的和并输出。
本题是附加代码模式,主函数main的代码会自动附加在同学们提交的代码后面,请同学们在提交的时候注释掉自己的main函数。


 

输入

第一行为正整数n(小于100),接下来n行数据,每行为两个整数,表示一个复数的实部和虚部

输出

输出n个复数的加和结果

样例输入 复制

3  
3  4 
5  2 
1  3 

样例输出 复制

9+9i 

提示

结构体定义以及函数声明如下图所示:

#include<bits/stdc++.h>
using namespace std;
 
 
struct Complex{
    int r;
    int i;
};
 
Complex Add(Complex c1,Complex c2){
   // Complex ans;
    c1.r+=c2.r;
    c1.i+=c2.i;
    return c1;
}

问题 J: 复数乘积(附加代码模式)

内存限制:128 MB时间限制:1.000 S

评测方式:文本比较命题人:liuyong

提交:345解决:422

返回比赛提交提交记录侧边提交

题目描述

数集拓展到实数范围内,仍有些运算无法进行。比如判别式小于0的一元二次方程仍无解,因此将数集再次扩充,达到复数范围。

定义:形如z=a+bi的数称为复数(complex number),其中规定i为虚数单位,且i^2=i*i=-1(a,b是任意实数)

我们将复数z=a+bi中的实数a称为复数z的实部(real part)记作Rez=a

实数b称为复数z的虚部(imaginary part)记作 Imz=b.

已知:当b=0时,z=a,这时复数成为实数;

当a=0且b≠0时 ,z=bi,我们就将其称为纯虚数。

定义: 对于复数z=a+bi,称复数z'=a-bi为z的共轭复数。

定义:将复数的实部与虚部的平方和的正的平方根的值称为该复数的模,记作∣z∣

规定复数的乘法按照以下的法则进行:

设z1=a+bi,z2=c+di(a、b、c、d∈R)是任意两个复数,那么它们的积(a+bi)(c+di)=(ac-bd)+(bc+ad)i.

其实就是把两个复数相乘,类似两个多项式相乘,在所得的结果中把i2换成-1,并且把实部与虚部分别合并.两个复数的积仍然是一个复数.
本题是附加代码模式,主函数main的代码会自动附加在同学们提交的代码后面,请同学们在提交的时候注释掉自己的main函数。
 

输入

两个复数分两行,每行两个数,代表复数的实部和虚部。

输出

两个复数的乘积。

样例输入 复制

1 1
1 1

样例输出 复制

0 2

提示

结构体定义和函数声明见下图
 

#include<bits/stdc++.h>
using namespace std;
 
 
struct Complex{
    int r;
    int i;
};
 
Complex Add(Complex c1,Complex c2){
   // Complex ans;
    c1.r+=c2.r;
    c1.i+=c2.i;
    return c1;
}
 
Complex Mul(Complex c1,Complex c2){
    Complex ans;
    ans.r=c1.r*c2.r-c1.i*c2.i;
    ans.i=c1.i*c2.r+c1.r*c2.i;
    return ans;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嗯嗯你说的对

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值