PAT-第5章-入门篇(3)

博客详细解析了PAT考试中简单数学部分的题目,包括A1049、A1104和A1105等,重点讨论了分数的四则运算模板及大整数运算中的注意事项,如long long类型的取模运算和bign结构体的初始化。此外,还介绍了素数判断、质因子分解和扩展欧几里得算法等相关知识点。
摘要由CSDN通过智能技术生成

简单数学

A1049

#include<cstdio>
using namespace std;
int main(){
   
	int n;
	scanf("%d",&n);
	//看n的每一位
	int a = 1,ans=0,left,now,right;
	while(n>=a){
   
		left = n/(a*10);//左边的位上有多少变化
		right = n % a;
		now = n/a%10;
//         printf("%d %d %d\n",left,right,now);
		if(now==0){
   
			//左边 0 ~ left-1   右边 0 ~ a-1
			ans += left*a;
		}else if(now==1){
   
			//1.左边 0 ~ left-1 右边 0 ~ a-1
			//2.左边 left       右边 0 ~ right
			ans += left*a+right+1;
		}else{
   
			//左边 0 ~ left
			//右边 0 ~ a-1
			ans += (left+1)*a;
		}
		a*=10;
	}
	printf("%d",ans);
}

A1104

思路不难但是测试样例的数据好像比较那啥。double加多了误差会变大。
柳神代码

#include <iostream>
using namespace std;
int main() {
   
    int n;
    cin >> n;
    long long sum = 0;
    double temp;
    for (int i = 1; i <= n; i++) {
    
        cin >> temp;
        sum += (long long)(temp * 1000) * i * (n - i + 1);
    }
    printf("%.2f", sum / 1000.0);
    return 0;
}

A1105

#include<cstdio>
#include<vector>
#include<algorithm>
#include<cmath>
using namespace std;
int isPrime(int r){
   
    int k = 0;
    for(int i=2;i<=sqrt(r);i++){
   
        if(r%i==0)
            k = i;
    }
    return k;
}
vector<int> v;
int main(){
   
    int N;
    scanf("%d",&N);
    for(int i=0,m;i<N;i++){
   
        scanf("%d",&m);
        v.push_back(m);
    }
    sort(v.rbegin(),v.rend());
    int k = isPrime(N);
    if(k==0){
   
        for(int i=0;i<v.size();i++){
   
            printf("%d\n",v[i]);
        }
    }else{
   
        int n = k;
        int m = N/k;
        int a[m+1][n+1] = {
   0};
        int i=1,j=1,num=0;
        while(i<=m&&j<=n&&num<N){
   
            while(j<=n&&a[i][j]==0){
   
                a[i][j++] = v[num++];
            }
            j--;i++;
            while(i<=m&&a[i][j]==0){
   
                a[i++][j] = v[num++];
            }
            i--;j--;
            while(j>=1&&a[i][j]==0){
   
                a[i][j--] = v[num++];
            }
            j++;i--;
            while(i>=1&&a[i][j]==0){
   
                a[i--][j] = v[num++];
            }
            i++;j++;
        }
        for(int i=1;i<=m;i++){
   
            for(int j=1;j<=n;j++){
   
                if(j!=1)
                    printf(" ");
                printf("%d",a[i][j]);
            }
            printf("\n");
        }
    }
}

分数的四则运算

通用模板

#include<cstdio>
#include<algorithm>
using namespace std;
struct Fraction{
   
	ll up,down;
};
Fraction reduction(Fraction result){
   
	if(result.up<0){
   
		result.up*=-1;
		result.down*=-1
	}
	if(result.up==0){
   
		result.down=1;
	}else{
   
		ll d = gcd(abs(result.up),abs(result.down));
		result.up /= d;
		result.down /= d;
	}
	return result;
}
Fraction add(Fraction f1,Fraction f2){
   
	Fraction result;
	result.up = f1.down*f2.up+f1.up*f2.down;
	result.down = f1.down*f2.down;
	return reduction(result);
}
Fraction minu(Fraction f1,Fraction f2){
   
	Fraction result;
	result.up = f1.up*f2.down-f1.down*f2.up;
	result.down = f1.down*f2.down;
	return reduction(result);
}
Fraction multi(Fraction f1,Fraction f2){
   
	Fraction result;
	result.up = f1.up*f2.up;
	result.down = f1.down*f2.down;
	return reduction(result);
}
Fraction divide(Fraction f1,Fraction f2){
   
	Fraction result;
	result.up = f1.up*f2.down;
	result.down = f1.down*f2.up;
	return reduction(result);
}
void showResult(Fraction r){
   
	if(r.down==1)printf("%lld",r.up);
	else if(abs(r.up)>r.down){
   
		printf("%lld %lld/%lld",r.up/r.down,abs(r.up)%r.down,r.down);
	}else{
   
		printf("%lld/%lld",r.up,r.down);
	}
}
int main(){
   
}

A1081

关键:

long long 类型的取模运算% 需要algorithm头文件支持

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
struct Fraction{
   
    ll up,down;
};
ll gcd(ll x,ll y){
   
    return y==0?x:gcd(y,x%y);
}
Fraction reduction(Fraction result){
   
    if(result.down<0){
   
        result.down*=-1;
        result.up*=-1;
    }
    if(result.up==0)
        result.down = 1;
    else{
   
        ll d = gcd(abs(result.up),abs(result.down));
        result.up /= d;
        result.down /= d;
    }
    return result;
}
Fraction add(Fraction a,Fraction b){
   
    Fraction result;
    result.up = a.up*b.down+b.up*a.down;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值