北航计算机机试2012

//vc++fushic18
1.分解整数
某些整数能分解成若干个连续整数的和的形式,例如
15 = 1 + 2+3+4+5 
15 = 4 + 5 + 6
15 = 7 + 8
某些整数不能分解为连续整数的和,例如:16
输入:一个整数N(N <= 10000)
输出:整数N对应的所有分解组合,按照每个分解中的最小整数从小到大输出,每个分解占一行,每个数字之间有一个空格(每行最后保留一个空格);如果没有任何分解组合,则输出NONE。
样例输入:
15
16
样例输出:
1 2 3 4 5
4 5 6
7 8
NONE

#include<stdio.h>
int main(){
	int begin,end,n,f=0;
	while(scanf("%d",&n)!=EOF){//多次输入
		for(begin=1;begin<n;begin++){
			for(end=begin+1;end<n;end++){
				if((begin+end)*(end-begin+1)/2==n){//找到了连续序列
					f=1;//找到的标志
					int i;
					for(i=begin;i<=end;i++){
						printf("%d ",i);
					}
					printf("\n");
				}
			}
		}
		if(f==0)printf("NONE");
	}
	return 0;
}

2.小岛面积
1 1 1 1 1 1
1 1 0 0 0 1
1 0 0 0 1 0
1 1 0 1 1 1
0 1 0 1 0 0
1 1 1 1 1 1
上面矩阵的中的1代表海岸线,0代表小岛。求小岛面积(即被1中包围的0的个数)。注意:仅求这样的0,该0所在行中被两个1包围,该0所在列中被两个1包围。
输入:
第一行输入一个整数N,表示输入方阵的维数,输入一个N维方阵
输出:
小岛面积
样例输入:
6
1 1 1 1 1 1
1 1 0 0 0 1
1 0 0 0 1 0
1 1 0 1 1 1
0 1 0 1 0 0
1 1 1 1 1 1
样例输出:
8

//需要注意不能将行和列的记录数组初始化为0,因为当为0时有确切意思:第0个位置是数组第一个1所在的位置
#include<stdio.h>
#include<string.h>
const int maxn=101;
int a[maxn][maxn];
int row[maxn][2];//记录每一行的最开始的1的位置和最后的1的位置(夹在中间的都算作岛的面积)
int col[maxn][2];//同上,记录每一列..
int main(){
	int n,i,j;
	while(scanf("%d",&n)!=EOF){
//memset:将已开辟内存空间s的首n个字节的值设为值c,memset(void *s,int c,size_t n)
		memset(row,-1,sizeof(row));//初始化
		memset(col,-1,sizeof(col));
		for(i=0;i<n;i++){//读入数据
			for(j=0;j<n;j++){
				scanf("%d",&a[i][j]);
				if(a[i][j]==1){//边界
					if(row[i][0]==-1)//左边界,行边界
						row[i][0]=j;
					if(col[j][0]==-1)//上边界,列边界
						col[j][0]=i;
					row[i][1]=j;//右边界,随j不断变化
					col[j][1]=i;//下边界	
				}
			}
		}
	//	for(int m=0;m<n;m++){//查看边界是否正确
		//	printf("%d%d%d%d\n",row[m][0],row[m][1],col[m][0],col[m][1]);
	//	}
		int cnt=0;
		for(i=0;i<n;i++){
			for(j=0;j<n;j++){
				if(a[i][j]==0){
					if(row[i][0]<j&&row[i][1]>j&&col[j][0]<i&&col[j][1]>i){
						cnt++;
					}
				}
			}
		}
		printf("%d\n",cnt);
	}
	return 0;
}

3.统计关键字
输入一行标准c语言代码(字符个数小于300),统计出该字符串中关键字的if,while,for所在的位置,按照关键字出现的顺序依次输出。注意双引号内的不需要统计。
输入:一行标准c语言代码,字符个数小于300
输出:关键字if,while,for对应的位置,按照关键字出现的顺序依次输出。输出格式为:关键字,后跟冒号,然后是出现的位置。扫描到关键字就输出,每个输出占一行。
样例输入:
#include <stdio.h> int main() {int i = 0; if(i == 0) printf(“YES”); return 0;}
#include <stdio.h> int main() {int ifwhile = 0; int forif = 1;char if_for_while = ‘a’;char *str = “while”; while(ifwhile == 0) {ifwhile = 1;forif = 0;} if(forif == 0) {if_for_while = ‘b’;} if(ifwhile == 1) {if_for_while = ‘c’;} return 0;}
样例输出:
if:43
while:88
if:133
if:170

#include<stdio.h>
#include<string.h>
char s[302];

void deal(int i){
	if(s[i]=='"')
		while(s[i]!='"') i++;//不处理“”内容
	if(s[i]=='i'){
		if(s[i+1]=='f'&&(s[i+2]==' '||s[i+2]=='(')&&
			(s[i-1]==' '||s[i-1]=='}'||s[i-1]==')'||s[i-1]=='{'||s[i-1]==';') )
			printf("if:%d\n",i+1);
	}

	if(s[i]=='w'){
		if(s[i+1]=='h'&&s[i+2]=='i'&&s[i+3]=='l'&&s[i+4]=='e'
			&&(s[i+5]==' '||s[i+5]=='(')&&
			(s[i-1]==' '||s[i-1]=='}'||s[i-1]==')'||s[i-1]=='{'||s[i-1]==';') )
			printf("while:%d\n",i+1);
	}
	if(s[i]=='f'){
		if(s[i+1]=='o'&&s[i+2]=='r'
			&&(s[i+3]==' '||s[i+3]=='(')&&
			(s[i-1]==' '||s[i-1]=='}'||s[i-1]==')'||s[i-1]=='{'||s[i-1]==';') )
			printf("while:%d\n",i+1);
	}
}
int main(){
	freopen("text3.txt","r",stdin);//将输入事先写在文件中,放在项目文件夹下
	while(gets(s)){
//	gets(s);
		int len=strlen(s);
		for(int i=0;i<len;i++){
			deal(i);
		}
		printf("\n");
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值