1.题目描述
桐桐周末陪妈妈到市场购物。她和妈妈来到一个买鸡的摊位,发现鸡的价格有三种:公鸡每只5元钱,母鸡每只3元钱,小鸡3只1元钱。妈妈就给桐桐出了一道计算题:如果用n元钱买m只鸡,问公鸡、母鸡和小鸡可以各买多少只?注意:必须把n元钱正好用完,且买的各种鸡的只数为大于等于0的整数。桐桐回到家里便拿起笔来认真计算,算了好久还没得出答案。聪明的你通过编写程序帮助桐桐找出结果好吗?
输入
只有1行,两个数n和m 0<n,m≤20000。
输出
有若干行,每行有三个数,分别为公鸡、母鸡和小鸡的只数,用空格隔开,按照公鸡只数升序排列。
样例输入
100 100
样例输出
0 25 75
4 18 78
8 11 81
12 4 84
(C++写法:主要思路:这道题比较简单,主要抓住题目给的限定条件。利用double作为参数类型也是为了取整更为方便)
#include<iostream>
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<n/5;i++)//假设钱全部买公鸡,公鸡的数量不能超过钱数除5取整
{
for(j=0;j<m;j++)
{
double k=m-i-j;
if(5*i+3*j+k/3==n)//公鸡每只5元钱,母鸡每只3元钱,小鸡3只1元钱
{
cout<<i<<""<<j<<" "<<k<<endl;
}
}
}
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<iostream>
#include<cstring>
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<m-n+1;i++)
{
num[i]=n+i;
}
for(int i=0;i<m-n;i++)
{
for(intj=0;j<m-n-i;j++)
{
if(transfer(num[j])>transfer(num[j+1]))
{
swap(num[j],num[j+1]);
}
}
}
for(inti=0;i<m-n;i++)
{
cout<<num[i]<<endl;
}
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<iostream>
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<n+1;j++)
{
if(array[j]>m)//逐个与数组中的值比较,有比插入值大的就交换位置,较大的值往后移动一位。
{
int temp=array[j];
array[j]=m;
for(;j<n;j++)
{
int next=array[j+1];
array[j+1]=temp;
temp=next;
}
break;
}
}
if(array[n-1]<m&&m!=0)//如果要插入的数字比原来的数组中的数都大的时候
{
array[n]=m;
}
for(inti=0;i<n+1;i++)
{
cout<<array[i]<<"\n"[i==n];
}
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<iostream>
#include<cmath>
using namespace std;
int main()
{
intn;
cin>>n;
intnum=0;
if(n>=2)
{
cout<<2<<" ";
}
for(inti=3;i<n+1;i+=2)
{
int mid=static_cast<int>(sqrt(i));//C++标准转换符static_cast<new_type>(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<<i<<""<<endl;
}
else
{
cout<<i<<"";
}
}
}
return0;
}
算法真的是一门很神奇的课程,有很多的题目不只有一种思路,不同的思路执行的时间也不同。有时候想到怎么解决但是c++又学得不好,不知道怎么实现(捂脸)。但是一点点消化,一点点进步,看到自己的代码能运行,能解决问题,能在oj平台上accept就会有一种成就感,我希望我能坚持下去,很多事情也是。最近脾气不好,也希望自己心情能慢慢好起来。
以上问题的解决都是我个人的一点点看法,如果有更加好的算法,或者我出现的错误,希望大家可以给我提出来。
本文介绍了四个算法题目,包括用钱数买鸡问题、倒序比较排序、有序序列插入和快速判断素数,提供了C++解决方案。通过示例输入和输出展示了解题思路,强调算法在解决实际问题中的应用。
2558

被折叠的 条评论
为什么被折叠?



