第一题
从键盘输入一个英文句子,统计其中的单词个数,然后输出。出于方便考虑,本题所说的单词,是指仅由英文字母组成最长序列。下面样例中的U.S.理解为2个单词。假定句子不超过128个字符。
提示:对表示句子的字符串中的内容依次进行检查。应该需要一个变量来记录当前是否已经遇到一个单词。
输入样例:
On October 26, U.S. News & World Report released the 2022 Best Global Universities Rankings.
输出结果:
13
思路:
单词以字母开始以字母结束,只需要判断这个就可以了(注意字母的范围是A-Z和a-z,非字母的范围是小于A,大于Z且小于a,大于z)
代码:
#include
#include
int main()
{
char ch;
int count = 0;
while((ch = getchar()) != 'n')
{
if((ch <= 'z'&&ch >= 'a')||(ch <= 'Z'&&ch >= 'A'))
{
while(1)//无条件进入循环
{
ch = getchar();//这里的ch会覆盖掉最上面的那个ch
if((ch > 'z')||(ch < 'a'&&ch > 'Z')||(ch < 'A'))//非字母的范围
{
count++;//计数
break;//不管break在哪个位置,只要在循环里出现就可以跳出循环
}
}
}
}
printf("%dn",count);
return 0;
}
第二题
从键盘输入若干个从小到大排列的整数,再输入一个整数a,为了把a插入到该已经排序的整数序列中,需要从前往后或者从后往前依次查找应该插入的位置(如序列中存在相同整数,则插入到该整数之前。位置从1开始计数)。具体地说,如果序列中有n个元素,新来的a如果应该插入到第n个元素之前,则输出n。如果应该放在最后一个元素之后,则输出n+1。假定输入的整数序列中整数的个数不超过10。
在下面的样例中,第一行为将要输入的整数个数,第二行为输入的整数序列,第三行为要插入的数。
输入样例1:
5
0 3 4 7 8
6
输出结果1:
4
输入样例2:
5
0 3 4 7 8
9
输出结果2:
6
输入样例3:
4
1 3 4 8
-2
输出结果3:
1
思路:
不用管插入新数之后的数组,只需要确定新数插入的位置即可,做一个判断,如果遇到比输入的数大的数,直接打印该数在数组中的位置,并跳出循环(注意数组的下标从0开始),如果遇到的数一直都比输入的数大的话,直接打印数组中数的个数加一,过程中可用一个标记数。
代码:
#include
#include
int main()
{
int arr[10],i,a,x,tmp=0;
scanf("%d",&a);//确定数组中数的个数
for(i = 0;i {
scanf("%d",&arr[i]);
}//构造数组
scanf("%d",&x);//确定要输入的新数
for(i = 0;i {
if(x < arr[i])
{
printf("%dn",i+1);//因为数组的下标从0开始,所以这里打印的是i+1
tmp=1;//tmp做中间的判断量
break;//跳出循环
}
}
if(tmp==0)
printf("%dn",a+1);//注意这里不能用输入的x跟arr[n]比较,这里的arr[n]应该是个地址量,不 是整数型
return 0;
}
第三题
对于一个已经排序的序列,要查找某个数在其中的位置,并不需要按顺序逐一比较,可以找位于这个序列中间位置的元素,判断要查找的数在它之前还是之后,然后就可以缩小范围,这样做下去一定会确定是否找到,该方法被称为二分法。
从键盘输入若干个整数,对它们进行排序,然后再输入一个整数a,通过二分法查找a在之前排好序的整数序列中的序号(从1开始),打印该序号。如果没有找到,则打印no。
在下面的样例中,第一行为将要输入的整数个数,第二行为输入的整数序列,第三行为要查找的数。
假定输入的整数序列中整数的个数不超过40。
提示:因为二分查找算法相对独立,建议把二分查找写成一个函数,在main中进行调用
输入样例1:
5
0 8 7 3 4
6
输出结果1:
no
输入样例2:
6
9 2 6 4 8 7
6
输出结果2:
3
思路:
输入数的过程和第二题一样,但下面的部分看不明白
代码:
#include
#include
int main()
{
int k,n,i=0;
scanf("%dn",&n);
int arr[n];
for(;i
scanf("%d",&k);
int sz = sizeof(arr)/sizeof(arr[0]);
int left=0;
int right=sz-1;
while (left<=right)
{
int mid=(left+right)/2;
if(arr[mid]>k)
{
right=mid-1;
}
else if(arr[mid]
left=mid+1;
}
else
{
printf("%dn",mid+1);
break;
}
}
if(left>right)
printf("no");
return 0;
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)