关于acm程序设计书中题目 #J #K #L

#J

J提要求是把全有大写字母表示的字符串按照A>B,B>C,,,Z>A的形式变换。

这个题相当简单,只需要一个strng ,然后以为一位换就可以了,中间判断一个是否为Z,是就变为A,不是就++。

值得注意的一点是:

输出格式的问题,题目中要求输出 #String n,中间空格容易忽略!!!

代码如下:

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n,i,j;
	cin>>n;
	string s;
	for(i=1;i<=n;i++)
	{
		cin>>s;
		for(j=0;j<s.size();j++)
		{
			if(s[j]=='Z') s[j]='A';
			else s[j]++;
		}
		cout<<"String #"<<i<<endl<<s<<endl<<endl;
	}
	
	return 0;
 }


#K

K题目要求输入一个数组,使每个数都变成他们的平均数大小,且每次只能从大于平均数的数上减掉1在加给小于平均数的数,求最少变化几次。

这个题仔细分析后发现,小于平均数的书一定会+1,+1,,加到等于平均数为止,共x次。大于平均数的数也会—1,—1,,减到等于平均数为止,共y次。显然x=y,且为答案。至于要一个for循环就能够解决问题。

代码如下:

 
#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n,i,j=1,m,aver,sum,s;
	vector<int>v;
	while(cin>>n&&n!=0)
	{
		sum=0;
		s=0;
		for(i=0;i<n;i++)
		{
			cin>>m;
			v.push_back(m);
			sum+=m;
		}
		aver=sum/n;
		for(i=0;i<n;i++)
		{
			while(v[i]<aver)
			{	v[i]++;	s++;	}
			while(v[i]>aver)
			{	v[i]--;	s++;	}
		}
		v.clear();
		cout<<"Set #"<<j<<endl<<"The minimum number of moves is " <<s/2<<"."<<endl;
		cout<<endl;
		j++;
	}
	return 0;
 }


#L

L题我做了12遍,并不是因为这题难,而是我提交时系统默认为C (gcc 4.7.2),而我没有注意看,知道实在不相信又错了,在突然看见的,在这里记下来提醒自己!!!

该题让输入一段话,倒序输出。

只需要一个reverse(s.begin,s.end) 函数就完了。

但是考虑到一句话中间包含空格,输入应该采用 getline(cin,s)来输入,再输入过程中,我发现getline()使用时会把输入n后的空格给读入,以致只能读入n-1个s,试了几遍都这样,课本上有没有相关知识,只好百度,,,,前面的读入空格什么的也是百度出来的,,,解决办法是前面加一个cin.sync(),或者cin.get()。

代码如下:

#include<bits/stdc++.h>
using namespace std;
int main()
{
	string s;
	int n,i;
	cin>>n;
	cin.sync();
	for(i=0;i<n;i++)
	{
		getline(cin,s);
		reverse(s.begin(),s.end());
		cout<<s<<endl;
		s.clear();
	}	
	return 0;
}





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值