【算法入门经典】 第三章



习题3-1 分数统计(stat)

1.

#include <iostream>
#include <fstream>
#include <set>
using namespace std;

int main()
{
	int a[101];
	bool b[101];
	memset(a,0,sizeof(a));
	memset(b,false,sizeof(b));
	ifstream cin("in.txt");
	int f;
	while(true)
	{
		cin>>f;
		if(f==-1)
			break;
		a[f]++;
	}
	int max = 1;
	for(int i=1;i<101;i++)
	{
		if(a[i]>a[max])
			max=i;
	}
	for(int i=1;i<101;i++)
	{
		if(a[i] == a[max])
			cout<<i<<endl;
	}
}

2.

#include <iostream>
#include <fstream>
#include <set>
#include<map>
using namespace std;

int main()
{
	map<double,int> m;
	ifstream cin("in.txt");
	while(true)
	{
		double f;
		cin>>f;
		if(f==-1)
			break;
		map<double,int>::iterator it;
		it = m.find(f);
		if(it==m.end())
		{
			m.insert(make_pair(f,1));
		}
		else
		{
			it->second++;
		}
	}
	map<double,int>::iterator it;
	double maxNum = m.begin()->second;
	double max = m.begin()->first;
	for(it=m.begin();it!=m.end();it++)
	{
		if(it->second>maxNum)
		{
			maxNum = it->second;
			max = it->first;
		}
	}
	for(it=m.begin();it!=m.end();it++)
	{
		if(it->second==maxNum)
			cout<<it->first<<endl;
	}
}

此类问题用map解决更加容易。 此处注意set中find()的用法,找到键值返回对应的索引位置,找不到返回set.end()的指针索引



习题3-2 单词的长度 (word)

#include <iostream>
#include <fstream>
#include <set>
#include<map>
using namespace std;

int main()
{
	int all=0;
	char w[100];
	int count=0;
	while(cin>>w)
	{
		if(!strcmp(w,"-1"))
			break;
		all+=strlen(w);
		count++;
	}
	cout<<all/count<<endl;
}


习题3-3 乘积的末三位

#include<iostream>
#include<map>
#include<vector>
using namespace std;

void del(char* a,int i)
{
	for(int j=i;a[j]!='\0';j++)
		a[j]=a[j+1];
}

int main()
{
	vector<char*> v;
	
	while(true)
	{
		char* tmp = new char[100];
		cin>>tmp;
		if(strcmp(tmp,"-1")==0)
			break;
		for(int i=0;tmp[i]!='\0';i++)
		{
			if(tmp[i]<='Z'&&tmp[i]>='A')
			{
				del(tmp,i);
				i--;
			}
		}
		v.push_back(tmp);
	}
	int r = 1;
	for(int i=0;i<v.size();i++)
	{
		int m = r*atoi(v[i]);
		r = m%1000;
	}
	cout<<abs(r)<<endl;
}


习题3-4 计算器

#include <iostream>
#include <fstream>
#include <set>
#include<map>
using namespace std;



int main()
{
	int a,b,result;
	char c;
	while(cin>>a>>c>>b)
	{
		switch(c){
		case '+':
			cout<<a+b<<endl;
			break;
		case '-':
			cout<<a-b<<endl;
			break;
		case '*':
			cout<<a*b<<endl;
			break;
		}
	}
}

此题输入很巧妙,自动识别了


习题3-5 旋转

#include <iostream>
#include <fstream>
#include <set>
#include<map>
using namespace std;



int main()
{
	int n;
	cin>>n;
	cout<<"Enter the array: ";
	char* input = new char[n];
	for(int i=0;i<n*n;i++)
		cin>>input[i];
	char** a = new char*[n];
	

	for(int i=0;i<n;i++)
		a[i] = new char[n];
	
	int index = 0;
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
			a[i][j] = input[index++];
	}
	char** b = new char*[n];
	for(int i=0;i<n;i++)
		b[i] = new char[n];
	char* c= new char[n*n];
	int count = 0;
	for(int j = n-1;j>=0;j--)
	{
		for(int i = 0;i<n;i++)
		{
			int tmp = c[count++] = a[i][j];
		}
	}
	count = 0;
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
			b[i][j] = c[count++];
	}
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
			cout<<b[i][j]<<' ';
		cout<<endl;
	}
}

习题3-6 进制转换1

#include<iostream>
#include<vector>
using namespace std;

int main()
{
	vector<int> result;
	int b,n;
	cin>>b>>n;
	int div = b;
	int count = 0;
	while(n!=0)
	{
		result.push_back(n%b);
		n = n/b;
		div = b*div;
	}
	for(int i=result.size()-1;i>=0;i--)
		cout<<result[i]<<' ';
	return 0;
}

习题3-7 进制转换2

#include<iostream>
#include<vector>
using namespace std;

int main()
{
	int n;
	int b;
	cin>>b>>n;
	int r=0;
	int div = 1;
	while(n!=0)
	{
		r+=n%10*div;
		div*=b;
		n/=10;
	}
	cout<<r<<endl;
}

习题3-8 手机键盘

#include<iostream>
#include<map>
using namespace std;

int main()
{
	map<char,int> m;
	for(int i=0;i<18;i++)
		m.insert(make_pair(char(97+i),i%3+1));
	m.insert(make_pair('s',4));
	m.insert(make_pair('t',1));
	m.insert(make_pair('u',2));
	m.insert(make_pair('v',3));
	m.insert(make_pair('w',1));
	m.insert(make_pair('x',2));
	m.insert(make_pair('y',3));
	m.insert(make_pair('z',4));
	char input[100];
	cin>>input;
	map<char,int>::iterator it;
	for(int i=0;input[i]!='\0';i++)
	{
		it = m.find(input[i]);
		cout<<input[i]<<it->second;
	}
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值