- 从键盘输入一行英文句子,句子中只有英文单词和空格,每个单词之间由若干个空格隔开,
英文单词由大小写字母组成,编程完成下列任务:
(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的返回值,在这里困了差不多半个小时。