目录
题目一:小学生分数计数
输入:
1/8+3/8
1/4-1/2
1/3-1/3
输出:
1/2
-1/4
0
解题思路
思路一:定义函数并使用。
思路二:在思路一的基础上升华一点 ,即直接使用头文件,引用所需函数。
具体方法一如下:
#include<stdio.h>
#include<math.h>
int GCD(int m, int n)
{
int t;
m = abs(m);
n = abs(n);
// 保证后续m%n为较大数除以较小数
if (m<n)
{
t = m;
m = n;
n = t;
}
// 辗转相除的过程,终止条件是余数为0
while (m % n != 0)
{
t = m;
m = n;
n = t % n;
}
// 返回除数(较小数)
return n;
}
int main() {
int a, b, c, d;
int gcd; // 最大公约数
int x, y; // 分子x 分母y
char o; // (+或者-)
while (scanf("%d/%d%c%d/%d", &a, &b, &o, &c, &d) != EOF) {
gcd = GCD(b, d);
// 以下是分数运算过程
// 通分——分母最大
x = b * d / gcd;
// x/b 为分母扩大了多少倍 分子也要相应扩大倍数
if (o == '+'){
y = a * (x / b) + c * (x / d);
// printf("%d\n",y);
// printf("%d\n",x);//(检验中间数据是否正确)
}
else
y = a * (x / b) - c * (x / d);
// 以下是分数化到最简过程
// 避免输出0/n
if (y == 0) {
printf("0\n");
} else if (y == x) {
printf("1\n");
} else {
gcd = GCD(y, x); // 无需要在意两个参数的顺序,求最大公约数
y = y / gcd;
x = x / gcd;
printf("%d/%d",y,x);
}
}
return 0;
}
思路二:
#include <stdio.h>
#include<iostream>//运用__gsd函数需要用到以下四行
#include <math.h>
#include<algorithm>
using namespace std;
int main() {
char b;
int k1,k2,k3,k4,k,n,m;
while(scanf("%d/%d%c%d/%d",&k1,&k2,&b,&k3,&k4)!=EOF) {//多组数据输入
int i;
if(b=='+')
n=k1*k4+k2*k3;
else n=k1*k4-k2*k3;
m=k2*k4;
if(n==0)
printf("0\n");
else {
k=fabs(n);
//printf("%d",k);验证数据
i=__gcd(k,m);//求最大公约数
if(i%m==0)
printf("%d\n",n/m);
else printf("%d/%d\n",n/i,m/i);
}
}
return 0;
}
题目二:二维数组中的鞍点
解题思路:求每一行和每一列的最小值,然后判断是否相等,最后排序即可。
具体写法如下:
#include <stdio.h>
int a[101][101], b[101], c[101][101], mn[101], mi[101];//定义所需数组
int main() {
int n,m,max,k,min,i,q,v,t,j,x=0;
scanf("%d %d", &m,&n);//m为行,n为列
for(i=1; i<=m; i++)
for(j=1; j<=n; j++)
scanf("%d",&a[i][j]);
for(i=1; i<=m; i++)
for(j=1; j<=n; j++)
c[i][j]=a[i][j];//因为循环里面数组a的值会变,并且后面要用到原始数组a的 值,所以提前弄出与数组a等价的数组
for(i=1; i<=m; i++) {
mi[i]=a[i][1];//求每一行的最小值
for(j=1; j<=n; j++) {//从第一行开始,第一行的每一个数比大小
if(mi[i]>a[i][j]) {
a[i][j]^=mi[i];
mi[i]^=a[i][j];
a[i][j]^=mi[i];
}
}
}
for(j=1; j<=n; j++) {
mn[j]=c[1][j];//求每一列的最小值
for(i=1; i<=m; i++) {//从第一列开始,第一列的每一个数比大小
if(mn[j]>c[i][j]) {
mn[j]^=c[i][j];
c[i][j]^=mn[j];
mn[j]^=c[i][j];
}
}
}
for(j=1; j<=n; j++) {//题目中说矩阵的每一个数不同,即mn[i],mi[j]如果分别有一数相等,即为鞍点
for(i=1; i<=m; i++) {
if(mi[i]==mn[j]) {
x++;//数组计数
b[x]=mi[i];
}
}
}
for( v=1; v<x; v++){//冒泡法排大小
for( q=1; q<=x-v; q++){
if(b[i]>b[i+1]){
t=b[i];b[i]=b[i+1];b[i+1]=t;
}
}
}
for( q=1; q<=x; q++)
printf("%d ",b[q]);
}
题目三:阶乘求和
解题思路:函数,递归,镶嵌函数(一个函数里面包括另一个)
具体如下:
#include<stdio.h>//由于涉及范围较大,所以用long long,不用int
long long forOne(int X) {//定义第一个函数,求n!的值
if(X==1)
return 1;
else if(X>1)
X--;
return (X+1)*forOne(X);//递归(直接或者间接调用该函数)
}
long long forAll(int N) {//定义第二个函数
long long forOne(int X);//引用第一个函数,求1!....加到n!的值
long long t=0;
for(int X=1; X<=N; X++) {
t+=forOne(X);//递归
}
return t;
}
int main() {
long long forOne(int X);//引用已定义函数
long long forAll(int N);
long long n;
scanf("%lld",&n);
printf("%lld",forAll(n));//套入函数输出结果
return 0;
}
本周专业排名:
本周班级排名: