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

    技术2025-11-16  4

    算法练习-蓝桥杯练习系统-算法训练-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; }
    Processed: 0.023, SQL: 9