东华OJ复试题——11-20题

11 单词统计

问题描述 :
输入一行字符,用函数编程统计其中有多少单词。
说明:以空格分隔开的任何字符串都认为是单词。比如“I’m”认为是一个单词
统计单词个数的函数原型为:int CountWords(char str[]);

输入说明 :
输入一行字符,最多能从键盘输入20个字符,单词之间以空格分开。

输出说明 :
输出一个单词个数(一个整数)。
输入范例 :
How are you
输出范例:
3

#include<iostream>
#include<stdlib.h>/*11 单词统计*/
#include<cstring>
#include<cstdio>
using namespace std;
int main(){
	
	int n,i,len,count;
	char a[51];
	
	cin>>n;
	getchar();       //要删掉一个换行; 
	while(n--)
	{
		gets(a);
		len=strlen(a);
		count=0;
		for(i=0;i<len;i++)
		{
			if(a[i]!=' '&&a[i+1]==' ')    //只要一个有一个没有就好了; 
				count++;
		}
		if(a[len-1]!=' ')  //再加上最后一个单词的情况; 
			count++;
		cout<<count;
		if(n!=0) cout<<endl;
	}
	return 0;
}

12 倒数和

在这里插入图片描述

#include<iostream>
#include<stdlib.h>
#include<cstring>
#include<cstdio>        /*12 倒数和*/
using namespace std;
int main(){
	int i,m,n;
	char str[201],b[201];
	while(gets(str))
	{
		int len=strlen(str);
		float sq;
		int k=0;
		float sum=0;
		for(i=0;i<len;i++)
		{
			if(str[i]>'0' && str[i]<='9')
			{
				sq=1.00/float(str[i]-'0');    //记得转换; 
				sum+=sq;
				b[k++]=str[i];
			}
		}
		if(sum==0) cout<<"0"<<endl;
		else
		{
				for(int j=0;j<k;j++)
		{
			cout<<"1/"<<b[j];
			if(j!=k-1) cout<<"+";
			else cout<<"=";
		}
		   printf("%.2f\n",sum);
		}
	
	}	
	
	return 0;
}
/*从键盘输入一串字符串(包含空格),将输入字符串中的所有数字(0除外)的倒数相加,列出算式,并输出最后的结果。如果除0外没有数字字符,则输出数字0。*/

13 幸运偶数

问题描述 :

从键盘上输入一个整数(长度不大于200),将其各位上为奇数的数字去除,剩余的数字按数字大小从大到小排序,组成一个新的数,并输出到屏幕上。

输入说明 :

你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据仅占一行,每行有一个整数,整数的长度不大于200。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。

输出说明 :

对于每一组测试数据,你写的程序要求计算出一组相应的计算结果,并将这一组计算结果作为你所写程序的输出数据依次写入到标准输出设备中。每组运算结果单独形成一行数据,其行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间没有任何空行,第一组运算结果前面以及最后一组运算结果后面也都没有任何空行。若全为奇数,输出结果为“None”。注:通常,显示屏为标准输出设备。
输入范例:
276238496
13579
输出范例:
866422
None

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int cmp(int x,int y)
{
	return x>y;
}
int main()
{
	char str[202],neww[202];
	int m,n,i;
	while(gets(str))
	{
		int len=strlen(str),k=0;
		for(i=0;i<len;i++)
		{
			if(str[i] %2 == 0) neww[k++]=str[i];
		}
		if(k==0) cout<<"None"<<endl;
		else{
			sort(neww,neww+k,cmp);
			for(i=0;i<k;i++)
			{
				cout<<neww[i];
				if(i==k-1) cout<<endl;
			}
		}
	}
	return 0;
}

14 转换成十进制

问题描述 :

编写一个程序,将一个2~20以内任意进制数转换成十进制。这些数据由数字0-9,大写字母A-J组成,其中A=10,B=11……J=19。例如16进制数5A转换为十进制数90(90=516+101)。

输入说明 :

程序需要输入多组数据,每组数据一行,每行有两个数,用空格隔开,分别表示当前进制数和被转换的数据。输入数据十进制数大小不会超过10000,例如:16 5A 表示将16进制数5A转换成10进制数。

输出说明 :

对于每行输入数据需输出一个结果。每个结果为一个十进制的数。例如:16 5A需输出结果90。
输入范例:
16 5A
2 1111111
输出范例:
90
127

/*14 转换成十进制*/

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;

int main()
{
//	char str[101];
    string str;
	int m,n,i;
	while(cin>>n>>str)
	{
		
		int len=str.length();
		//cout<<len<<endl;
		int sum=0,k=0;      //k在这里也很重要; 
		for(i=len-1;i>=0;i--,k++)
		{	
			if(str[i] >='A' && str[i]<='J')
			      sum+=pow(n,k)*(str[i]-55);
			else  
			{
				sum+=pow(n,k)*(str[i]-'0');
			//	cout<<sum<<endl;
			}
		}
		cout<<sum<<endl;
	}
	return 0;
}

15 十进制转换成其它进制

者: Turbo时间限制: 1S章节: 字符串

问题描述 :

编写一个程序,将一个十进制数转换成任意的2~20以内的其他进制数。这些数据由数字0-9,字母A-J组成,其中A=10,B=11……J=19。例如90转换为16进制数为5A(90=516+101)。

#include<iostream>
#include<cstring>
using namespace std;
int n,r;
void print( int x )
{
     if( x <= 9 )
            cout<<x;
     else
         cout<<char(x - 10 + 'A');
 }
void change( int n,int r )
{
     if(n)
     {
         change(n/r,r);
        print(n % r);
     }
 }
int main( )
{
    while(cin>>n>>r) 
    {
    	change( n,r );
         cout<<endl;
	}
    return 0;
}

16 求反数字字符串

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

int main()
{
	string a;
	while(cin>>a)
	{
		int len=a.length();
		for(int i=len-1;i>=0;i--)
		{
			cout<<a[i];
		}
		cout<<endl;
	}
	return 0;
}

17 最大相同子串

作者: Turbo时间限制: 1S章节: 字符串

问题描述 :
输入两个字符串,获取两个字符串中最长相同子串并输出。

如果有多个相同子串,则输出(按ASCII排序)最小的那个“最长相同子串”。

如果无相同子串,则输出空字符串(即空行)。

输入说明 :
输入多组测试数据,每组测试数据包含两行。

每行包含一个字符串,字符串中无空格,也无空字符串。

输出说明 :
对于每组测试数据,输出最长子串。如果最长子串为空,则输出一个空行。

每组输出占一行,行首与行尾无多余空格,也无多余空行。

输入范例 :
abcded123456aabbcc
abcdaa1234
abcdabcdabcd
abcda

输出范例 :
1234
abcda

#include<stdio.h>
#include<cstring>
#include<iostream>
#include<string.h>
using namespace std;
#define max 1000

//返回str中从start位置开始的len个字符
void getsub(string str,int start,int len,char subs[]){
	int i,j=0;
	for(i=start;i<start+len;i++)
		subs[j++]=str[i];
	subs[j]='\0';                  //存到sub里; 
}

int main(){
	int i,j,k;
	string a,b; 
	char c[max],sub[max]={0};
	while(cin>>a){
		memset(sub,0,sizeof(sub));
		cin>>b;
		for(i=0;i<a.length();i++){
			for(j=0;j<b.length();){
				while(a[i]!=b[j]&&b[j]!='\0')
					j++;                         //直接暴力呀!! 
				if(b[j]=='\0')
					break;
				else{
					k=0;
					while(a[i+k]==b[j+k]&&a[i+k]!='\0'&&b[j+k]!='\0')
						k++;
					getsub(b,j,k,c);
					if(strlen(c)>strlen(sub)||(strlen(c)==strlen(sub)&&strcmp(c,sub)<0))
						strcpy(sub,c);        //判断sub; 
					j++;
				}
			}
		}
		puts(sub);
		//memset(a,0,sizeof(a));
	}
	return 0;
}

19 冰雹数

作者: Turbo时间限制: 1S章节: 循环

问题描述 :
任意给定一个大于1的正整数N,
如果是偶数,执行: N / 2
如果是大于1的奇数,执行: N * 3 + 1

生成的新的数字再执行同样的动作,循环往复。
通过观察发现,这个数字会一会儿上升到很高,
一会儿又降落下来。
就这样起起落落的,但最终必会落到“1”
这有点像小冰雹粒子在冰雹云中翻滚增长的样子。

比如N=9
9,28,14,7,22,11,34,17,52,26,13,40,20,10,5,16,8,4,2,1
可以看到,N=9的时候,这个“小冰雹”最高冲到了52这个高度。

输入一个整数M,请输出一个正整数,表示所有不大于M的数字N中,经过冰雹数变换过程中,最高冲到了多少。

注意:从2到M这M-1个数字中,每一个数字N都能得到一系列冰雹数,需要求得所有冰雹数的最大值。

输入说明 :
从标准输入设备输入一个正整数M(1<M<10000)

输出说明 :
输出一个正整数,表示结果。

输入范例 :
10

输出范例 :
52

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

int bingbao(int x)
{
    int max=0;
	while(x!=1)
	{
		if(x % 2 == 0) x=x/2;
		else 
		{
			x=x*3+1;
			if(x > max ) max=x;
		}
	}
	return max;
}

int main()
{
	int m,n,i;
	cin>>n;
	int maxx=0;
	for(i=2;i<=n;i++)
	{
		if(bingbao(i) > maxx) maxx=bingbao(i);
	}
	cout<<maxx<<endl;
	return 0;
}

20 小数第n位

作者: Turbo时间限制: 1S章节: 基本练习(循环)

问题描述 :
我们知道,整数做除法时,有时得到有限小数,有时得到无限循环小数。
如果我们把有限小数的末尾加上无限多个0,它们就有了统一的形式。

本题的任务是:在上面的约定下,求整数除法小数点后的第n位开始的3位数。

输入说明 :
一行,三个整数:a b n,用空格分开。a是被除数,b是除数,n是所求的小数后位置(0<a,b,n<1000000000)

输出说明 :
一行,3位数字,表示:a除以b,小数后第n位开始的3位数字。

比如输入:

1 8 3

则输出

500

输入范例 :
282866 999000 6

输出范例 :
914

#include<iostream>/*20 小数第n位*/
using namespace std;

int main(){
	int a,b,n,i;
	while(cin>>a>>b>>n){

	while(a>b){
		a%=b;
	}                     //先把整数部分搞掉; 
	i=0;
	while(i<=n+2){
		a*=10;
		i++;
		if(i>=n && i<=n+2)      //从n开始的后三位才输出; 
		{
			cout<<a/b;
		}
		a=a%b;     //模拟小数除而已; 
	}
	cout<<endl;	}
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值