问题描述
螺旋方阵是指一个呈螺旋状的矩阵,它的左上角元素为1,由第一行开始按从左到右,从上到下,从从右向左,从下到上的顺序递增填充矩阵,直到矩阵填充完毕,下图所示是一个5*5阶的螺旋方阵。输入螺旋方阵的阶数N,按行输出该螺旋方阵。
输入说明
输入一个正整数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列的方阵,判断是不是上三角矩阵,如果是则求出上三角元素和,如果不是则统计下三角非零元素个数。
输入说明
输入第一行为一个整数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]);
}
}
}