从键盘输入一行英文句子,句子中只有英文单词和空格,每个单词之间由若干个空格隔开,
英文单词由大小写字母组成,编程完成下列任务:
(1)统计并输出此句子中英文字母的个数; (10 分)
(2)统计并输出此句子中单词的个数; (10 分)
(3)查找此句子中出现次数最多的字母(不区分大小写,大小写字母是相同的)和次数。当出现最多的字符不止一个时,都能找到,并输出找到的所有字母及次数。(输出字母时大小写均可) (20 分)
例如,输入句子:This is An Pencil Case
则输出为:
字母个数:18
单词个数:5
最多的字母:i,s
出现的次数:3
解:统计个数在遍历中进行,统计单词也在遍历中进行,最后统计次数采用hash的思想进行。
#include<iostream> #include<string> using namespace std; int hash[26]={0};//hash数组统计单词出现次数 int main(){ string str; getline(cin,str); int letter=0,word=0,num=0; for(int i=0;i<str.size();i++){ int k=str[i]-'a',m=str[i]-'A'; if((0<=k&&k<=26)||(0<=m&&m<=26)){ if(i==0||str[i-1]==' '){ //判断是否是单词开始 letter++; word++; } else letter++; if(0<=k&&k<=26){ //统计次数,更新最大次数 hash[k]++; if(num<hash[k]) num=hash[k]; } else { hash[m]++; if(num<hash[m]) num=hash[m]; } } } cout<<"字母个数:"<<letter<<endl; cout<<"单词个数:" <<word<<endl; cout<<"最多的字母:"; for(int i=0;i<26;i++) if(hash[i]==num){ char c=i+'a' ; cout<<c<<" "; } cout<<endl; cout<<"出现的次数:"<<num<<endl; return 0; }
运行结果
十二进制是数学中一种以 12 为底数的计数系统,它由 0~9,a,b 组成,与十进制的队友关系是:0~9 对应 0~9,a 对应 10,b 对应 11。例如,十二进制的 a2,十进制是 122。输入一个仅含十二进制数字的字符串(字母一律小写,不超过 8 个字符),完成下列任务:
(1)输出该十二进制数每一位对应的十进制数(从高位到低位顺序输出,空格隔开);
(2)实现“十二进制”转“十进制”算法,输出该十二进制数对应的十进制数;
(3)输出转换后的十进制数在内存中的每个二进制位(共 4 字节,每字节之间空格隔开)。
例如,输入十二进制数:a2
则输出为:
10 2
122
00000000 00000000 00000000 01111010
思路:前两个问题简单,最后一个问题可以建立起一个空间为32的数组存储10进制转换为2进制的数字。
using namespace std; int num[8];//存储每个字符对应12进制大小 int a[33]={0};//存储二进制数 int main(){ string str; getline(cin,str); for(int i=0;i<str.size();i++) //将字符转化为对应大小 { if(str[i]=='a')num[i]=10; else if(str[i]=='b')num[i]=11; else num[i]=str[i]-'0'; } int sum=0; for(int i=0;i<str.size();i++){ //1,2 问 sum=sum*12+num[i]; cout<<num[i]<<" "; } cout<<endl<<sum<<endl; int k; for(int i=32;sum>0;i--){ //二进制转化 a[i]=sum%2; sum=sum/2; } for(int i=1;i<=32;i++) { cout<<a[i] ; if(i%8==0)cout<<" "; } cout<<endl; return 0; }
运行结果:
题目如上所述。
这里复杂在小数部分的处理,如何处理判断循环节,我们需要手动模拟 除法求小数的过程。这里利用map来标记循环节出现的位置。
#include<iostream> #include<map> using namespace std; int a[101];//用来储存小数部分 map<int,int>b;// 用来标识循环节和起始位置 void generatep(int n,int d) { b.clear(); int k=n/d,tag=1;//保存整数部分 int mod=n%d;//小数部分 int s=0,e;//记录循环节起始位置 for(int i=0;mod;i++) { mod=mod*10; if(b[mod]){ //起始位置需要手动判断 因为key值不存在返回0 tag=0; s=b[mod]; break; } if(mod/d==a[0]) {//判断循环节是否在开始位置 s=0; tag=0; break; } a[i]=mod/d; b[mod]=i; mod=mod%d; e=i; } if(!tag){ cout<<k<<"."; for(int i=0;i<s;i++) cout<<a[i]; cout<<"("; for(int i=s;i<=e;i++) cout<<a[i]; cout<<")"<<endl; } else { cout<<k<<"."; for(int i=0;i<=e;i++) cout<<a[i]; cout<<endl; } } int main(){ int n,d; for(int i=0;i<3;i++) { scanf("%d/%d",&n,&d); generatep(n,d); } }
这里指得注意的是map的返回值,在这里困了差不多半个小时。