算法练习-蓝桥杯练习系统-算法训练-ALGO-246 猴子吃包子(※包括对于C++中格式控制输出的小总结)
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
从前,有一只吃包子很厉害的猴子,它可以吃无数个包子,但是,它吃不同的包子速度也不同;肉包每秒钟吃x个;韭菜包每秒钟吃y个;没有馅的包子每秒钟吃z个;现在有x1个肉包,y1个韭菜包,z1个没有馅的包子;问:猴子吃完这些包子要多久?结果保留p位小数。
输入格式
输入1行,包含7个整数,分别表示吃不同包子的速度和不同包子的个数和保留的位数。
输出格式
输出一行,包含1个实数,表示吃完所有包子的时间。
样例输入
4 3 2 20 30 15 2
样例输出
22.50
数据规模和约定 0<x<100;0<y<100;0<z<100;0<x1<=1000000;0<y1<=10000000;0<z1<=10000000;0<p<=1000
CPU使用:0ms
内存使用:2.601MB
#include <iostream>
#include <iomanip> //注意setprcision的头文件
using namespace std;
int main (){
double x,y,z,x1,y1,z1,p;
cin>>x>>y>>z>>x1>>y1>>z1>>p;
double ans = x1/x+y1/y+z1/z;
cout.setf(ios::fixed); //控制小数点几位,不足补零。
cout<<setprecision(p)<<ans<<endl;
return 0;
}
setprecision(p)
作用为控制保留p位有效数字,不足的位数不会自动补零。- 自动补全零需要加上上面那一句
cout.setf(ios::fixed);
。 - 加上这一句,整体的作用就与有效数字无关(与整数部分无关),p 仅仅控制小数部分位数。
- 头文件
#include <iomanip>
,manip是manipulator(操纵器)的缩写。详细介绍见文章末尾
有效数字:对于一个近似数,从左边第一个不是0的数字起,到精确到的位数止,所有的数字都叫做这个数的有效数字。(需要注意科学计数法)
举例:
0.0109,前面两个0不是有效数字,后面的1,0,9均为有效数字(注意,中间的0也算) 3.109*10^5(3.109乘以10的5次方)中,3,1,0,9均为有效数字,后面的10的5次方不是有效数字
5200000000,全部都是有效数字.
0.0230,前面的两个0不是有效数字,后面的2,3,0均为有效数字(后面的0也算)
C++输入输出的控制(#include < iomanip>)
对#include <iomanip>
的总结,具体参考链接如下:
#include中的iomanip的一些用法 作者:无鞋童鞋
-
主要是对cin,cout之类的一些操纵运算子,比如setfill,setw,setbase,setprecision等等。它是I/O流控制头文件,就像C里面的格式化输出一样,常见函数如下:
-
设置域宽
setw(N)
,设置输出的总长度,不足N的在前面补空格,为了输出的数据整齐。
cout<<setw(N)<<result<<endl;
- 输出八进制、十六进制、十进制、二进制
(自己还需要熟悉具体实现方法,写过的进制转换代码贴在最后)
dec
置基数为10 相当于"%d"
hex
置基数为16 相当于"%X"
oct
置基数为8 相当于"%o" - 二进制 需要另一个头文件
#include <tset.h>
中的bitset()
函数,它可以将十进制转化成为二进制
//输出某个数的八进制形式
cout<<oct<<25<<endl;
//输出:31
- 填充字符
setfill(char c)
,setfill就是在预设宽度中,如果已存在没有用完的宽度大小,则用字符c填充。配合setw一起使用。
cout<<setfill('a')<<setw(5)<<25<<endl;
//运行结果为:aaa25。
- 进制转换
setbase(int n)
,将某一个十进制数转换为一个八进制或十六进制的数,n为8或16。 - 任意进制的转换需要用到
stdlib.h
头文件中char* itoa(int value, char* string, int jinzhi)
函数。 - 控制输出流的精度
setprecision(int n)
,详细用法见本算法题。
进制转换代码实现
待贴全
//十六进制数转八进制
/*
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出n行,每行为输入对应的八进制正整数。
输入的十六进制数不会有前导0,比如012A。(本来八进制前导0x)
输出的八进制数也不能有前导0。
*/
void SixtoTwo(string s){
std::map<char,string> m;
m['0'] = "0000";
m['1'] = "0001";
m['2'] = "0010";
m['3'] = "0011";
m['4'] = "0100";
m['5'] = "0101";
m['6'] = "0110";
m['7'] = "0111";
m['8'] = "1000";
m['9'] = "1001";
m['A'] = "1010"; //10
m['B'] = "1011"; //11
m['C'] = "1100"; //12
m['D'] = "1101"; //13
m['E'] = "1110"; //14
m['F'] = "1111"; //15
int len = s.size();
int i = 0;
string ans1;
while(i<len){
string temp = m[s[i]]; //16进制转换2进制
ans1 += temp;
i++;
}
map<string,char> mm;
mm["001"] = '1';
mm["000"] = '0';
mm["010"] = '2';
mm["011"] = '3';
mm["100"] = '4';
mm["101"] = '5';
mm["110"] = '6';
mm["111"] = '7';
len = ans1.size();
if(len%3!=0){//补0
s = s.insert(0,3-(len%3),'0');
len += 3-(len%3);
}
char ans[len/3];
for(int i = 0,j = 0; i<len; ++j){
string temp = s.substr(i,3);
ans[j] = mm[temp];
i += 3;
}
char *ss = ans;
while(*ss=='0')++ss;
cout<<ss<<endl;
}
int main(){
int n = 0;
while(n<1||n>10) cin>>n;
string a[n]; //字符串
string b[n];
for(int i = 0; i<n; ++i){
cin>>a[i];
while(a[i].size()>=100000) cin>>a[i];
}
for(int i = 0; i<n; ++i){
SixtoTwo(a[i]);
}
return 0;
}
//十进制转十六进制
int main(){
int ten = -1;
while(ten<0||ten>2147483647) cin>>ten; //2147483647
if(ten>=0&&ten<=15) {
char c = (ten%16)<=9 ? ten%16+48 : ten%16+55;
printf("%c",c);
return 0;
}
char *six = new char;
char *p = six;
int len = 0;
while(ten>=1){
char c = (ten%16)<=9 ? ten%16+48 : ten%16+55;
*six = c;
ten /= 16;
if(ten>=1) six++;
len++;
}
char ans[len];
for(int i = len-1; i>=0; --i){
ans[i] = *p;
p++;
}
printf("%s",ans);
return 0;
}