极简单c++(2)

2017.6.26-2017.6.29

系统学习c++已四天

已完成题目主要有:

先说明一个网站:大家可以要求上去做题(但要交钱qaq)

http://www.gdgzoi.com/

我做了上述网站中的

1。课程1(1-10)超级简单的题目,一天30题没问题,适合初学者

2。综合测试(1)(2)题目还可以,打了一上午

题目如下:

1)给你2个分数,求他们的和a/b + c/d,并要求和为最简形式。

#include<iostream>
using namespace std;
int main()
{
    int a,b,c,d;
    cin>>a>>b>>c>>d;
    int e=b*d;
    int f=a*d+c*b;
    int r=e%f;
    int ee=e; int ff=f;
    while (r!=0)
    {
       e=f;
       f=r;
       r=e%f;
    }
    cout<<ff/f<<" "<<ee/f;
}

这题一定要注意取模时被除数放前面,不然出现分子为0情况,超级麻烦,(辗转相除法很经典。。。)

2)

考拉兹猜想,是指对于每一个正整数,如果它是奇数,则对它乘3再加1,如果它是偶数,则对它除以2,如此循环,最终都能够得到1。

如n = 6,根据上述数式,得出 6→3→10→5→16→8→4→2→1 。步骤中最高的数是16,共有8个步骤。现在给定任意整数a和b,问对所有a <= n <= b,一共经过多少步后才能都得到1,其中最高的数是多少。

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
    int a,b;
    cin>>a>>b;
    int c=0; int d=0;
    for (int i=a; i<=b; ++i)
    {
        int k=i;
        int max=0;
        int sum=0;
        while (k!=1) 
        {
            sum+=1;
            if (k%2==0) k/=2;
            else k=k*3+1;
            if (k>max) max=k;
        }
        c+=sum;
        if (max>d) d=max;
    }
    cout<<c<<" "<<d;
}

 

(简单模拟)

 3)

小明今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子.....LL不高兴了,他想了想,决定大、小王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5张牌就可以变成“1,2,3,4,5”(大小王分别看作2和4),“So Lucky!”。小明决定去买体育彩票啦。

现在,要求你使用这幅牌模拟上面的过程,然后告诉我们LL的运气如何。为了方便起见,你可以认为大小王是0。

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
    int n,x;
    int max=0;
    int a[1001];
    int k=0;
    cin>>n;
    int nn=n;
    for (int i=1; i<=n; ++i) 
    { 
      cin>>a[i];
      if (a[i]==0) 
      {
      k+=1; nn-=1;
      }  
    }
    for (int i=1; i<=n-1; ++i)
      for (int j=i+1; j<=n; ++j)
      {
           if (a[i]>a[j]) 
           {
               int k;
               k=a[i]; a[i]=a[j]; a[j]=k;
         }
      }
    int sum;
    for (int i=n-nn+1; i<=n-1; ++i)
    {
        int q;
        if (a[i]!=0)
        q=a[i+1]-a[i];
        if (q!=1) {k=k-q+1;}
    }
    if (k==0)
    cout<<"So Lucky!";
    else cout<<"Oh My God!";
}

(先计算有多少个0,再通过快排算两数之间差,顺子之间是1,但如果不是,能把0补上去是1,也是)

4)小明有n张卡片,每张卡片都有一个编号ai(ai>=0),但是这n张卡片中有一些编号是重复的,现在要你把它们按编号从小到大排好,重复的只需要留下一张,但需要统计每种编号的卡片出现的次数,想请你帮忙用编程来解决问题。

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
    int a[10001];
    int n;
    int x;
    int max=0;
    for (int i=0; i<=10001; ++i) a[i]=0;
    scanf("%d\n",&n);
    for (int i=1; i<=n; i++)
    {
        cin>>x;
        if (x>max) max=x;
        a[x]+=1;
    }
    for (int i=0; i<=max; i++)
    {
        if (a[i]!=0) cout<<i<<" "<<a[i]<<endl;
    }
}

(快排+模拟)

 

 

5)有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板。如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝?

#include<iostream>
using namespace std;
int main()
{
    int n;
    cin>>n;
    cout<<n/2;
}

(小学奥数)

6)

茵茵所在的合唱队共有n个人(n为奇数)。为了准备一次演出,老师开始为她们安排合唱队形了。

大家都知道,合唱队形通常是中间高两端低的。老师是这样安排他们的队形的:先让所有的同学按高个儿在前的顺序排成一队。然后,最高的那位同学单独站出来,这是合唱队形的中心,再让第二位同学站在她的左手边,让第三位同学站在她的右手边,再依次向两端安排其他人……

事先给定所有人的身高,请输出她们站成合唱队形之后的身高顺序。

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
    int n;
    int a[100];
    scanf("%d\n",&n);
    for (int i=1; i<=n; ++i)
    {
        cin>>a[i];
    }
    for (int i=1; i<=n-1; ++i)
    {
       for (int j=i+1; j<=n; ++j)
       {
             if (a[i]>a[j]) 
             {
                 int k;
                 k=a[i]; a[i]=a[j]; a[j]=k;
             }
       }
    }
    for (int i=1; i<=n/2; ++i) cout<<a[i*2-1]<<" ";
    cout<<a[n]<<" ";
    for (int i=n/2; i>=1; --i) cout<<a[2*i]<<" ";
}

(快排...)

7)

话说孙悟饭与乐平正在与刚造访地球的赛亚人贝吉塔交战,因为连贝吉塔的手下纳巴的实力也远在他俩之上,由于差距悬殊,乐平不得不设脱离战场,去寻找正在修炼中的悟空求救,而赛亚人一伙岂能让他们轻易逃脱,于是贝吉塔让纳巴去追乐平而着手对付孙悟饭。

   假设乐平的速度是vp每秒,纳巴速度vd每秒,他俩与贝吉塔当时处在同一地点(无视孙悟饭),当纳巴觉察到乐平逃跑这一举动需要t秒反应时间,乐平会在此间全速离开,虽然看起来乐平毫无胜算,但是他有一招叫做太阳拳的绝招,一旦纳巴超越自己那一瞬间,他会使出太阳拳让纳巴失明,一旦使出该招,纳巴不得不立即回去找贝吉塔拿眼药水,即他必须返回原处,并且在那里闭目养神f秒之后,再重新追赶,作为一名力大无穷却智商奇低的选手,乐平这太阳拳屡试不爽,设刚开始与贝吉塔所在的地方为起点,该点离悟空修炼处相距为c,求乐平到达悟空处 最少需要使用几次太阳拳,如果乐平刚好到达悟空处,而纳巴正好追到,则该次无需使用太阳拳,因为悟空会帮你干掉纳巴。

#include<iostream>
#include<cmath>
using namespace std;
int main()
{
double vp,vd,t,f,c;
while(cin>>vp>>vd>>t>>f>>c)
{
int sum=0;
double all=c/vp-t;
double s=0;
double d=0;
if(vd<=vp) sum=0;
else
{
d=vp*t/(vd-vp);
s+=d;
if(s>=all) sum=0;
else
{
while(s<all)
{
sum++;
s+=(d+f);
d=(d*(vp+vd)+f*vp)/(vd-vp);
s+=d;
} 
}
}cout<<sum<<'\n';
}return 0;
}

(小学追及问题,计算距离和时间,在一定时间内,判断超过多少次)

(这七题属于较简单题目,具体题解网上大把,但作为c++蒟蒻,还是做了好久啊。。。)

这七题中有个重点:快排!!!调用数据库algorithm,sort(a,a+n);<数组a中前n个元素从小到大排>

但好像考试不给用qaq

 

不过,在调用sort(arr+n,arr+m,comp) 之前我们需要自己写个 comp函数。
 
   从大到小排序的comp函数可以这样写:
   int my_comp(const int & a,const int & b) 
   {
   return a>b; //在两元素相同时一定要返回 0 或者 false
   }  //comp函数的名字是由我们自己决定的,例如可以叫 //cat_cat,dog_dog 等等

 

3。多重循环专题

(这个无需解释。。直接上题)

经典题:大家都很熟悉哥德巴赫猜想,它的内容是:对于任意一个大于4的偶数,都可以分解为两个素数的和。虽然我们不能证明它,但我们可以编一个程序对于给定的大于4的偶数进行验证。现在我们的任务是:对于给定的大于4的偶数,找出它所有本质不同的分解式(分解为两个素数和的式),所谓本质相同也就是说两个式的素数如果一样,则不管顺序如何,都认为是本质相同的,如:24=5+19和24=19+5是本质相同的分解式。

#include<iostream>
#include<cstdio>
#include<iomanip>
#include<cmath>
using namespace std;
bool sc(long long x);
int main()
{
    int n;
    while (cin>>n)
    {
    
    for (long long i=1; i<=n; ++i)
    {
        if (sc(i))
        if (sc(n-i))
        if (i<=n/2)
        cout<<n<<"="<<i<<"+"<<n-i<<endl;
    }
    }
    return 0;
    
}
bool sc(long long x)
{
    if (x==0||x==1) return(false);
    if (x==2) return(true);
    for (long long i=2; i<=sqrt(x); ++i)
    {
        if (x%i==0) return(false);
    }
    return(true);
}

 

4。字符串专题(难啊,好多细节要做,明天再写一篇单独的。。)(且g,j,k没写。。。)

5。课程二枚举4题

(暴力出奇迹。。。)

 

转载于:https://www.cnblogs.com/kuanghuiyue/p/7095330.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值