P37 程序3-1
#include<stdio.h>
#define MAXN 1050000
int a[MAXN];
int main(int args,char **argc)
{
int a[MAXN]; //内外有区别
int x,n=0;
while(scanf("%d",&x)==1)
a[n++]=x;
printf("%d\n",n);
for(int i=1;i<n;i++)
printf("%d ",a[n-i]);
printf("%d",a[0]);
return 0;
}
P39 开灯问题
#include<stdio.h>
int main()
{
int Lamp[1005]={0};
int n,k;
scanf("%d %d",&n,&k);
for(int i=1; i < k+1 ; i++)
for(int j=1; j < n+1 ; j++)
{
if(j % i== 0 )
Lamp[j-1]=!Lamp[j-1];
}
for(int i=0;i<n;i++)
if(Lamp[i])
printf("%d ",i+1);
/*printf("\n");
for(int i=0;i<n;i++)
printf("%d ",Lamp[i]);*/
return 0;
}
P39 蛇形填数
#include<stdio.h>
#define MAXN 20
int a[MAXN][MAXN]={0};
int main()
{
int n=0,count=1;
int x=0,y=0;
scanf("%d",&n);
x=0,y=n-1;
a[0][n-1]=1;
while(count<n*n) //下 左 上 右 下 左 上 右......
{
while(!a[x+1][y]&&x+1<n) a[++x][y]=++count;
while(!a[x][y-1]&&y-1>=0) a[x][--y]=++count;
while(!a[x-1][y]&&x-1>=0) a[--x][y]=++count;
while(!a[x][y+1]&&y+1<n) a[x][++y]=++count;
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
printf("%3d ",a[i][j]);
}
printf("\n");
}
return 0;
}
#include<stdio.h>
int s[12][12]={0};
int main()
{
int n,count=1;
int x,y;
scanf("%d",&n);
x=0,y=n-1;
s[0][n-1]=1;
while(count<n*n)
{
while(!s[x+1][y]&&x+1<n) s[++x][y]=++count;
while(!s[x][y-1]&&y-1>=0) s[x][--y]=++count;
while(!s[x-1][y]&&x-1>=0) s[--x][y]=++count;
while(!s[x][y+1]&&y+1<n) s[x][++y]=++count;
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
printf("%3d ",s[i][j]);
printf("\n");
}
return 0;
}
P41 竖式问题
#include<stdio.h>
#include<string.h>
int main()
{
int a,b,c,d,e;
int x,y,z;
char s[20],buf[99];
int count=0;
scanf("%s",s);
for(int abc=100;abc<1000;abc++)
{
for(int de=10;de<100;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 flag=1;
for(int i=0;i< strlen(buf);i++)
if(strchr(s,buf[i])==NULL)
flag=0;
if(flag)
{
printf("<%d>\n",++count);
printf("%5d\nx%4d\n-----\n%5d\n%4d\n-----\n%5d\n",abc,de,x,y,z);
}
}
}
printf("The number of solutions = %d\n",count);
return 0;
}
P45 例题3-1 Bug 空格结束
#include<stdio.h>
#include<string.h>
char s[100];
int main()
{
scanf("%s",s);
int n=strlen(s);
printf("%d\n",n);
int flag=0;
for(int i=0;i<n;i++)
{
if(s[i]=='"')
{
flag=!flag;
if(flag)
printf("“");
else
printf("”");
}
else
printf("%c",s[i]);
}
printf("\n");
return 0;
}
P45 例题3-1 Tex
#include<stdio.h>
#include<string.h>
int main()
{
int c,q=1;
while((c=getchar())!=EOF) //getchar返回值 fgetc(stdin)
{
if(c=='"')
{
printf("%s",q?"“":"”"); //字符串
q=!q;
}
else
printf("%c",c); //字符
}
return 0;
}
P47 例题3-2 QWERTYU
#include<stdio.h>
#include<string.h>
char s[]="`1234567890-=QWERTYUIOP[]\\ASDFGHJKL;'ZXCVBNM,./"; // \\才是\
int main()
{
int n=strlen(s);
printf("%d\n",n);
int temp; //注意getchar返回值是int
while((temp=getchar())!=EOF)
{
int i;
for(i=0;i<n;i++)
{
if(temp==s[i])
{
printf("%c",s[i-1]);
break;
}
}
if(i==n) //==写成=
printf("%c",temp);
//putchar(temp);
}
return 0;
}
P48 回文词 镜像词 问题程序
#include<stdio.h>
#include<string.h>
#define MAXN 100
//char s[]="AAB C D E3F G HHIIJLK LJMMN OOP Q R S2TTUUVVWWXXYYZ5112S3E4 5Z6 7 889 "; //此处有bug
char s[]="E3JLLJSZ52S3E5Z";
char a[MAXN];
char b[MAXN];
char c[MAXN];
int main()
{
int n=0;
char x;
while(scanf("%s",&a)==1)
{
for(int i=0;i<strlen(a);i++)
{
b[i]=a[n-1-i];
for(int j=0;j<strlen(s);j++)
{
if(i>=(strlen(a))/2)
{
c[i]=a[n-1-i];
continue;
}
if(!strchr(a[i],s[j]))
{
c[i]=s[j+1];
}
}
}
int flag1=strcmp(a,b),flag2=strcmp(a,c);
if(!flag1&&!flag2)
sprintf("%s -- is a not a palindrome.\n\n",a);
else if(flag1&&!flag2)
sprintf("%s -- is a regular palindrome.\n\n",a);
else if(!flag1&&flag2)
sprintf("%s -- is a mirrored string.\n\n",a);
else
sprintf("%s -- is a mirrored palindrome.\n\n",a);
}
return 0;
}
#include<stdio.h>
#include<string.h>
char s[100];
//char TAB[]="AAE3HHIIJLLJMMOOS2TTUUVVXXYYZ5112S3E5Z88"; //JLLJ bug L>L
char TAB[]="AEHIJLMOSTUVWXYZ123588ZES15YXWVUT2OMJLIH3A";
char a[100];
int main()
{
while(scanf("%s",s)==1)
{
int n=strlen(s);
//printf("%d\n",n);
int flag1=1,flag2=1,flag3=0;
for(int i=0;i<n;i++)
{
//回文
if(s[i]!=s[n-1-i])
{
flag1=0;
}
//镜像
for(int j=0;j<strlen(TAB);j++)
{
if(i>n/2)
break;
if(s[i]==TAB[j]) //索引表格是对称的
{
flag3=1;
if(s[n-1-i]!=TAB[strlen(TAB)-1-j])
{
flag2=0;
break;
}
}
}
if(!flag3)
{
flag2=0;
}
}
if(!flag1&&!flag2)
printf("%s -- is a not a regular string.\n",s);
else if(flag1&&!flag2)
printf("%s -- is a regular palindrome.\n",s);
else if(!flag1&&flag2)
printf("%s -- is a mirrored string.\n",s);
else
printf("%s -- is a mirrored palindrome.\n",s);
}
return 0;
}
P50 例题3-4 数字游戏
#include<stdio.h>
#include<string.h>
#define MAXN 1010
int main()
{
int n=0;
int number=0;
int flag=1;
char ref[MAXN];
char temp[MAXN];
while(scanf("%s",temp)==1)
{
if(!n) //n
{
n=temp[0]-'0';
printf("n: %d\n",n);
continue;
}
int count1=0,count2=0,count3=0;
if(flag) //answer
{
printf("n: %d\n",n);
int j=0;
for(int i=0;i<strlen(temp);i++)
{
if('0'<=temp[i]&&temp[i]<='9')
{
ref[j++]=temp[i];
}
}
printf("%s\n",ref);
//sprintf("%s\n",temp); //输出到字符串
flag=0;
continue;
}
//else //input
//{
// for(int i=0;i<n;i++)
// {
// if(ref[i]==temp[i])
// {
// count1++;
// }
// for(int j=0;j<n;j++)
// {
// if(ref[i]==temp[j])
// {
// count2++;
// break;
// }
// }
// if(temp[i]==0)
// {
// count3++;
// }
// }
//}
//if(count3==n) //全0
//{
// n=0,flag=1;
// count1=0,count2=0,count3=0;
// break;
//}
number++;
//printf("Case: %d\n",number);
//sprintf("%s\n",temp);
n=0,flag=1;
count1=0,count2=0,count3=0;
}
return 0;
}
P50 例题3-4 猜数字游戏
#include<stdio.h>
#define MAXN 1005
char temp[MAXN];
char ref[MAXN];
int main()
{
int n=1,flag=1,count=0;
while(scanf("%d",&n)==1&&n)
{
for(int i=0;i<n;i++) scanf("%d",&ref[i]);
printf("ref: ");
for(int i=0;i<n;i++) printf("%d ",ref[i]);
printf("\n");
for(;;)
{
int a=0,b=0;
for(int i=0;i<n;i++)
{
scanf("%d",&temp[i]);
if(ref[i]==temp[i]) a++;
}
if(temp[0]==0) break;
for(int d=1;d<=9;d++) //1-9 统计每个数字出现的次数 最小的即为b值
{
int c1=0,c2=0;
for(int i=0;i<n;i++)
{
if(ref[i]==d)
c1++;
if(temp[i]==d)
c2++;
}
if(c1<c2)
b+=c1;
else
b+=c2;
}
printf("Game %d:\n",++count);
printf(" (%d,%d)\n",a,b-a);
}
}
return 0;
}
P52 例题3-5 生成元
#include<stdio.h>
int main()
{
int n;
int a,b,c,d,e;
while(scanf("%d",&n)==1)
{
int i=0;
for(i=0;i<n;i++) //最小解 从0寻
{
a=i/10000;
b=i/1000%10;
c=i/100%10;
d=i/10%10;
e=i%10;
//printf("%d %d %d %d %d\n",a,b,c,d,e);
if(n==(i+a+b+c+d+e))
break;
}
if(i<n)
printf("%d\n",i);
else
printf("0");
}
return 0;
}
//P52 例题 3-6 字典序
#include<stdio.h>
#define MAXN 105
int main()
{
int n=0;
char s[MAXN];
scanf("%d",&n);
while(1)
{
scanf("%s",s);
}
return 0;
}
P55 思考题
#include<stdio.h>
#include<math.h>
#include<string.h>
int main()
{
题目一
1
/*int n=0,x;
while(scanf("%d",&x)==1)
n++;
printf("%d\n",n);*/
2
/*int x,n=0,s=0;
int min,max;
int flag=1;
while(scanf("%d",&x)==1)
{
s=s+x;
n++;
if(flag)
min=max=x,flag=0;
if(min>x)
min=x;
if(max<x)
max=x;
}
printf("%d %d %.2f\n",min,max,(float)s/(float)n);*/
3
int s[100];
int n=0;
while(scanf("%d",&s[n++])==1); //空格结束
printf("%s\n",s);
int err=100,p_err=100;
int flag=1,i=0,j=0;
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n-1;j++)
{
/*if(flag)
{
p_err=s[i]-s[j];
err=p_err;
flag=0;
}*/
err=s[i]-s[j];
if(err==0)
{
printf("err : %d ,%d %d\n",err,s[i],s[j]);
break;
}
if(abs(err)<abs(p_err))
p_err=err;
printf("%d %d\n",p_err,err);
}
printf("err : %d ,%d %d\n",err,s[i],s[j]);
if(err==0)
break;
}
printf("err : %d ,%d %d\n",abs(err),s[i],s[j]);
/*int n=0,x;
int s[100];
while(scanf("%d",&x)==1)
{
s[n]=x;
n++;
}
for(int i=0;i<n;i++)
printf("%d ",s[i]);
printf("\n");
int p_err,err;
int flag=1;
int i=0,j=0;
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
if(flag)
{
p_err=s[0]-s[1];
flag=0;
}
err=s[i]-s[j];
if(abs(err)<abs(p_err))
p_err=err;
}
}
printf("%d\n",abs(p_err));*/
4
int x,max1,max2,flag=1;
while(scanf("%d",&x)==1)
{
if(flag)
{
max1=x,scanf("%d",&max2),flag=0;
int t=0;
if(max1<max2)
t=max1,max1=max2,max2=t;
scanf("%d",&x); //max1 max2 x 5 4 5 bug
}
if(max1<x)
max2=max1,max1=x; //max
else
if(max2<x)
max2=x;
printf("max1 :%d max2: %d\n",max1,max2);
}
printf("submax: %d\n",max2);
5 求方差
/*int n=0;
float a[100];
float x,S=0;
while(scanf("%f",&x)==1)
{
a[n]=x;
S=S+x;
n++;
}
x=S/(float)n;
S=0;
for(int i=0;i<n;i++)
{
S=S+(a[i]-x)*(a[i]-x);
}
S=S/(float)n;
printf("Variance: %.3f\n",S);*/
6
int n=0,count=0;
float a[100];
float x,s=0;
while(scanf("%f",&x)==1)
{
a[n]=x;
s=s+x;
n++;
}
s=s/(float)n;
for(int i=0;i<n;i++)
{
if(a[i]<=s)
count++;
}
printf("%d\n",count);
题目2
/*int x,count=0;
while((x=getchar())!=EOF)
{
if(x=='1')
count++;
}
printf("%d\n",count);*/
/*int n=0;
char x;
while((x=getchar())!=EOF)
{
if(x=='1')
n++;
}
printf("%d\n",n);*/
return 0;
}
P57 习题
#include<stdio.h>
int main()
{
return 0;
}
3-1 得分
#include<stdio.h>
#include<string.h>
#define MAXN 90
int main()
{
int sore=0,count=0;
char s[MAXN];
scanf("%s",s);
for(int i=0;i<strlen(s);i++)
{
if(s[i]=='O')
{
count++;
sore=sore+count;
}
else
count=0;
}
printf("%d\n",sore);
return 0;
}
3-2 分子量
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#define MAXN 30
int main()
{
char s[MAXN];
float tab[5]={12.01,1.008,16.00,14.01}; //C H O N
int n=0;
float mol=0;
scanf("%s",s);
n=strlen(s); //注意
printf("%d\n",n);
printf("%s\n",s);
for(int i=0;i<=n;i++)
{
if(isalpha(s[i]))
{
if(i<=n&&isdigit(s[i+1]))
{
switch(s[i])
{
case 'C':mol=mol+tab[0]*(s[i+1]-'0');break; //注意
case 'H':mol=mol+tab[1]*(s[i+1]-'0');break;
case 'O':mol=mol+tab[2]*(s[i+1]-'0');break;
case 'N':mol=mol+tab[3]*(s[i+1]-'0');break;
}
printf("%c%d\n",s[i],s[i+1]-'0');
printf("%.3f\n",mol);
i++; //注意
}
else
{
switch(s[i])
{
case 'C':mol=mol+tab[0];break;
case 'H':mol=mol+tab[1];break;
case 'O':mol=mol+tab[2];break;
case 'N':mol=mol+tab[3];break;
}
printf("%c\n",s[i]);
printf("%.3f\n",mol);
}
}
}
printf("%.3fg/mol\n",mol);
return 0;
}
3-3 数数字
#include<stdio.h> //思考简化算法 暴力破解
int main()
{
int n=0;
int s[10]={0};
int x[6]={0};
for(int i=1;i<=10000;i++)
{
x[0]=i/10000;
x[1]=i/1000%10;
x[2]=i/100%10;
x[3]=i/10%10;
x[4]=i%10;
for(int j=0;j<5;j++)
{
s[x[j]]++;
}
}
for(int i=0;i<10;i++)
printf("%d: %d\n",i,s[i]);
/*printf("%s\n",s);*/
return 0;
}
3-3
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int cnt(int n, int x)
{
int res = 0;
int fact = 1, high = n/10, crt = n%10, low = 0;
while (high || (x && crt >= x)) {
//printf("%d %d %d %d\n", fact, high, crt, low);
res += high*fact;
if (x == 0) res -= fact;
if (crt > x) res += fact;
if (crt == x) res += (low+1);
low += fact*crt;
crt = high%10;
high /= 10;
fact *= 10;
}
return res;
}
int main(void)
{
int t, n;
cin >> t;
while (t --) {
cin >> n;
for (int i = 0; i < 10; i ++) {
printf("%d%c", cnt(n, i), i == 9 ? '\n' : ' ');
}
}
return 0;
}
3-4 周期串
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#define MAXN 100
char s[MAXN];
int main()
{
scanf("%s",s);
int l=1,n=strlen(s);
int flag=1;
for(int i=1;i<strlen(s);i++)
{
if(s[i]==s[0]) //posiable head
{
l=i-0; //posiable shortest long
flag=1;
if(n%l!=0)
continue;
for(int j=0;j<l;j++) //part1
{
for(int k=1;k<n/l;k++) //each part
{
if(s[j]!=s[j+k*l])
flag=0;
}
if(flag==0)
break;
}
printf("cycle: %d\n",l);
for(int i=0;i<l;i++)
printf("%c",s[i]);
printf("\n");
}
}
return 0;
}
3-5 riddle
#include<stdio.h>
char s[6][6]={"TRGSJ","XDOKI","M VLN","WPABE","UQHCF"};
void draw(void)
{
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
{
printf("%c ",s[i][j]);
}
printf("\n");
}
printf("\n");
}
int main()
{
draw();
char order;
int x=2,y=1;
int n=1;
//scanf("%c",&order); //test
//printf("%c\n",order);
while((scanf("%c",&order)==1)&&(order!='0'))
{
char t;
if(order=='\n')
continue;
switch(order)
{
case 'W': //up
{
if(x!=0)
{
t=s[x][y],s[x][y]=s[x-1][y],s[x-1][y]=t;
x=x-1;
}
}
break;
case 'S': //down
{
if(x!=4)
{
t=s[x][y],s[x][y]=s[x+1][y],s[x+1][y]=t;
x=x+1;
}
}
break;
case 'A': //left
{
if(y!=0)
{
t=s[x][y],s[x][y]=s[x][y-1],s[x][y-1]=t;
y=y-1;
}
}
break;
case 'D': //right
{
if(y!=4)
{
t=s[x][y],s[x][y]=s[x][y+1],s[x][y+1]=t;
y=y+1;
}
}
break;
default :printf("This puzzle has no final configuration\n");
}
draw();
}
return 0;
}
3-5 riddle
#include<stdio.h>
char s[6][6];
void draw(void)
{
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
{
printf("%c ",s[i][j]);
}
printf("\n");
}
printf("\n");
}
int main()
{
int x=0,y=0;
char order;
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
{
scanf("%c",&order);
if(order!='\n'&&order!='\r') //filter \n \r
{
s[i][j]=order;
}
else
{
scanf("%c",&s[i][j]); //next code
}
if(s[i][j]==' ') //only one block
{
x=i,y=j;
}
}
}
draw();
while((scanf("%c",&order)==1)&&(order!='0'))
{
if(order=='\n'||order=='\r')
continue;
char t;
switch(order)
{
case 'A':
{
if(x!=0)
{
t=s[x][y],s[x][y]=s[x-1][y],s[x-1][y]=t;
x=x-1;
}
}break;
case 'B':
{
if(x!=4)
{
t=s[x][y],s[x][y]=s[x+1][y],s[x+1][y]=t;
x=x+1;
}
}break;
case 'L':
{
if(y!=0)
{
t=s[x][y],s[x][y]=s[x][y-1],s[x][y-1]=t;
y=y-1;
}
}break;
case 'R':
{
if(y!=4)
{
t=s[x][y],s[x][y]=s[x][y+1],s[x][y+1]=t;
y=y+1;
}
}break;
default:printf("This Puzzle has not final configuration.\n");
}
draw();
}
return 0;
}
3-6 纵横字谜
#include<stdio.h>
#include<string.h>
#include<ctype.h>
char s[10][10];
char tab[10][10];
#define l 5
int n=1;
void draw1(void)
{
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
{
printf("%c ",s[i][j]);
}
printf("\n");
}
printf("\n");
}
void draw2(void)
{
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
{
if(tab[i][j]!='*')
printf("%2d ",tab[i][j]);
else
printf(" ");
}
printf("\n");
}
printf("\n");
}
int main()
{
char order;
for(int i=0;i<l;i++)
{
for(int j=0;j<l;j++)
{
scanf("%c",&order);
if(order!='\n'&&order!='\r')
{
s[i][j]=order;
//break; //next line
}
else
{
scanf("%c",&s[i][j]);
}
}
}
draw1();
for(int i=0;i<l;i++)
{
for(int j=0;j<l;j++)
{
if(isalpha(s[i][j]))
{
tab[i][j]=n;
n++;
}
else
{
tab[i][j]='*';
}
}
}
draw2();
return 0;
}
3-7 frequency of DNA
3-8 repeating decimals
#include<stdio.h>
void main()
{
return 0;
}
算法竞赛入门经典第二版 第三章
最新推荐文章于 2020-10-25 14:36:53 发布