《算法竞赛入门经典》(第二版)第三章笔记
程序员文章站
2024-03-18 23:34:16
...
第三章 数组和字符串
笔记
比较大的数组应尽量声明在main函数外,否则程序无法运行。(亲测是真的)
getchar()一次性把字符全部放入缓存区,再读出来判断,可以用在有空格的字符输入。
没有空格的字符输入可以用%s,如果从标准输入读取一个字符,可以用getchar,他等价于fgetc(stdin)
不同操作系统的回车换行符不一样!不推荐使用gets()!
代码
不太好分块 这次就偷懒全部发了
#include <stdio.h>
#include <string.h>
#include <ctype.h>
/*
const char* rev="A 3 HIL JM O 2TUVWXY51SE Z 8";
const char*msg[]={"not a palindrome","a regular pailndrome",
"a mirrored string","a mirrored pailndrome"};
char r(char ch)
{
if(isalpha(ch))
return rev[ch-'A'];
return rev[ch-'0'+25];
}
char s[]="`1234567890-=qwertyuiop[]\\asdfghjkl;'zxcvbnm,./";
*/
#define maxn 105+10
char s[maxn];
/*
int less(const char*s,int p,int q)
{
int n=strlen(s);
for(int i=0;i<n;i++)
if(s[(p+i)%n]!=s[(q+i)%n])
return s[(p+i)%n]<s[(q+i)%n];
return 0;
}
*/
//int ans[maxn];
int main()
{
//思考题
scanf("%s",s);
int tot=0;
for(int i=0;i<strlen(s);i++)
if(s[i]=='1')
tot++;
printf("%d",tot);
/*
//例题3-6
int T;
char s[maxn];
scanf("%d",&T);
while(T--)
{
scanf("%s",s);
int ans=0;
int n=strlen(s);
for(int i=1;i<n;i++)
if(less(s,i,ans))
ans=i;
for(int i=0;i<n;i++)
putchar(s[(i+ans)%n]);
putchar('\n');
}
*/
/*
//例题3-5
int T,n;
memset(ans,0,sizeof(ans));
for(int m=1;m<maxn;m++)
{
int x=m,y=m;
while(x>0)
{
y+=x%10;x/=10;
}
if(ans[y]==0||m<ans[y])
ans[y]=m;
}
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
printf("%d\n",ans[n]);
}
*/
/*
//例题3-4
int n,a[maxn],b[maxn];
int kase=0;
while(scanf("%d",&n)==1&&n)
{
printf("Game %d:\n",++kase);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(;;)
{
int A=0,B=0;
for(int i=0;i<n;i++)
{
scanf("%d",&b[i]);
if(a[i]==b[i])
A++;
}
if(b[0]==0)
break;
for(int d=1;d<=9;d++)
{
int c1=0,c2=0;
for(int i=0;i<n;i++)
{
if(a[i]==d) c1++;
if(b[i]==d) c2++;
}
if(c1<c2) B+=c1;
else B+=c2;
}
printf(" (%d,%d)\n",A,B-A);
}
}
*/
/*
//程序3-7
char s[30];
while(scanf("%s",s)==1)
{
int len=strlen(s);
int p=1,m=1;
for(int i=0;i<(len+1)/2;i++)
{
if(s[i]!=s[len-1-i])
p=0;
if(r(s[i])!=s[len-1-i])
m=0;
}
printf("%s -- is %s.\n\n",s,msg[m*2+p]);
}
*/
/*
//程序3-6
int i,c;
while((c=getchar())!=EOF)
{
for(i=1;s[i]&&s[i]!=c;i++);
if(s[i])
putchar(s[i-1]);
else putchar(c);
}
*/
/*
for里面的s[i](相当于一开始定义的常量数组char s的一个游标)
用在for循环负责从字符串里面找有没有相同的字符,
就像博主说的只做循环不操作,s[1]→s[2]→...→字符串结束。
如果找到了就输出if里面的s[i](找到的结果),
如果没有找到的话就是输出else里的putchar(c),
而在这里输入的数据里面只有空格不在常量数组里面,因此putchar(c)输出了空格。
*/
/*
//程序3-5
int c,q=1;
while((c=getchar())!=EOF)
{
if(c=='"')
{
printf("%s",q?"“":"”");
q=!q;
}
else
printf("%c",c);
}
*/
/*
//程序3-4
int count=0;
char s[20],buf[99];
scanf("%s",s);
for(int abc=111;abc<=999;abc++)
for(int de=11;de<=99;de++)
{
int x=abc*(de%10),y=abc*(de/10),z=abc*de;
sprintf(buf,"%d%d%d%d%d",abc,de,x,y,z);
int ok=1;
for(int i=0;i<strlen(buf);i++)
if(strchr(s,buf[i])==NULL) ok=0;
if(ok)
{
printf("<%d>\n",++count);
printf("%5d\nX%4d\n-----\n%5d\n%4d\n-----\n%5d\n\n",abc,de,x,y,z);
}
}
printf("The number of solutions = %d\n",count);
*/
/*
//程序3-3
int n,x,y,tot=0;
scanf("%d",&n);
memset(a,0,sizeof(a));
tot=1;
a[x=0][y=n-1]=1;
while(tot<n*n)
{
while(x+1<n&&!a[x+1][y])
a[++x][y]=++tot;
while(y-1>=0&&!a[x][y-1])
a[x][--y]=++tot;
while(x-1>=0&&!a[x-1][y])
a[--x][y]=++tot;
while(y+1<n&&!a[x][y+1])
a[x][++y]=++tot;
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
printf("%3d",a[i][j]);
printf("\n");
}
*/
/*
//程序3-1 逆序输出
int x,n;
while(scanf("%d",&x)==1)
a[n++]=x;
for(int i=n-1;i>=1;i--)
printf("%d ",a[i]);
printf("%d\n",a[0]);
*/
return 0;
}