1.小玉买文具
关于进制界限问题用乘法解决
班主任给小玉一个任务,到文具店里买尽量多的签字笔。已知一只签字笔的价格是 1 元 9 角,而班主任给小玉的钱是 a 元 b 角,小玉想知道,她最多能买多少只签字笔呢。
输入只有一行两个整数,分别表示 a 和 b。
输出一行一个整数,表示小玉最多能买多少只签字笔。
#include<stdio.h>
#include<math.h>
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a,b,c,d;
scanf("%d %d",&a,&b);
c=10*a+b;
d=floor((10*a+b)/(10*1+9));//价钱统一,向下取整
printf("%d",d);
return 0;
}
2.买铅笔
关于ceil:向下取整
题目描述
P老师需要去商店买n支铅笔作为小朋友们参加NOIP的礼物。她发现商店一共有 3种包装的铅笔,不同包装内的铅笔数量有可能不同,价格也有可能不同。为了公平起 见,P老师决定只买同一种包装的铅笔。
商店不允许将铅笔的包装拆开,因此P老师可能需要购买超过n支铅笔才够给小朋友们发礼物。
现在P老师想知道,在商店每种包装的数量都足够的情况下,要买够至少n支铅笔最少需要花费多少钱。
输入格式
第一行包含一个正整数n,表示需要的铅笔数量。
接下来三行,每行用2个正整数描述一种包装的铅笔:其中第1个整数表示这种包装内铅笔的数量,第2个整数表示这种包装的价格。
保证所有的77个数都是不超过10000的正整数。
输出格式
1个整数,表示P老师最少需要花费的钱。
输入输出样例。
输入: 输出:
57 54
2 2
50 30
30 27
#include<bits/stdc++.h>
#include<stdio.h>
#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
int n,a,b,c,d,e,f,sum,aa,cc,ee;
cin>>n;
cin>>a>>b;
cin>>c>>d;
cin>>e>>f;
aa=ceil(n*1.0/a)*b;//ceil括号内转换为浮点型
cc=ceil(n*1.0/c)*d;
ee=ceil(n*1.0/e)*f;
sum=aa;
if(cc<sum)sum=cc;
if(ee<sum)sum=ee;
cout<<sum;
return 0;
}
3.小鱼的航程(改进版)
关于用for循环使得循环每周而不是循环数字
题目背景
原来的题目太简单,现改进让小鱼周末也休息,请已经做过重做该题。
题目描述
有一只小鱼,它平日每天游泳 250 公里,周末休息(实行双休日),假设从周 x(1\le x \le 7)x(1≤x≤7) 开始算起,过了 n(n\le 10^6)n(n≤10
6
) 天以后,小鱼一共累计游泳了多少公里呢?
输入格式
输入两个整数x,n(表示从周x算起,经过n天)。
输出格式
输出一个整数,表示小鱼累计游泳了多少公里。
#include<cstdio>
int main()
{
int n,k,s=0;//周n开始游,过了k天,游了s公里
scanf("%d %d",&n,&k);
for(int i=1;i<=k;i++)//要游k天,所以用循环
{
if(n!=6 && n!=7) s+=250;//如果不是周末则加250
if(n==7) n=1;//如果是周7,那么赋值为1
else n++;//否则n+1
}
printf("%d",s);//输出游了多少公里
return 0;
}
4.三角函数
关于sort升序函数和__gcd最大公约函数的使用
题目描述
输入一组勾股数 a,b,c(a\neq b\neq c)a,b,c(a
=b
=c),用分数格式输出其较小锐角的正弦值。(要求约分。)
输入格式
一行,包含三个正整数,即勾股数 a,b,c(无大小顺序)。
输出格式
一行,包含一个分数,即较小锐角的正弦值
输入输出样例
#include<stdio.h>
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a[4],a1,a2;
for(int i=0;i<3;i++)
{
cin>>a[i];
}
sort(a,a+3);//升序函数
a1=a[0]/__gcd(a[0],a[2]);//__gcd:最大公约数函数
a2=a[2]/__gcd(a[0],a[2]);
cout<<a1<<"/"<<a2;
return 0;
}
5.分类平均
关于数学逻辑
题目描述
给定 n(n≤10000) 和)k(k≤100),将从 1 到 n 之间的所有正整数可以分为两类:A 类数可以被 k 整除(也就是说是 k 的倍数),而 B 类数不能。请输出这两类数的平均数,精确到小数点后 1 位,用空格隔开。
数据保证两类数的个数都不会是 0。
#include<bits/stdc++.h>
#include<stdio.h>
using namespace std;
int main()
{
int n,k,i;
int Asum=0,Bsum=0;
scanf("%d %d",&n,&k);
for(i=k;i<=n;i+=k)//i初值为k,每次加k,小于n可以算出A类的和
{
Asum+=i;
Bsum=(1+n)*n/2-Asum;//公式求出B类和
}
printf("%.1lf %.1lf",double(Asum)/(n/k),double(Bsum)/(n-n/k));//强制转换,n/k得到a类数量
return 0;
}
6.质数口袋
关于质数
题目描述
小 A 有一个质数口袋,里面可以装各个质数。他从 2 开始,依次判断各个自然数是不是质数,如果是质数就会把这个数字装入口袋。口袋的负载量就是口袋里的所有数字之和。但是口袋的承重量有限,不能装得下总和超过 L,1≤L≤10 的五次方
)的质数。给出 L,请问口袋里能装下几个质数?将这些质数从小往大输出,然后输出最多能装下的质数个数,所有数字之间有一空行。
输入格式
一行一个正整数 L。
输出格式
将这些质数从小往大输出,然后输出最多能装下的质数个数,所有数字之间有一空行。
#include<stdio.h>
#include<bits/stdc++.h>
using namespace std;
int main()
{
int l,s=0,load=0;
cin>>l;
for(int i=2;;i++)
{
int prime=1;
for(int j=2;j*j<=i;j++)
if(i%j==0){
prime=0;
break;
}
if(!prime) continue;
if(i+load>l)break;
cout<<i<<endl;
s++;
load+=i;
}
cout<<s;
return 0;
}
7.梦中的统计
关于用for取位数,统计出现次数
题目背景
Bessie 处于半梦半醒的状态。过了一会儿,她意识到她在数数,不能入睡。
题目描述
Bessie的大脑反应灵敏,仿佛真实地看到了她数过的一个又一个数。她开始注意每一个数码(0-9):每一个数码在计数的过程中出现过多少次?
给出两个整数 M 和 N 求每一个数码出现了多少次。
输入格式
第 1 行: 两个用空格分开的整数 M 和 N。
输出格式
第 1 行: 十个用空格分开的整数,分别表示数码 0-9在序列中出现的次数。
#include<stdio.h>
#include<bits/stdc++.h>
#define shu 205
using namespace std;
int main()
{
int m,n,a[15]={0};
cin>>m>>n;
for(int i=m;i<=n;i++)
{
for(int tmp=i;tmp;tmp/=10)//取一个数的最后一位(%10),再把它的最后一位扔掉,记录。然后再取新的最后一位,再把它扔掉,记录。循环直到这个数变成0(无法再取),
{
a[tmp%10]++;
}
}
for(int j=0;j<=9;j++)
{
cout<<a[j]<<" ";
}
return 0;
}
8.梦中的统计
关于数组判断去重
题目描述
珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术。珠心算训练,既能够开发智力,又能够为日常生活带来很多便利,因而在很多学校得到普及。
某学校的珠心算老师采用一种快速考察珠心算加法能力的测验方法。他随机生成一个正整数集合,集合中的数各不相同,然后要求学生回答:其中有多少个数,恰好等于集合中另外两个(不同的)数之和?
最近老师出了一些测验题,请你帮忙求出答案。
(本题目为2014NOIP普及T1)
输入格式
共两行,第一行包含一个整数n,表示测试题中给出的正整数个数。
第二行有n个正整数,每两个正整数之间用一个空格隔开,表示测试题中给出的正整数。
输出格式
一个整数,表示测验题答案。
#include<stdio.h>
#include<bits/stdc++.h>
#define shu 205
using namespace std;
int main()
{
int n,a[105],num[105]={0},ans=0;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<n;i++)
{
for(int j=i+1;j<=n;j++)
for(int k=1;k<=n;k++)
if(a[i]+a[j]==a[k] && num[k]==0)//数组判断去重
{
ans++;
num[k]=1;
}
}
cout<<ans;
return 0;
}