2020年1月21日 OJ习题(sort排序(自己的理解)) 随记
程序员文章站
2024-01-01 19:35:22
...
海贼的奖品赞助
水题。。。。。。
#include <bits/stdc++.h>
using namespace std;
double x[30];
int main()
{
int n,a=0;
double b;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>x[i];
if(x[i]>=20.00) a++;
}
b=(a*1.0)/n;
printf("%.2lf\n",b);
//cout << "Hello world!" << endl;
return 0;
}
大数的乘法
可利用栈存数,一个字符类型的栈用来存初始的字符串,计算后的结果为整型,因此还需要一个整型的栈存储结果,最后出栈输出结果即可,但是进位的地方需要注意书写顺序,详细看代码
#include <bits/stdc++.h>
using namespace std;
stack<char> x1;//存字符串//
stack<int> x2;//存计算后的整型数//
int main()
{
char str[100],ch;//ch用来取出栈的每一个字符串//
int a,l,b,y,m=0,n=0;//a是1位数,l求字符串长度,b接受(-‘0’)变换后的数,y接受计算结果,m,n分别接受y对10求商和取模的结果//
while(cin>>str>>a)
{
if(a==0)
cout<<"0"<<endl;
else
{
l=strlen(str);
for(int i=0;i<l;i++)
{
x1.push(str[i]);
}
while(!x1.empty())
{
ch=x1.top();
x1.pop();
b=ch-'0';
y=a*b;
m=y%10;
if((m+n)>9)//需要进位//
{
x2.push((m+n)%10);
n=(m+n)/10+y/10;//n由两部分组成,当下的y对10求商的结果以及进位情况下的进位值//
}
else
{
x2.push(m+n);
n=y/10;
}
}
while(!x2.empty())
{
printf("%d",x2.top());
x2.pop();
}
cout<<endl;
}
}
return 0;
}
ICPC 团队
题目已经简化了,根据题意,只需找出两个最大的数,它们的和就是结果
#include <bits/stdc++.h>
using namespace std;
bool cmp(int a,int b)
{
if(a!=b)
{
return a<b;
}
}
int main()
{
long long a[5],b;
int t=1;
while(scanf("%lld%lld%lld%lld",&a[1],&a[2],&a[3],&a[4])!=EOF)
{
sort(a+1,a+1+5,cmp);
b=a[4]+a[3];
//for(int i=1;i<5;i++)
//cout<<a[i]<<" ";
printf("Case %d: ",t++);
printf("%lld\n",b);
}
return 0;
}
以下写一下自己对sort排序的理解,如理解有误,恳请指正
sort排序是c++中自带的排序方法,对初学者可谓是非常方便,有了它,我们就不再需要费事地去写冒泡排序或者选择排序了
具体结构:
sort排序实际上就是对某一给定的区间内的数进行排序,这里起始地址不需多说,可以理解为开始排序的位置,对于数组的结束地址,需要说明的是,它不是要排序的最后一个数,就上面的例子而言,数组由五个数,因此应该是a【0】,a【1】,a【2】,a【3】,a【4】这五个,我们知道a与a【0】是等价的,因此这里的a+5自然就变成了a【5】,这一位其实是没有数的,这也是为什么会有这种写法:sort(a+1,a+1+n),这样写的意思其实是要为n个数进行排序,但是起始位置是a【1】,然而要排序的第n个数应该是a【n】,结束地址确实a+1+n;
综上,不难理解,这个区间实际上可以理解为一个左闭右开区间。。。。。。
即【a,a+n)。
以下为实际代码证明:
正常排序。
修改了起始位置,结果如图,从a【2】开始排序了。
从a【1】开始排序5个数。
如图,最后一个数没有排序,这也就印证了以上结论!!!