c++寒假班错题集(1.28)

错题题目

1.Goldbach's Conjecture

2.比例简化

3.出租车司机

 Goldbach's Conjecture

著名的哥德巴赫猜想,我们先看一下题目:

 在六以上的书都能拆成两个质数的和(因为是奇质数所以这两个质数 != 2)

这是第一次只有14分的代码

#include<bits/stdc++.h>
using namespace std;
bool isprime(int n){
	for(int i=2;i*i<=n;i++)
		if(n%i==0) return 0;
	return 1;
}
int in(int n){
	for(int i=2;i<n;i++){
		if(isprime(i) && isprime(n-i))return i;
	}
	return 0;
}
int main(){
	ios::sync_with_stdio(0),cin.tie(0);
	int n;
	while(scanf("%d",&n) && n!=0){
		int ans=in(n);
		printf("%d = %d + %d",n,ans,n-ans);
	}
	return 0;
}

这里首先是奇质数所以循环应该从3开始,在循环时i+=2避免2的所有倍数,增加效率,最傻的是输出没换行

让我们来看一下2.0版本

#include<bits/stdc++.h>
using namespace std;
bool isprime(int n){
	for(int i=2;i*i<=n;i++)
		if(n%i==0) return 0;
	return 1;
}
int in(int n){
	for(int i=3;i<=n;i+=2){
		if(isprime(i) && isprime(n-i))return i;
	}
	return 0;
}
int main(){
	ios::sync_with_stdio(0),cin.tie(0);
	int n;
	while(scanf("%d",&n) && n!=0){
		int ans=in(n);
		printf("%d = %d + %d\n",n,ans,n-ans);
	}
	return 0;
}

这个代码就可以A了

比例简化

话不多说我们还是来看一下题

这个题目的大意是

该你两个数A,B你要尽量简化A,B是他们比L小,但和A,B的误差最小

所以这个题思路是

//在x,y≤L, x/y≥A/B(x*B≥A*y), gcd(x,y) == 1下, 最小化(x/y-A/B)

我们来看一下标程

#include <bits/stdc++.h>
using namespace std;
int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); }
int main() {
  ios::sync_with_stdio(false), cin.tie(0);
  int A, B, L;
  cin >> A >> B >> L;
  int ax = 1e6, ay = 1;
// x,y≤L, x/y≥A/B(x*B≥A*y), gcd(x,y) == 1, 最小化(x/y-A/B)
  for (int x = 1; x <= L; x++)
    for (int y = 1; y <= L && A * y <= B * x; y++)
      if (gcd(x, y) == 1 && x * ay < ax * y)  // x/y<ax/ay ↔️ x*ay<ax*y
        ax = x, ay = y;
  printf("%d %d\n", ax, ay);
  return 0;
}

其中 x/y<ax/ay ↔️ x*ay<ax*y是运用了不等式的性质(交叉相乘积相等)

出租车司机

这个代码很简单,我是条件写错了

我们来看一下正确的条件:

#include <bits/stdc++.h>
using namespace std;
int main(){
	int x, n; cin >> x >> n;
	double m = 0, sum = 0;  //m表示走的总路程,sum是赚的钱
	for(int i = 1; i <= n; i++){
		double a; cin >> a;
		m += a;
		if(a <= 3) sum += 10;
		else sum = sum + 10 + 2 * ceil(a - 3); //ceil()向上取整,不足一公里的要按照一公里算
		if(sum >= x) break;  //赚够了就收手
	}
	printf("%.3lf", m / 20);
	return 0;
}

这里逻辑很简单,a <= 3表示是起步价 else 表示一公里2元,不足一公里按一公里算,sum>=x表示赚的钱够了。

今天的错题集就写到这儿了,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值