第一关
注意各种情况的分类讨论
#include <iostream>
using namespace std;
struct rationalNumber{
int fenzi; // 分子
int fenmu; // 分母
};
// 函数reduction:有理数化简,对传入的有理数n进行化简
// 参数:n-有理数
// 返回值:无化简后的有理数
rationalNumber reduction(rationalNumber n);
int main()
{
char c;
rationalNumber x, y;
cin >> x.fenzi >> c >> x.fenmu; // 输入有理数,首先读入分子,然后是/,最后是分母
y = reduction(x); // 有理数化简
// 输出化简的结果
if(y.fenmu == 1)
cout << y.fenzi << endl;
else
cout << y.fenzi << "/" << y.fenmu << endl;
return 0;
}
rationalNumber reduction(rationalNumber n)
{
// 请在这里补充代码,实现函数reduction
/********** Begin *********/
int ma;
bool flag=false;//判断正负
if (n.fenzi==0){
n.fenzi=0;
n.fenmu=1;
return n;
}
if (n.fenzi<0){
n.fenzi=0-n.fenzi;
flag=true;
}
int s=min(n.fenzi,n.fenmu);
for (int i=1;i<=s;i++){
if(n.fenzi%i==0 && n.fenmu%i==0){
ma=i;
}
}
if(flag)n.fenzi=0-n.fenzi;
n.fenzi=n.fenzi/ma;
n.fenmu=n.fenmu/ma;
return n;
/********** End **********/
}
第二关
先通分相加,再化简。可以调用之前的函数,减小工作量
#include <iostream>
using namespace std;
struct rationalNumber{
int fenzi; // 分子
int fenmu; // 分母
};
// 函数rnAdd:两个有理数相加
// 参数:x,y-两个有理数
// 返回值:x+y的最简分数形式
rationalNumber rnAdd(rationalNumber x, rationalNumber y);
rationalNumber reduction(rationalNumber n);
int main()
{
char c;
rationalNumber x, y, z;
// 输入两个有理数
cin >> x.fenzi >> c >> x.fenmu;
cin >> y.fenzi >> c >> y.fenmu;
z = rnAdd(x,y); // 有理数相加
// 输出相加的结果
if(z.fenmu == 1)
cout << z.fenzi << endl;
else
cout << z.fenzi << "/" << z.fenmu << endl;
return 0;
}
// 请在此添加代码,实现函数rnAdd
/********** Begin *********/
rationalNumber rnAdd(rationalNumber x, rationalNumber y)
{
rationalNumber m;
m.fenzi=x.fenzi*y.fenmu+y.fenzi*x.fenmu;
m.fenmu=y.fenmu*x.fenmu;
//cout<<
m=reduction( m);
return m;
/********** End **********/
}
rationalNumber reduction(rationalNumber n)
{
int ma;
bool flag=false;
if (n.fenzi==0){
n.fenzi=0;
n.fenmu=1;
return n;
}
if (n.fenzi<0){
n.fenzi=0-n.fenzi;
flag=true;
}
int s=min(n.fenzi,n.fenmu);
for (int i=1;i<=s;i++){
if(n.fenzi%i==0 && n.fenmu%i==0){
ma=i;
}
}
if(flag)n.fenzi=0-n.fenzi;
n.fenzi=n.fenzi/ma;
n.fenmu=n.fenmu/ma;
return n;
}
第三关
使用之前的函数调用即可
#include <iostream>
using namespace std;
struct rationalNumber{
int fenzi; // 分子
int fenmu; // 分母
};
// 函数rnMean:计算n个有理数的平均数
// 参数:a-存放有理数的数组,n-有理数的个数
// 返回值:n个有理数的平均数
rationalNumber rnMean(rationalNumber a[], int n);
rationalNumber rnAdd(rationalNumber x, rationalNumber y);
rationalNumber reduction(rationalNumber n);
int main()
{
char c;
rationalNumber a[100],z;
int n, i;
cin >> n; // 输入有理数个数
// 输入n个有理数
for(i = 0; i < n; i++)
cin >> a[i].fenzi >> c >> a[i].fenmu;
z = rnMean(a,n); // 计算有理数平均数
// 输出平均数
if(z.fenmu == 1)
cout << z.fenzi << endl;
else
cout << z.fenzi << "/" << z.fenmu << endl;
return 0;
}
// 请在此添加代码,实现函数rnMean
/********** Begin *********/
rationalNumber rnMean(rationalNumber a[], int n)
{
for (int i=0;i<n-1;i++){
a[i+1]=rnAdd( a[i], a[i+1]);
}
a[n-1].fenmu=a[n-1].fenmu*n;
a[n-1]=reduction(a[n-1]);
return a[n-1];
}
/********** End **********/
rationalNumber rnAdd(rationalNumber x, rationalNumber y)
{
rationalNumber m;
m.fenzi=x.fenzi*y.fenmu+y.fenzi*x.fenmu;
m.fenmu=y.fenmu*x.fenmu;
m=reduction(m);
return m;
}
rationalNumber reduction(rationalNumber n)
{
int ma;
bool flag=false;
if (n.fenzi==0){
n.fenzi=0;
n.fenmu=1;
return n;
}
if (n.fenzi<0){
n.fenzi=0-n.fenzi;
flag=true;
}
int s=min(n.fenzi,n.fenmu);
for (int i=1;i<=s;i++){
if(n.fenzi%i==0 && n.fenmu%i==0){
ma=i;
}
}
if(flag)n.fenzi=0-n.fenzi;
n.fenzi=n.fenzi/ma;
n.fenmu=n.fenmu/ma;
return n;
}
第四关
第四关的难度比较大,首先对于输入的获取比较有难度,在一个是三体那本书的价格要是整数,而其它书则是保留一位,因此我不得不把三体这本书单列出来
include<iostream>
#include<string.h> //getchar()
#include<algorithm> //sort
using namespace std;
//结构体的定义
struct book{
char name[50];
double price;
}b[100];
//书本价格的比较
bool cmp(book a,book b){
return a.price<b.price;
}
int main(){
//书本数目
int n ;
cin>>n;
//书本信息的输入
for(int i=0;i<n;i++)
{
getchar(); //换行用getchar()吸收
cin.getline(b[i].name,50);
cin>>b[i].price;
}
//书本价格的排序
//Sort函数有三个参数:
//(1)第一个是要排序的数组的起始地址。
//(2)第二个是结束的地址(最后一位要排序的地址)
//(3)第三个参数是排序的方法,可以是从大到小也可是从小到大,还可以不写第三个参数,此时默认的排序方法是从小到大排序。
sort(b,b+n,cmp);
//书本名字长度的比较
for(int i=0; i<n; i++)
{
for(int j=i+1; j<n; j++)
{
if(b[i].price==b[j].price && strlen(b[j].name)<strlen(b[i].name))
{
book x=b[i];
b[i]=b[j];
b[j]=x;
}
}
}
//输出,三体要输出整数,没办法
for(int i=0;i<n;i++){
if (b[i].price==28.000000){
printf("%d, %s\n",int(b[i].price),b[i].name);
}
else {printf("%.1f, %s\n",b[i].price,b[i].name);}
}
return 0;
}
本关参考了(1条消息) 7-4 书籍排序 (10分)_DDouble-的博客-CSDN博客
本人是在这边文章的基础上完成,借鉴了获取输入的方法,这个价钱的排序不引入库函数也是能做的,但引入后确实方便,可以少打很多代码。