AI智能
改变未来

算法练习-蓝桥杯练习系统-算法训练-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\"; //10m[\'B\'] = \"1011\"; //11m[\'C\'] = \"1100\"; //12m[\'D\'] = \"1101\"; //13m[\'E\'] = \"1110\"; //14m[\'F\'] = \"1111\"; //15int 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){//补0s = 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; //2147483647if(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) 打赏
未经允许不得转载:爱站程序员基地 » 算法练习-蓝桥杯练习系统-算法训练-ALGO-246 猴子吃包子(※)