23蓝桥杯第三次训练题解

有趣的三位数

题目
在这里插入图片描述注意:这里不是水仙花数!! 返回值为aaa + bb + c *


#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
int get(int n);
int main()
{
    //int s[100];//以为是数组看错了,这里有点粗心
    int n,m;
    cin >> n >> m;
    int flag = 0; //是否有特殊数标志位
    for(int i = n;i <= m;i ++) //n-m范围
    {
        if(get(i)==i){ //函数判断
            flag = 1;
            printf("%d\n",i);}

    }
    if(!flag) //没有找到的情况
    {
        cout <<"Not Found";
    }


    return 0;
}
int get(int n)//查找这个特殊三位数的函数
{
    int sum = 0;
    int a = n%10; //个位
    int b = (n/10) % 10; //十位
    int c = (n/10) / 10; //百位
    sum = a*a*a + b*b  + c ;
    return sum;
}
//函数写法2
int get(int n){
int ans = 0;
int a = n % 10;
ans += a * a * a;
n /= 10;
a = n % 10;
ans += a * a;
n /= 10;
a = n % 10;
ans += a; 
return ans;
}

1-5计算钱币

编写程序,读取用户输入的代表总金额的double值,打印表示该金额所需的最少纸币张数和硬币个数,打印从最大金额开始。纸币的种类有十元、五元、一元,硬币的种类有五角、一角、贰分、壹分。

注意:即使不需要某一种类的纸币或硬币,也要打印出来。
输入样例1:
47.63

输出样例1:
4 张十元
1 张五元
2 张一元
1 个五角
1 个一角
1 个贰分
1 个壹分
输入样例2:
51.2
输出样例2:
5 张十元
0 张五元
1 张一元
0 个五角
2 个一角
0 个贰分
0 个壹分

老师给的答案:

#include<stdio.h>
double val[10] = {
10,
5,
1,
0.5,
0.1,
0.02,
0.01,
};
int ans[10];
int main(){
1-6
依旧是函数的定义,我们把移位操作单独实现后程序就简单了。
double n = 0;
scanf("%lf", &n);
for(int i = 0; i < 7; i ++ ){
if(n >= val[i]){
ans[i] += (n / val[i]);
n -= 1.0 * ans[i] * val[i];
}
}
printf("%d 张十元\n", ans[0]);
printf("%d 张五元\n", ans[1]);
printf("%d 张一元\n", ans[2]);
printf("%d 个五角\n", ans[3]);
printf("%d 个一角\n", ans[4]);
printf("%d 个贰分\n", ans[5]);
printf("%d 个壹分\n", ans[6]);
}

这个不知道为什么不对,记录一下

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;
int main()
{
    //int s[100];
    double n;
    cin >> n;
    int a = n/10;
    int b, c, d;
    int a2, a3, a4, b2,b3, c1,c2;
    b=int(n) % 10;
    {
         if (b > 5 && b <= 9) {a2 =1;a3=b-5;}
         else if (b > 4 && b <= 5)  {a2 =1;a3=0;}
         else if ( b < 5)  a2 =0;a3=b;
    }
    int c=int(n*10) % 10;
      {
         if (c > 5 && c <= 9){ b2 =1;b3=c-5;}
         if (c > 4 && c <= 5) b2 =1;b3=0;
         if ( c < 5)  a2 =0;b3=c;
    }
    d=int(n*100) % 10;
    {
        if(d%2 == 0) c1 =d/2; c2 = 0;
        if(d%2 == 1) c1 = d/2; c2 = 1;
    }
    cout << a << "张十元" << "\n";
    cout << a2  << "张五元"<< "\n";
    cout << a3  << "张一元"<< "\n";
    cout << b2  << "个五角"<< "\n";
    cout << b3  << "个一角"<< "\n";
    cout << c1  << "个贰分"<< "\n";
    cout << c2  << "个壹分"<< "\n";
    return 0;
}

分巧克力-第八届蓝桥省赛-AB组

儿童节那天有 K 位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。
小明一共有 N 块巧克力,其中第 i 块是 Hi×Wi 的方格组成的长方形。
为了公平起见,小明需要从这 N 块巧克力中切出 K 块巧克力分给小朋友们。
切出的巧克力需要满足:
形状是正方形,边长是整数
大小相同

例如一块 6×5 的巧克力可以切出 6 块 2×2 的巧克力或者 2 块 3×3 的巧克力。

当然小朋友们都希望得到的巧克力尽可能大,你能帮小明计算出最大的边长是多少么?
Alt
Sample input:
2 10
6 5
5 6
Sample output:
2

#include<bits/stdc++.h>
#include<iostream>

#define MAX 200010
using namespace std;

int h[MAX],w[MAX];
int n,i,k;

bool check(int a)//分成的巧克力长度为a,  找到要求的巧克力块数量
{
    int num  = 0;//分成的千克力为的长度的数量
    for(i = 0;i < n;i++)
    {
        num += (h[i]/a) * (w[i]/a);
        if(num >= k )
            return true;

    }
    return false;


}

int main(){

    cin >> n >> k;
    for(i = 0; i < n;i++)
    {
        cin >> h[i] >> w[i];
        //scanf("%d%d",&h[i],&w[i]);
    }
    int l = 1, r = 1e5;
    while(l < r)
    {
        int mid = (l+r)/2;
        if(check(mid))

            l = mid+1;
        else
            r = mid;

    }
    cout << r-1 << "\n";


    return 0;
}

或者:
如果mid不加一,l就要去mid加一,反之,如果加一的话,r就要mid减一
总结错误:在main函数里又声明了一次n 会导致结果不正确

#define N 100005
using namespace std;
int h[N],w[N];
int n,i,k;
bool check(int a)
{
    int num = 0;//记录分成长度为 a 的巧克力数量
    for (int i = 0; i < n; i++)
    {
        num += (w[i] / a) * (h[i] / a);//每一大块可以分成的边长为 a 的巧克力数量
        if (num >= k) return true;//大于要求数量,返回真
    }
    return false;
}
int main()
{
	cin>>n>>k;
	for(i=0;i<n;i++)
	{
		scanf("%d%d",&h[i],&w[i]);
	}
	int l = 1,r=1e5;
	while(l<r)
	{
		int mid = (l+r+1)/2;//注意:这里的+1很重要哦,要不然就成死循环了哦
		if(check(mid))
		l=mid;
		else
		r = mid - 1;
	}
	cout<<r; 
	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值