数组
1、小鱼比可爱(7.24)
#include <stdio.h>
int main(int argc, char *argv[])
{
int n;
int a[100]={0},b[100]={0};
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(int i=n-1;i>=1;i--)
{
for(int j=i-1;j>=0;j--)
{
if(a[i]>a[j])
b[i]++;
}
}
for(int i= 0;i<n;i++)
printf("%d ",b[i]);
return 0;
}
2、小鱼的数字游戏
#include <stdio.h>
int main(int argc, char *argv[])
{
int a[100]={0},n=0;
do
{
scanf("%d",&a[n]);
n++;
}
while(a[n-1]!=0);
for(int i=n-2;i>=0;i--)
{
printf("%d ",a[i]);
}
return 0;
}
3、冰雹猜想
#include <stdio.h>
int main(int argc, char *argv[])
{
int i,a[1000]={0};
scanf("%d",&a[0]);
for(i=1;a[i-1]!=1;i++)
{
if(a[i-1]%2==0)
a[i]=a[i-1]/2;
else
a[i]=a[i-1]*3+1;
}
for(i=i-1;i>=0;i--)
printf("%d ",a[i]);
return 0;
}
我原来的开的数组a[100]太小了,后面改成a[1000]。
4、校门外的树(7.25)
#include <stdio.h>
int main(int argc, char *argv[])
{
int a[10001]={0};
int l,m,u,v,num=0;
scanf("%d %d",&l,&m);
for(int i=0;i<m;i++)
{
scanf("%d %d",&u,&v);
for(int j=u;j<=v;j++)
a[j]=1;
}
for(int i=0;i<=l;i++)
{
if(a[i]==0)
num++;
}
printf("%d\n",num);
return 0;
}
最开始对于题的数学思维很好理解,但用代码很难表示出来,后面查找资料学会数组标记法,其中第一遍踩坑,这个范围是[0,l},而题目要求是[0,l],所以在设置数组大小是不能是10000,而是10001。
5、旗鼓相当的对手
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int a[1000][4]={0};
int N,n,count=0,flag=0;
scanf("%d",&N);
for(int i=0;i<N;i++)
{
scanf("%d %d %d",&a[i][0],&a[i][1],&a[i][2]);
a[i][3]=a[i][0]+a[i][1]+a[i][2];
}
for(int i=0;i<N;i++)
{
for(int j=i+1;j<N;j++)
{
if(abs(a[i][0]-a[j][0])<=5 &&
abs(a[i][1]-a[j][1])<=5 &&
abs(a[i][2]-a[j][2])<=5 &&
abs(a[i][3]-a[j][3])<=10)
count++;
}
}
printf("%d\n",count);
return 0;
}
注意:abs()函数不是在<math.h>,而是在<stdlib.h>头文件中
6、彩票摇奖
#include <stdio.h>
int main(int argc, char *argv[])
{
int a[7]={0};
int b[7]={0};
int c[7]={0};
int n,count;
scanf("%d",&n);
for(int i=0;i<7;i++)
scanf("%d",&a[i]);
for(int i=0;i<n;i++)
{
count=0;
for(int j=0;j<7;j++)
{
scanf("%d",&b[j]);
for(int k=0;k<7;k++)
{
if(a[k]==b[j])
count++;
}
}
c[count-1]++;
}
for(int i=6;i>=0;i--)
printf("%d ",c[i]);
return 0;
}
7、神奇的幻方
#include <stdio.h>
int main(int argc, char *argv[])
{
int n,h,l;
int a[40][40]={0};
scanf("%d",&n);
for(int i=1;i<=n*n;i++)
{
if(i==1)
{
h=1;
l=(n+1)/2;
}
else
if(h==1 &&(l!=n))
{
h=n;
l=l+1;
}
else if((h!=1)&&l==n)
{
h=h-1;
l=1;
}
else if(h==1&&l==n)
{
h=h+1;
}
else if(h!=1&&l!=n)
{
if(a[h-1][l+1]==0)
{
h=h-1;
l=l+1;
}
else
{
h=h+1;
}
}
a[h][l]=i;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
printf("%d ",a[i][j]);
puts("");
}
return 0;
}
8、梦中统计
#include <stdio.h>
int main(int argc, char *argv[])
{
int m,n;
int a[10]={0};
scanf("%d %d",&m,&n);
for(int i=m;i<=n;i++)
{
int t=i;
while(t>0)
{
a[t%10]++;
t=t/10;
}
}
for(int i=0;i<10;i++)
printf("%d ",a[i]);
return 0;
}
9、珠心算测验
#include <stdio.h>
int main(int argc, char *argv[])
{
int a[100]={0},b[100]={0};
int n,count=0;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int i=0;i<n-1;i++)
for(int j=i+1;j<n;j++)
for(int k=0;k<n;k++)
{
if(a[i]+a[j]==a[k])
{
b[k]=1;
break;
}
}
for(int i=0;i<n;i++)
{
if(b[i]==1)
count++;
}
printf("%d\n",count);
return 0;
}
注意:最初只考虑 a[i]+a[j]==a[k]为真,就加1,但是1+4=5与2+3=5都是一类的,后面加b数组来表示a数据的状态,0没有两个数相加等于,1则是有。
10、爱与愁的心动(7.26)
#include <stdio.h>
int main(int argc, char *argv[])
{
int n,m,min=100000000000;
int a[3000]={0};
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int i=0;i<=n-m;i++)
{
int sum=0;
for(int j=i;j<i+m;j++)
{
sum+=a[j];
}
if(sum<min)
min=sum;
}
printf("%d\n",min);
return 0;
}
注意:最开始一直设置min值设置过小,改完后一直卡80分,后面将 i<n-m 改为 i<=n-m 成功AC。
11、Bovine Bones G
#include <stdio.h>
int main(int argc, char *argv[])
{
int s1,s2,s3;
int max=0,num;
int a[100]={0};
scanf("%d %d %d",&s1,&s2,&s3);
for(int i=1;i<=s1;i++)
for(int j=1;j<=s2;j++)
for(int k=1;k<=s3;k++)
a[i+j+k]++;
for(int i=3;a[i]>0;i++)
if(max<a[i])
{
max=a[i];
num=i;
}
printf("%d\n",num);
return 0;
}
12、开灯
#include <stdio.h>
#define Max 2000001
int main(int argc, char *argv[])
{
int t,n;
int b[Max]={0};
double a;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%lf %d",&a,&t);
for(int j=1;j<=t;j++)
{
if(b[(int)(j*a)]==1)
b[(int)(j*a)]=0;
else
b[(int)(j*a)]=1;
}
}
for(int i=0;i<Max;i++)
if(b[i]==1)
{
printf("%d",i);
break;
}
return 0;
}
注意:最开始定义a为float数据类型,后面AC只有60分,看大佬帮人解释可能是精度崩了,又改成了double。
13、蛇形矩阵
#include <stdio.h>
int main(int argc, char *argv[])
{
int a[15][15]={0};
int i=1,n,h=1,l=0;
scanf("%d",&n);
while(i<=n*n)
{
while(l<n&&!a[h][l+1]) a[h][++l]=i++;
while(h<n&&!a[h+1][l]) a[++h][l]=i++;
while(l>1&&!a[h][l-1]) a[h][--l]=i++;
while(h>1&&!a[h-1][l]) a[--h][l]=i++;
}
for(int j=1;j<=n;j++)
{
for(int k=1;k<=n;k++)
printf("%3d",a[j][k]);
puts("");
}
return 0;
}
注意:
14、杨辉三角
#include <stdio.h>
int main(int argc, char *argv[])
{
int n,a[21][21]={0};
scanf("%d",&n);
a[1][1]=1;
for(int i=2;i<=n;i++)
{
for(int j=1;j<=i;j++)
a[i][j]=a[i-1][j]+a[i-1][j-1];
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
printf("%d ",a[i][j]);
puts("");
}
return 0;
}
15、插火把
#include <stdio.h>
int main(int argc, char *argv[])
{
int a[110][110]={0};
int n,m,k,x,y,num;
scanf("%d %d %d",&n,&m,&k);
for(int i=0;i<m;i++)
{
scanf("%d %d",&x,&y);
int h=x+2,l=y+2;
for(int j=h-2;j<=h+2;j++)
a[j][l]=1;
for(int j=l-2;j<=l+2;j++)
a[h][j]=1;
a[h-1][l-1]=1;
a[h-1][l+1]=1;
a[h+1][l-1]=1;
a[h+1][l+1]=1;
}
for(int i=0;i<k;i++)
{
scanf("%d %d",&x,&y);
int h=x+2,l=y+2;
for(int j=h-2;j<=h+2;j++)
for(int k=j-2;k<=j+2;k++)
a[j][k]=1;
}
for(int i=3;i<n+3;i++)
for(int j=3;j<n+3;j++)
if(a[i][j]==0)
num++;
printf("%d\n",num);
return 0;
}
目前只有60分,后续还要改动
16、压缩技术(7.27)
#include <stdio.h>
int main(int argc, char *argv[])
{
int a[210][210]={0};
int n,j,i=0,x,num=0,sum=0;
scanf("%d",&n);
for(i=0;i<n*n;)
{
scanf("%d",&x);
num++;
sum+=x;
while(i<sum)
{
if(num%2==1)
a[i/n][i%n]=0;
else
a[i/n][i%n]=1;
i++;
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%d",a[i][j]);
puts("");
}
return 0;
}
字符串
1、自动修正(7.29)
#include <stdio.h>
int main(int argc, char *argv[])
{
char a[100]={0};
int i=0;
gets(a);
while(a[i]!='\0')
{
if(a[i]>='a'&&a[i]<='z')
a[i]=a[i]-32;
i++;
}
puts(a);
return 0;
}
2、凯撒密码
#include <stdio.h>
int main(int argc, char *argv[])
{
char a[50]={0};
int n,i=0;
scanf("%d%s",&n,a);
while(a[i]!='\0')
{
if(a[i]+n<='z'&&a[i]+n>='a')
a[i]+=n;
else
a[i]=a[i]-26+n;
i++;
}
puts(a);
return 0;
}
注意:原来是直接为a[i]+=n;会出现a[i]>128,超过了ASCII码,所以要修改判断。
3、笨小猴
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
char a[100]={0};
int b[26]={0};
int i=0,max=0,min=101;
int cha;
gets(a);
for(i=0;i<strlen(a);i++)
{
int num=0;
for(int j=0;j<strlen(a);j++)
if(a[i]==a[j])
num++;
if(min>num)
min=num;
if(max<num)
max=num;
}
cha=max-min;
for(i=2;i<=cha;i++)
if(cha%i==0)
break;
if(i==cha)
{
printf("Lucky Word\n");
printf("%d\n",cha);
}
else
{
printf("No Answer\n");
printf("0\n");
}
return 0;
}
4、口算练习题(优化)
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
char a[50];
char b[50][50],t[50];
char p;
int n,j,num1,num2;
int s=0;
scanf("%d",&n);
getchar();
for(int i=0;i<n;i++)
{
gets(a);
num1=0;
num2=0;
s=0;
if(a[0]>='a'&&a[0]<='c')
{
switch(a[0])
{
case 'a':p='+';break;
case 'b':p='-';break;
case 'c':p='*';break;
}
strcpy(b[i],&a[2]);
}
else
strcpy(b[i],&a[0]);
for(j=0;j<strlen(b[i]);j++)
{
if(b[i][j]==' ')
{
num1=s;
s=0;
b[i][j]=p;
}
else
{
int t=b[i][j]-'0';
s=s*10+t;
}
}
num2=s;
switch(p)
{
case '+':s=num1+num2;break;
case '-':s=num1-num2;break;
case '*':s=num1*num2;break;
}
sprintf(t,"%d",s);
strcat(b[i],"=");
strcat(b[i],t);
}
for(int i=0;i<n;i++)
{
puts(b[i]);
printf("%ld\n",strlen(b[i]));
}
return 0;
}
注意:使用了 sprintf( )函数和strcat( )函数;
sprintf( )函数:
sprintf(char a[],"%d",int b);
将int数据类型转换成字符串存入数组a[ ]中
strcat( )函数:
strcat(字符串a,字符串b);
将字符串b的内容追加到字符串a中;
目前感觉这道题的思路还是很混乱,有机会重写。
5、标题统计
#include <stdio.h>
int main(int argc, char *argv[])
{
int num=0;
char a[100];
gets(a);
for(int i=0;a[i];i++)
{
if(a[i]>='a'&&a[i]<='z')
num++;
else if(a[i]>='A'&&a[i]<='Z')
num++;
else if(a[i]>='0'&&a[i]<='9')
num++;
}
printf("%d\n",num);
return 0;
}
6、统计单词数(7.30)---40'
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
char a[11];
char b[1000000];
int i=0,av=100000000,num=0;
gets(a);
gets(b);
for(i=0;b[i];i++)
{
if(b[i]>='A'&&b[i]<='Z')
b[i]+=32;
}
for(i=0;a[i];i++)
{
if(a[i]>='A'&&a[i]<='Z')
a[i]+=32;
if(a[i]==' ')
{
for(int j=i;j<strlen(a)-1;j++)
{
a[j]=a[j+1];
}
i--;
}
}
for(i=0;b[i];i++)
{
if(a[0]==b[i])
{
int k=i;
int j=0;
while(a[j]||b[k])
{
if(a[j]==b[k])
{
j++;
k++;
}
else
break;
}
if(j==strlen(a))
{
if(av>i)
av=i;
num++;
}
}
}
if(num>0)
printf("%d %d\n",num,av);
else
printf("-1\n");
return 0;
}
注意:字符串能力不够,多练习
7、手机
#include <stdio.h>
int main(int argc, char *argv[])
{
char str[201];
gets(str);
char *p=str;
int num=0;
while(*p)
{
if(*p==' '||*p=='a'||*p=='d'||*p=='g'||*p=='j'||*p=='m'||*p=='p'||*p=='t'||*p=='w')
num+=1;
else if(*p=='b'||*p=='e'||*p=='h'||*p=='k'||*p=='n'||*p=='q'||*p=='u'||*p=='x')
num+=2;
else if(*p=='c'||*p=='f'||*p=='i'||*p=='l'||*p=='o'||*p=='r'||*p=='v'||*p=='y')
num+=3;
else
num+=4;
p++;
}
printf("%d\n",num);
return 0;
}
8、小果的键盘
#include <stdio.h>
int main(int argc, char *argv[])
{
char a[101]={0};
int n,num=0,flag=0;
scanf("%d%s",&n,a);
for(int i=0;i<n-1;i++)
{
if(a[i]=='V'&&a[i+1]=='K')
{
num++;
a[i]='0';
a[i+1]='1';
}
}
for(int i=0;i<n-1;i++)
{
if(a[i]==a[i+1])
{
num++;
break;
}
}
printf("%d\n",num);
return 0;
}
9、单词覆盖还原
#include <stdio.h>
int main(int argc, char *argv[])
{
int b=0,g=0;
char a[260]={0};
gets(a);
for(int i=0;a[i];i++)
{
if(a[i]=='b'||a[i+1]=='o'||a[i+2]=='y')
b++;
if(a[i]=='g'||a[i+1]=='i'||a[i+2]=='r'||a[i+3]=='l')
g++;
}
printf("%d\n",b);
printf("%d\n",g);
return 0;
}
注意:代码不难,但是思路难想
10、你的飞碟在这儿
#include <stdio.h>
int main(int argc, char *argv[])
{
char a[10]={0},b[10]={0};
gets(a);
gets(b);
char *p=a,*q=b;
int z=1,h=1;
while(*p)
{
int t=*p-'A'+1;
h*=t;
p++;
}
while(*q)
{
int t=*q-'A'+1;
z*=t;
q++;
}
if(h%47==z%47)
printf("GO\n");
else
printf("STAY\n");
return 0;
}