开灯问题
//开灯问题
#include<stdio.h>
#include<string.h>
int main()
{
int n,k,i,j;
scanf("%d%d",&n,&k);
int a[n+1];
memset(a,0,sizeof(a));
for(j=1;j<=k;j++) //因为是从1开始的,所以数组的长度要加一
for(i=1;i<=n;i++){
if(i%j==0) a[i] = !a[i];
}
int ok = 1,first = 1;
for(i=1;i<=n;i++){
if(a[i]){ //a[i]需存在才能输出,a[i]的值作为开关标准,重点要得到下标,此时下标为主体
// if(ok) {printf("%d",i);ok=0;}
// else printf(" %d",i); 这样的对printf(i)写了两次,有些冗余
//决定对printf( )进行划分
if(first) first = 0;else printf(" ");
printf("%d",i);
}
}
return 0;
}
sample
7 3
1 5 6 7
蛇形填数
//蛇形填数
#include<stdio.h>
#include<string.h>
int main()
{
int n,x,y;
scanf("%d",&n);
int a[n][n];
memset(a,0,sizeof(a));
int k = a[x=0][y=n-1] = 1;
while(k<n*n){ //刚开始为m--即要循环m次,但不对啊,不是赋值m次
// while(!a[++y][x])a[y][x] = ++k; 好像判断表达式内有点乱,同时x和y轴跟数学相反
// --y;
// while(!a[y][--x])a[y][x] = ++k;
// ++x;
// while(!a[--y][x])a[y][x] = ++k;
// ++y;
// while(!a[y][++x])a[y][x] = ++k;
// --x;
while(x+1<n && !a[x+1][y]) a[++x][y] = ++k; //刚开始写成了x<n-1,写成一般式
while(y-1>=0 && !a[x][y-1]) a[x][--y] = ++k; //判断里预判,循环体执行预判
while(x-1>=0 && !a[x-1][y]) a[--x][y] = ++k; //判断边界更清晰
while(y+1<n && !a[x][y+1]) a[x][++y] = ++k; //刚开始写成!a[x][y-1]死循环
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
printf("%d ",a[i][j]);
printf("\n");
}
return 0;
}
竖式问题
#include<stdio.h>
#include<string.h>
int main()
{
char s[20],buf[99];
int i,j,count = 0;
int ok;
scanf("%s",s);
for(i=100;i<1000;i++)
for(j=10;j<100;j++){
ok = 1;
sprintf(buf, "%d%d%d%d%d",i,j,j%10*i,j/10*i,i*j);
// printf("%d %d %d %d %d\n",i,j,j%10*i,j/10*i,i*j);数据出现出错,写成了j%10*i+j/10*i
for(int k=0;buf[k]!='\0';k++)
if(strchr(s,buf[k]) == NULL) ok = 0; //判断是否在s内
if(ok){
printf("<%d>\n",++count);
printf("%5d\nX%4d\n-----\n%5d\n%4d\n-----\n%5d\n\n",i,j,j%10*i,j/10*i,j*i);
}
}
printf("The sum of the situation:%d\n",count);
return 0;
}
TeX中的引号
#include<stdio.h>
int main()
{
char c;
int b = 1;
while((c=getchar())!=EOF){
if(c == '"'){
printf("%s",b?"``":"''"); //不用转义符,这样"\"",'\''才用
b = !b;
}
else
printf("%c",c);
}
return 0;
}
sample
"To be or not to be,"quoth the Bard,"that is the question"
WERTYU
#include<stdio.h>
char s[] = "`1234567890-=qwertyuiop[]\\asdfghjkl;'zxcvbnm,./";
int main()
{
char c;
int i,k=0;
while((c=getchar())!=EOF){
for(i=1;s[i] && c!=s[i];i++); //为什么要少了s[i]出现bus error 总线错误几乎都是由于未对齐的读或写引起的,那么说明它可能读取多了,可能读取\n,而在s中没找到,超出了s的范围
if(s[i]) printf("s[%d] = %c\n",k++,(s[i-1]));
else
putchar(c);
}
return 0;
}
对与if('\0')的讨论
#include<stdio.h>
int main()
{
int s[2];
s[0] = '\0';
s[1] = 'A';
if(s[1]) printf("1\n"); //当s[] = '\0'时编码也是0,可以用在判断语句中
else printf("0\n");
return 0;
}
回文词
#include<stdio.h>
#include<string.h>
#include<ctype.h>
char *m = "A 3 HIL JM O 2TUVWXY51SE Z 8 ";
char *h[] = {"is not thing","is mirror","is palidrom","mirror and palidrom"};
char rev(char c){
if(isalpha(c)) return m[c - 'A'];
else return m[c -'0' + 25];
}
int main()
{
char s[30];
while(scanf("%s",s)==1){ //多组输入记得重新初始化
int p=1,q=1; // p判断回文,q判断镜像
for(int i=0;i<strlen(s)/2;i++){
if(s[i] != s[strlen(s)-1-i]) p=0;
if(rev(s[i]) != s[strlen(s)-1-i]) q=0;
//printf("%c-%c\n",rev(s[i]),s[strlen(s)-1-i]);
}
printf("%s %s\n\n",s,h[p*2+q]);
}
return 0;
}
sample
NOTAPALINDROME
ISAPALINILAPASI
2A3MEAS
ATOYOTA
NOTAPALINDROME -- is not a palindrome.
ISAPALINILAPASI -- is a regular palindrome.
2A3MEAS -- is a mirrored string.
ATOYOTA -- is a mirrored palindrome.
去除指定的字符
#include<stdio.h>
#include<string.h>
int main()
{
char *s = "'A',' ',' ',' ','3',' ',' ','H','I','L',' ','J','M',' ','O',' ',' ',' ','2','T','U','V','W','X','Y','5','1','S','E',' ','Z',' ',' ','8',' '";
int n = strlen(s);
int k =0;
char a[n];
for(int i=0;i<n;i++){
if(s[i] == ',' || s[i] == '\'') //单引号的表示方法
continue;
a[k++] = s[i];
}
a[k] = '\0';
//puts(s);
puts(a);
return 0;
}
猜数字
#include <stdio.h>
char ans[1000],gus[1000];
int num[10];
int main()
{
int n,cnt=1;
while (scanf("%d",&n)==1&&n) {
printf("Game %d:\n",cnt++);
for (int i=0;i<n;i++) {
scanf("%d",&ans[i]);
}
while (true) {
int A=0,B=0;
for (int i=0;i<n;i++) {
scanf("%d",&gus[i]);
if (ans[i]==gus[i])
A++;
}
if (gus[0]==0)
break;
for (int d=1;d<=9;d++) {
int c1=0,c2=0;
for (int i=0;i<n;i++) {
if (ans[i]==d)
c1++;
if (gus[i]==d)
c2++;
}
if (c1<c2)
B+=c1;
else
B+=c2;
}
B-=A;
printf(" (%d,%d)\n",A,B);
}
}
return 0;
}