算法入门

127 阅读2分钟

开灯问题

//开灯问题

#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;
}