程序基本算法习题解析 用分治法设计一个算法,统计输入的非空字符串中给定字符的个数

首先附上一般思路的代码(不用分治法,将输入字符串中的字符从前往后依次比对):

// Chapter7_1.cpp : Defines the entry point for the application.
// 用分治法设计一个算法,统计输入的非空字符串中给定字符的个数

#include "stdafx.h"
#include<iostream>
#include<string>
using namespace std;

//普通方法
int main()
{
	string str;
	char ch;
	int count = 0;
	cout << "输入字符串:";
	getline(cin,str); //需要敲两下回车才能到下一行,换成cin就跳过输入查找字符的过程,直接显示查找字符数目结果???
	cout << "输入查找字符:";
	cin >> ch;
	getchar();
	for(int i=0;i<str.size();i++)
	{
		if(str[i] == ch)
			count++;
	}
	cout << "查找字符数目:" << count << endl;
	system("pause");
	return 0;
}

 运行结果如下:

可以看到,输入字符串后,需要敲两下回车才能进入到下一句提示语,我试过在 getline(cin,str); 后加cin.get(), cin.ignore, putchar('\n'),都不能解决这个问题,希望知道这个问题的大神能够指点一二。

再用分治法做一遍。

分治法求解问题时包含两个过程:一是不断把大问题划分为一系列相同且独立的小问题,直至这些小问题可以直接求解为止。二是求解这些小问题并将所有小问题的解合并得到大问题的解。上述第一个过程就是“分”,第二个过程则是“治”。

本题思路是这样的:不断将非空字符串划分为子字符数组,直至子字符数组中仅包含1个字符(“分”的过程),然后判断这个字符是否是给定字符,如果是则返回1,否则返回0。之后不断累加这些返回值(“治”的过程)直至得到最终的结果。

画一张示意图看一下:

代码如下:

#include "stdafx.h"
#include<iostream>
#include<string>
using namespace std;

const int strSize = 100;
int countChar(char str[],char ch,int Begin,int End)
{
	int Left,Right;
	if(Begin == End)
		return (str[Begin] == ch);
	else
	{
		Left = countChar(str,ch,Begin,(Begin+End)/2);
		Right = countChar(str,ch,(Begin+End)/2+1,End);
		return Left+Right;
	}
}
int main()
{
	char str[strSize],ch;
	int count=0;
	cout << "输入字符串:";
	cin.getline(str,strSize);
	cout << "输入查找字符:";
	cin >> ch;  
	count = countChar(str,ch,0,strSize-1);
	cout << "查找字符数目:" << count << endl;
	system("pause");
	return 0;
}

运行结果如下:

扫描二维码关注公众号,回复: 4547697 查看本文章

两个程序中,输入字符时,用到了cin, cin.getline(), getline(),很多初学者含混不清(我也含混不清(o(╥﹏╥)o)),推荐一篇我认为把这几个函数讲解得比较清楚的博文:

C++中的cin, cin.getline, getline等混合使用时不能输入直接执行下一行的问题

猜你喜欢

转载自blog.csdn.net/elma_tww/article/details/85045758