目录
【样例解释】
1.【制作蛋糕】(第一题)
【题目描述】
小A擅长制作香蕉蛋糕和巧克力蛋糕。制作一个香蕉蛋糕需要2个单位的香蕉,250个单位的面粉,75个单位的糖,100个单位的黄油。制作一个巧克力蛋糕需要75个单位的可可粉,200个单位的面粉,150个单位的糖,150个单位的黄油。一个香蕉蛋糕可以卖出400元,而一个巧克力蛋糕可以卖出450元。为了避免蛋糕变质,每种蛋糕至多只能制作100个。
现已知每种原料的数量,求小A至多可以卖出多少元的蛋糕。
【输入】
依次输入面粉、香蕉、糖、黄油、可可粉的数量,每种原料数量均为不超过100000的整数。
【输出】
输出一个整数,表示最多卖出的钱数。
【输入样例】
4000 6 2000 500 500【输出样例】
1700
#include<bits/stdc++.h>//枚举
using namespace std;
int main()
{
int mf,xj,t,hy,kkf,xjcake=0,kkcake=0,msum=0,sum=0;
cin>>mf>>xj>>t>>hy>>kkf;
for(int i=0;i<=xj/2;i++)//最多的香蕉蛋糕数量
for(int j=0;j<=kkf/75;j++)//最多的巧克力蛋糕数量
{
if((i*250+j*200)<=mf&&(i*75+j*150)<=t&&(i*100+j*150)<=hy&&i<=100&&j<=100)//是否符合原料要求
{
sum=i*400+j*450;//money
if(sum>msum)
msum=sum;//打擂台
}
}
cout<<msum;
return 0;
}
2.【找和最接近但不超过K的两个元素(第二题)】
【题目描述】
在一个长度为n(1 < n < 1000)的整数(0至1000之间)序列中,选出两个元素使得它们的和最接近但不超过K(0 <= K < 2000)。保证一定存在不超过K的两元素和。
【输入】
第一行输入一个整数n 第二行输入一个整数K 第三行输入序列,用空格分开
【输出】
最接近但不超过K的和
【输入样例】
4 7 1 2 2 8【输出样例】
4
#include<bits/stdc++.h>//枚举
using namespace std;
int main()
{
int n,k,sum,msum=0;//msum表示最接近但不超过K的和
int s[1002];//存元素
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
scanf("%d",&s[i]);//输入
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(i==j)//下角标不可以一样
continue;
sum=s[i]+s[j];//现在的和
if(sum<=k/*不超过K*/&&sum>msum/*比最大值大*/)//合起来就是判断现在的和是不是最接近但不超过K的和
msum=sum;//最大值赋值给他
}
printf("%d",msum);//输出最接近但不超过K的和
return 0;
}
3.【数根】
【题目描述】
数根可以通过把一个数的各个位上的数字加起来得到。如果得到的数是一位数,那么这个数就是数根。如果结果是两位数或者包括更多位的数字,那么再把这些数字加起来。如此进行下去,直到得到是一位数为止。 比如,对于24来说,把2和4相加得到6,由于6是一位数,因此6是24的数根。再比如39,把3和9加起来得到12,由于12不是一位数,因此还得把1和2加起来,最后得到3,这是一个一位数,因此3是39的数根。
【输入】
一个正整数(小于101000)。
【输出】
一个数字,即输入数字的数根。
【输入样例】
24【输出样例】
6
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;//用来存储
cin>>n;
int w;//用来计算
while(n>=10)//不为一位数
{
w=n;//n的值赋值给w,让w计算
n=0;
while(w!=0)//数位分离
{
n+=w%10;//加上每一位的数字
w/=10;
}
}
cout<<n;//输出一位数
return 0;
}
4.【迷信的病人】★★★★★
【题目描述】
医院为了方便对患者进行建档和管理,引入了9位整数ID号来标识每个病人。最近医院入住了一个迷信的病人,他认为ID号的好坏直接决定了自己的命运。他对ID号x有如下要求:
(1)x的前三位数构成的整数是素数
(2)x的后三位数构成的整数是平方数(所谓平方数,是指它是某一个正整数的平方,e.g. 1,4,9,16...)
(3)x中不包含"13"
为了避免不必要的医患矛盾,医院须尽量满足他的需求。现给定正整数区间[m,n],请你判断存在几个满足病人需求的ID号。【输入】
两个正整数m,n,以空格隔开。(999999999>=n>=m>=111111111)
【输出】
一个整数(满足要求的ID的个数)。
【输入样例】
157689476 157689687【输出样例】
5【样例解释】
存在5个满足要求的ID:157689484,157689529,157689576,157689625,157689676
#include<bits/stdc++.h>//这一道题的思路为把九位数分为三个部分,先判断前三位是不是素数,在判断后三位是不是平方数,最后判断有没有13.
using namespace std;
bool zs(int n)//判断n是不是素数
{
if(n<2) return 0;
for(int i=2;i*i<=n;i++)
if(n%i==0)
return 0;
return 1;
}
bool check(int n)//判断n是不是含有13
{
int a=0,b;
while(n!=0)
{
n/=10;
if(n%100==13)
return 0;
}
return 1;
}
int main()
{
int m,n,i,cnt=0;
int a[1010],aa=0,b[1010],bb=0;//aa为素数个数,bb为平方数个数
scanf("%d%d",&m,&n);
for(i=101;i<1000;i++)
{
if(zs(i)==1)
{
a[aa]=i;//如果是,存在a数组里
aa++;
}
}
bb=31;
for(int i=1;i<=31;i++)
b[i]=i*i;
int shu=0;
for(i=0;i<aa;i++)//枚举素数
{
for(int j=0;j<1000;j++)//枚举中间数
{
for(int k=1;k<=bb;k++)//枚举平方数
{
shu=a[i]*1000000+j*1000+b[k];//把这个数算出来
if(shu>=m&&shu<=n&&check(shu))//如果是好的ID号
cnt++;计数器加1
}
}
}
printf("%d",cnt);//输出个数
return 0;
}
以上就是2022年6月中国电子学会C语言编程考试3级试题
请点赞+关注