算法分析2

1.题目描述

桐桐周末陪妈妈到市场购物。她和妈妈来到一个买鸡的摊位,发现鸡的价格有三种:公鸡每只5元钱,母鸡每只3元钱,小鸡3只1元钱。妈妈就给桐桐出了一道计算题:如果用n元钱买m只鸡,问公鸡、母鸡和小鸡可以各买多少只?注意:必须把n元钱正好用完,且买的各种鸡的只数为大于等于0的整数。桐桐回到家里便拿起笔来认真计算,算了好久还没得出答案。聪明的你通过编写程序帮助桐桐找出结果好吗?

输入

只有1行,两个数n和m   0

输出

有若干行,每行有三个数,分别为公鸡、母鸡和小鸡的只数,用空格隔开,按照公鸡只数升序排列。

样例输入

100 100

样例输出

0 25 75

4 18 78

8 11 81

12 4 84

 (C++写法:主要思路:这道题比较简单,主要抓住题目给的限定条件。利用double作为参数类型也是为了取整更为方便

#include

using namespace std;

int main()

{

         double n=0;

         double m=0;

         cin>>n>>m;

         double i,j;        

         if(n>0&&m<=20000)

         for(i=0;i

         {

                  for(j=0;j

                  {

                          double k=m-i-j;                        

                          if(5*i+3*j+k/3==n)//公鸡每只5元钱,母鸡每只3元钱,小鸡3只1元钱

                          {

                                            cout<

                          }                        

                  }

         }

         system("pause");   

return 0;

}

2. 题目描述

读入一对正整数,将这两个数之间(包括这两个数本身)的所有数按下述特别规则排序后输出,该特别规则是按两数倒过来的值进行比较决定其大小,如30倒过来为3,29倒过来为92,则29大于30。

输入

1行,包含两个用空格隔开的自然数,这两个自然数给出了待排序数的范围,其中l≤第一个数≤第二个数≤999999999,两个数之差不超过100。

输出

输出排序后的数据,每行输出一个数。

 

样例输入

22 39

样例输出

30

31

22

32

23

33

24

34

25

35

26

36

27

37

28

38

29

39

(C++写法:主要思路:自己需要先写出一个可以交换数字个位与十位的函数,再定义一个交换函数。在比较时实现冒泡排序

#include

#include

using namespace std;

int transfer(int a)

{

         int temp=0;

         while(a)

         {

                  temp*=10;

                  temp+=a%10;

                  a/=10;

         }

         return temp;

}

void swap(int &a,int &b)

{

         int temp=a;

         a=b;

         b=temp;

}

int main()

{

   int n,m;

   int num[101];

   cin>>n>>m;

   int temp=0;

   if(n>m)

    {

             int a=n;

             n=m;

             m=a;

         }

         for(int i=0;i

         {

                  num[i]=n+i;

           

                 

         }

         for(int i=0;i

         {

                  for(intj=0;j

                  {

                          if(transfer(num[j])>transfer(num[j+1]))

                          {

                                   swap(num[j],num[j+1]);

                          }

                  }

         }

         for(inti=0;i

         {

                  cout<

         }

         return0;

}

3. 题目描述

有n(n<=100)个整数,已经按照从小到大顺序排列好,现在另外给一个整数m,请将该数插入到序列中,并使新的序列仍然有序。

输入

输入数据包含多个测试实例,每组数据由两行组成,第一行是n和m,第二行是已经有序的n个数的数列。n和m同时为0标示输入数据的结束,本行不做处理。

输出

对于每个测试实例,输出插入新的元素后的数列。

样例输入

3 3

1 2 4

0 0样例输出

1 2 3 4

 (c++写法:主要思路:先把原数组存入,把要插入的值进行插入排序。比较需要注意插入时的操作,还有就是输出格式。

#include

using namespace std;

int main()

{

         intn,m;

         cin>>n>>m;

         int array[n+1];

        

         for(inti=0;i<=n+1;i++)

         {

                          cin>>array[i];

         }

         for(intj=0;j

         {

                  if(array[j]>m)//逐个与数组中的值比较,有比插入值大的就交换位置,较大的值往后移动一位。

                  {

                          int temp=array[j];

                          array[j]=m;

                          for(;j

                          {

                               int next=array[j+1];

                               array[j+1]=temp;

                               temp=next;

                          }

                          break;

                  }

         }

         if(array[n-1]

         {

                  array[n]=m;

         }

         for(inti=0;i

         {

                  cout<

         }

        

         return0;

}

 

4. 题目描述

桐桐在学完了上节课的知识后,对信息学越发感兴趣了。桐桐是一个很善于思考的学生,她发现上节课中例题的n最大是40000,如果数据再大一些,比如n=10^6,那么判断素数的算法能否在1秒内给出答案呢?桐桐用程序实际测试的时间超过了1秒,你能帮助桐桐解决这个难题吗?即:在1秒的时间内输出不大于n (l

 

输入

一个正整数n (l

 

输出

输出不大于n的所有素数,每行输出5个素数。

 

 

样例输入

100

样例输出

2 3 5 7 11

13 17 19 23 29

31 37 41 43 47

53 59 61 67 71

73 79 83 89 97

 (c++写法:主要思路:有一个判断素数的方法是2到根号n之内的数不能整除n就是素数

#include

#include

using namespace std;

int main()

{

         intn;

         cin>>n;

         intnum=0;

          if(n>=2)

          {

                 cout<<2<<" ";

          }

         for(inti=3;i

         {

                  int mid=static_cast(sqrt(i));//C++标准转换符static_cast(expreesion)

                  intj;

                  for(j=3;j<=mid;j+=2)

                  {

                          if(i%j==0)//有一个判断素数的方法是2到根号n之内的数不能整除n就是素数

                          break;

                  }

                  if(j>mid)

                  {

                          num++;

                          if(num%5==4)

                          {

                                   cout<

                          }

                          else

                          {

                                   cout<

                          }

                  }        

         }

         return0;

}

算法真的是一门很神奇的课程,有很多的题目不只有一种思路,不同的思路执行的时间也不同。有时候想到怎么解决但是c++又学得不好,不知道怎么实现(捂脸)。但是一点点消化,一点点进步,看到自己的代码能运行,能解决问题,能在oj平台上accept就会有一种成就感,我希望我能坚持下去,很多事情也是。最近脾气不好,也希望自己心情能慢慢好起来。

以上问题的解决都是我个人的一点点看法,如果有更加好的算法,或者我出现的错误,希望大家可以给我提出来。

你可能感兴趣的:(算法分析)