XDOJ2018期末部分(含螺旋矩阵)

文章目录

  • 螺旋方阵
  • 公式求值
  • 进制转换
  • 上三角矩阵
  • 子串统计
  • 类似练习:字符串查找
  • 公式求值
  • 数位统计

螺旋方阵

问题描述
螺旋方阵是指一个呈螺旋状的矩阵,它的左上角元素为1,由第一行开始按从左到右,从上到下,从从右向左,从下到上的顺序递增填充矩阵,直到矩阵填充完毕,下图所示是一个5*5阶的螺旋方阵。输入螺旋方阵的阶数N,按行输出该螺旋方阵。
XDOJ2018期末部分(含螺旋矩阵)_第1张图片
输入说明
输入一个正整数N(1 输出说明
逐行输出N阶螺旋方阵的元素,元素之间用空格分隔。
输入样例
6
输出样例
1 2 3 4 5 6
20 21 22 23 24 7
19 32 33 34 25 8
18 31 36 35 26 9
17 30 29 28 27 10
16 15 14 13 12 11

分析:下面的代码捣鼓了快一个小时。。。。估计考场上我就挂了
忽略输出格式,我只是觉得长度5比较好看,实际上只要空格就行了

这个螺旋矩阵呢,无法找通项公式(找通项公式请见旋转矩阵题)所以必须模拟法,看赋值的过程,在中间寻找i,j的变化
方向变量t 控制+或者-
而每次步长呢,
n-1步,n-2步,n-3步… 那就靠循环控制了
注意:i,j是二维数组的下标,不能用来计数(所以新开num1,num2来计数)
这鬼题解释起来比较难。。。大概思路有了以后,可以写出大概程序,然后可能会有小错,比如下标越界之类,这些都靠调试解决

调试技巧:在循环中输出i,j的值,看哪里变错了,哪里越界了…然后进行一些调整

务必忽略字和像素。。。。

#include
int main()
{
     
    int n,i=0,j=0;
    int a[101][101]={
     0};
    int k=1;
    int num1,num2;//用于计数 
    int t=1;//代表方向
    scanf("%d",&n);
    num1=n-1;//控制大循环 
	for(j=0;j<n;j++) //第一行的特殊情况 
	{
     
		a[i][j]=k;
		k++;  	
	}
	j--;
	while(num1>0)
	{
     
		num2=num1;
		while(num2>0)
		{
     
			i=i+t;
			a[i][j]=k;
			k++;
			num2--;
		}
		num2=num1;
			t=t*(-1);		
		while(num2>0)
		{
     
			j=j+t;
			a[i][j]=k;
			k++;
			num2--;
		}
		num1--;
	}
	
	for(i=0;i<n;i++)
	{
     
		for(j=0;j<n;j++)
		{
     
			printf("%5d",a[i][j]);
		}
		printf("\n");
	}
}

公式求值

问题描述
已知公式Sn=a+aa+aaa+…+aa…a(n个a),其中a是一个数字(1≤a≤9),n表示a的位数(1≤n≤9),给出两个整数a和n,计算Sn,例如:a=2, n=5时Sn=2+22+222+2222+22222。
输入说明
在一行上输入两个整数a和n的值,并以空格相隔,1≤a≤9,1≤n≤9。
输出说明
输出Sn的计算结果。
输入样例
2 5
输出样例
24690

#include
int main()
{
     
	int a,n,s=0,i;
	scanf("%d%d",&a,&n);
	for(i=1;i<n+1;i++)
	{
     
		s+=f(a,i);
	} 
	printf("%d",s);
}

int f(int a,int n)
{
     
	if(n==1) return a;
	else
	{
     
		return f(a,n-1)*10+a;
	}
}

进制转换

问题描述
将十进制数转为其他进制数输出。
输入说明
输入两个整数,分别表示十进制下的数字a(0≤a≤(2^31)-1)和进制N(2≤N≤9),整数之间使用空格分隔。
输出说明
输出十进制数字a的N进制表示。
输入样例
17 7
输出样例
23

int main()
{
     
	int a,n,k[100];
	scanf("%d%d",&a,&n);
	int i=0;
	while(a!=0)
	{
     
		k[i]=a%n;
		a/=n;
		i++;
	}
	for(i=strlen(k);i>=0;i--)
	printf("%d",k[i]);
}

上三角矩阵

问题描述
主对角线(图中红色虚线)以下都是零的方阵称为上三角矩阵,如下图(a)是上三角矩阵,(b)不是上三角矩阵。给出一个n行n列的方阵,判断是不是上三角矩阵,如果是则求出上三角元素和,如果不是则统计下三角非零元素个数。
XDOJ2018期末部分(含螺旋矩阵)_第2张图片
输入说明
输入第一行为一个整数n(1 输出说明
如果方阵是上三角矩阵,则输出上三角的元素和(不含主对角线上的元素),如果方阵不是上三角矩阵,则输出下三角中非零元素个数(不含主对角线上的元素)。
输入样例
输入样例1:
3
3 5 5
0 2 1
0 0 5
输入样例2
3
3 2 6
1 0 4
0 2 1
输出样例
输出样例1
11
输出样例2
2

#include
int main()
{
     
	int n,a[51][51];
	int i,j,flag=0,sum=0;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
     
		for(j=0;j<n;j++)
		{
     
			scanf("%d",&a[i][j]);
		}
	}
	
	for(i=0;i<n;i++)
	{
     
		for(j=0;j<i;j++)
		{
     
			if(a[i][j]!=0) flag=1;
		}
	}
	if(flag==0)//是上三角矩阵
	{
     
		for(i=0;i<n;i++)
		{
     
			for(j=i+1;j<n;j++)
			{
     
				sum+=a[i][j];
			}
		} 
	}
	else
	{
     
		for(i=0;i<n;i++)
		{
     
			for(j=0;j<n;j++)
			{
     
				if(a[i][j]==0) sum++;
			}
		}
	}
	printf("%d",sum);
}

子串统计

问题描述
输入两个字符串,分别称为母串和子串。统计子串在母串中出现的次数和位置。注意子串可以重叠,见输入样例2。
输入说明
输入分为两行,第一行为母串,第二行为子串。母串和子串的长度都不超过100。
输出说明
输出子串在母串中出现的次数,并按出现次序输出每次子串在母串中出现时,子串第一个字符在母串中的位置(位置从0开始计算)。
输入样例
输入样例1:
12312431235412
123

输入样例2:
12121212
1212
输出样例
输出样例1:
2 0 7

输出样例2:
3 0 2 4

#include
int main()
{
     
	char a[101],b[101],num[100];
	gets(a);
	gets(b);
	int i,j,k,z=0;
	int len1,len2;
	len1=strlen(a);
	len2=strlen(b);
	for(i=0;i<=len1-len2;i++)
	{
     
		j=0;
		k=i;
		while(a[k]==b[j]&&j<len2)
		{
     
			k++;
			j++;
		}
		if(j==len2)
		{
     
			num[z]=i;
			z++;
		}
	}
	printf("%d ",z);	
	for(i=0;i<z;i++)
	{
     
		printf("%d ",num[i]);
	}
}

类似练习:字符串查找

ps.我写的不是很好(不简洁)
标题
字符串查找

类别
字符串处理

时间限制
2S

内存限制
256Kb

问题描述
给出一个字符串和多行文字,输出在这些文字中出现了指定字符串的行。
程序还需要支持大小写敏感选项:
当选项打开时,表示同一个字母的大写和小写看作不同的字符;
当选项关闭时,表示同一个字母的大写和小写看作相同的字符。

输入说明
输入数据第一行包含一个字符串s,由大小写英文字母组成,长度不超过100。
第二行包含一个数字,表示大小写敏感选项。当数字为0时表示大小写不敏感,当数字为1时表示大小写敏感。
第三行包含一个整数n,表示给出的文字行数。
接下来n行,每行包含一个字符串,字符串由大小写英文字母组成,不含空格和其他字符。每个字符串长度不超过100。

输出说明
输出多行,每行包含一个字符串,按出现的顺序依次给出那些包含了字符串s的行。

输入样例
Hello
1
5
HelloWorld
HiHiHelloHiHi
GrepIsAGreatTool
HELLO
HELLOisNOTHello

输出样例
HelloWorld
HiHiHelloHiHi
HELLOisNOTHello

#include
int main()
{
     
	int i,j,k,n,z,x,flag=0,len1=0,len2=0;
	char s[100];
	char a[100][100];
	scanf("%s",s);
	len1=strlen(s);
	scanf("%d%d",&k,&n);
	for(i=0;i<n;i++)
	{
     
		scanf("%s",a[i]);
	}
	if(k==1)
	{
     
		for(i=0;i<n;i++)
		{
     
			for(z=0;z<=strlen(a[i])-len1;z++)
			{
     
				x=z;
				j=0;
				len2=0;
				flag=0;
				while(a[i][x]==s[j])
				{
     
					len2++;
					j++;
					x++;
					if(len2==len1)
					{
     
						printf("%s\n",a[i]);
						flag=1;
						break;
					}
				}
				if(flag==1) break;
			}
		}
	}
	
	else
	{
     
		for(i=0;i<n;i++)
		{
     
			for(z=0;z<=strlen(a[i])-len1;z++)
			{
     
				x=z;
				j=0;
				len2=0;
				flag=0;
				while(a[i][x]==s[j]||abs(a[i][x]-s[j])==32)
				{
     
					len2++;
					j++;
					x++;
					if(len2==len1)
					{
     
						printf("%s\n",a[i]);
						flag=1;
						break;
					}
				}
				if(flag==1) break;
			}
		}
	}
}

公式求值

问题描述
函数f(n)的表达式如下图所示,给出一个整数n,求函数f(n)的值。
在这里插入图片描述
输入说明
输入一个整数n(0 输出说明
输出整数n对应的f(n)。
输入样例
3
输出样例
8

#include
#include
int main()
{
     
	int sum=0,i,n;
	int value(int n);
	scanf("%d",&n);
	for(i=1;i<n+1;i++)
	{
     
		sum+=value(i);
	}
	printf("%d",sum);
}
 int value(int n)
 {
     
 	return n*(n+1)*pow(-1,n-1);
 }

数位统计

问题描述
给定一个不超过10 位的非负整数 N,请编写程序统计该整数各个数位上不同数字出现的次数。例如:给定 N=100311,则有 2 个 0,3 个 1,和 1 个 3。
输入说明
输入是一个不超过 10位的非负整数 N。
输出说明
对 N 中每一种不同的数字,以 D:M 的格式在一行中输出该位数字 D 及其在 N 中出现的次数M,要求按D 的升序输出。
输入样例
100311
输出样例
0:2
1:3
3:1

#include
int main()
{
     
	int n,i;
	int num[10]={
     0};//统计数字 
	scanf("%d",&n);
	while(n!=0)
	{
     
		num[n%10]++;
		n/=10;
	}
	for(i=0;i<10;i++)
	{
     
		if(num[i]!=0)
		{
     
			printf("%d:%d\n",i,num[i]);
		}
	 } 
}

你可能感兴趣的:(XDOJ)