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
    评论
Private Function setdata(num As Integer) As String '数字转换 Select Case num Case 0 setdata = "零" Case 1 setdata = "壹" Case 2 setdata = "贰" Case 3 setdata = "叁" Case 4 setdata = "肆" Case 5 setdata = "伍" Case 6 setdata = "陆" Case 7 setdata = "柒" Case 8 setdata = "捌" Case 9 setdata = "玖" End Select End Function Private Function chang(aaa As Integer) As String '位数转换 Select Case aaa Case 1 chang = "" Case 2 chang = "十" Case 3 chang = "百" Case 4 chang = "千" Case 5 chang = "万" Case 6 chang = "十" Case 7 chang = "百" Case 8 chang = "千" Case 9 chang = "亿" Case 10 chang = "十" End Select End Function Private Sub Form_Activate() '设定文本长度 Text2.MaxLength = 10 Text2.SetFocus End Sub Private Sub Text2_Change() '小写转大写 Dim i As Integer Dim j As Integer Dim myint As Integer Dim myint1 As Integer Dim mydoub As Double Dim mystr As String Dim mystr1 As String Dim mystr2 As String Dim mystr3 As String Dim mystr4 As String Dim money As Long Dim money1 As Integer Dim money2 As Long mystr = Text2.Text myint = InStr(mystr, ".") If myint = 0 Then mystr = Text2.Text Else mystr3 = Right(Text2.Text, Len(Text2.Text) - myint) If mystr3 <> "" Then '转换小数位 mystr4 = Left(mystr3, 1) mystr3 = Right(mystr3, Len(mystr3) - 1) If mystr4 <> "0" Then mystr2 = mystr2 + setdata(Val(mystr4)) + "角" End If If mystr3 <> "" Then mystr4 = Left(mystr3, 1) mystr2 = mystr2 + setdata(Val(mystr4)) + "分" End If End If mystr = Left(Text2.Text, myint - 1) End If j = Len(mystr) For i = 1 To Len(mystr) '转换整数位 money2 = Left(mystr, i) money1 = Right(money2, 1) If money1 = 0 Then If j = 5 Then If Right(mystr1, 1) <> "万" Then mystr1 = mystr1 & "万" Else If Right(mystr1, 1) <> "零" And Right(money, j) > 0 Then mystr1 = mystr1 & "零" End If Else mystr1 = mystr1 & setdata(money1) + chang(j) End If j = j - 1 Next i Text1.Text = mystr1 & "元" & mystr2 '显示大写 End Sub Private Sub Command1_Click() End End Sub
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值