算法练习-蓝桥杯练习系统-算法训练-ALGO-246 猴子吃包子(※)

算法练习-蓝桥杯练习系统-算法训练-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;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值