• 算法入门经典 第三章


    scanf 遇到tab或空格或换行符停下来
    1.例题2-1 7744问题 从数本身看 从个位数的数字看
    #include <iostream>
    #include<math.h>
    using namespace std;

    int main()
    {
    for(int a=1;a<=9;a++)
    {
    for(int b=1;b<=9;b++)
    {
    int n=1100*a+11*b;
    //floor x 等于1的区间为[1,2),florr(x+0.5)等于1的区间为[0.5,1.5)
    int m=floor(sqrt(n)+0.5);
    //判断两个浮点数是否相等
    if(m*m==n) cout<<n;

    }

    }
    return 0;
    }

    //枚举平方根x,避免开平方操作
    #include <iostream>
    #include<math.h>
    using namespace std;

    int main()
    {
    for(int x=1;;x++)
    {
    int n=x*x;
    if(n>9999) break;
    if(n<1000) continue;
    int a=n/100;
    int b=n%100;
    if(a/10==a%10&&b/10==b%10)
    cout<<n<<endl;
    }
    return 0;
    }

    2. 例题3-4 猜数字游戏的提示

    #include<stdio.h>
    #include<string.h>
    #define maxn 100
    int main()
    {
    int n,a[maxn],b[maxn];
    int kase=0;
    while(scanf("%d",&n)==1&&n)
    {

    for(int i=0;i<n;i++)
    scanf("%d",&a[i]);
    printf("Game %d: ",++kase);
    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) ",A,B-A);
    }

    }
    return 0;

    }

    例题3-2 开灯问题 类似头指针
    #include<stdio.h>
    #include<string.h>
    #define maxn 100
    int main()
    {
    int i,c;
    char s[]="12345567890";
    while((c=getchar())!=EOF)
    {
    for(i=1;s[i]&&s[i]!=c;i++);//找错位之后的字符在常量表中的位置

    if(s[i]) putchar(s[i]-1);
    else putchar(c);
    }
    return 0;

    }

    使用fgetc(fin)可以从打开的文件fin中读取一个字符。一般情况下应当在检查它不是EOF后再将其转换成char值。从标准输入读取一个字符可以用getchar,相当于fgetc(stdin)

    #include<stdio.h>
    #include<string.h>
    #define maxn 100
    int main()
    {
    int c,q=1;
    while((c=getchar())!=EOF){
    if(c=='"') {
    printf("%s",q?"``":"''");q=!q;}//q为真 左双引号 为假右双引号
    else printf("%c",c);}
    return 0;

    }

    程序3-3 蛇形填数

    #include<stdio.h>
    #include<string.h>
    #define maxn 20
    int a[maxn][maxn];
    int main()
    {
    int n,x,y,tot=0;
    scanf("%d",&n);
    memset(a,0,sizeof(a));
    tot=a[x=0][y=n-1]=1;
    while(tot<n*n)
    {
    while(x+1<n&&!a[x+1][y]) a[++x][y]=++tot;//变化后的位置的行坐标 下移一行x+1 
    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<n-1&&!a[x][y+1]) a[x][++y]=++tot;
    }
    for(x=0;x<n;x++)
    {
    for(y=0;y<n;y++)
    printf("%3d",a[x][y]);
    printf("
    ");
    } 
    return 0;
    }

    1、写一段代码,测试一段(printf),成功率极高。

    2、代码可读性强,增加了注释部分。

    -------------------------------------------------------------------------

    #include <stdio.h>
    
    int a[10][10];
    int n;
    void printa(){
    int i,j;
    for(i=1;i<=n;i++){
    for(j=1;j<=n;j++){
    printf("%d ",a[i][j]);
    }
    printf("
    ");
    }
    }
    int main(){
    int i,j;
    int k=0;
    int count=0;
    scanf("%d",&n);
    while(1){
    for(i=1+k;i<=n-k;i++){//右列 
    j=n-k;
    count++;
    a[i][j]=count;
    }
    
    for(j=n-1-k;j>=1+k;j--){//下行 
    i=n-k;
    count++;
    a[i][j]=count;
    }
    
    for(i=n-1-k;i>=1+k;i--){//左列 
    j=1+k;
    count++;
    a[i][j]=count;
    }
    
    for(j=2+k;j<=n-1-k;j++){//上行 
    i=1+k;
    count++;
    a[i][j]=count;
    }
    
    k++;//控制二维矩阵左右边界 
    if(count==n*n)//循环结束条件。 
    break;
    }
    printa();//打印矩阵 
    return 0;
    }


    例题3-3 回文词

    #include <stdio.h>
    #include <string.h>
    #include<ctype.h>
    const char *rev="A 3 HIL JM O 2TUVMXY51SE Z 8 ";
    const char *msg[]={"not a palindrome","a regular palidrome","a mirrored string","a mirrored palindrome"};
    char r(char ch)
    {
    if(isalpha(ch)) return rev[ch-'A'];
    return rev[ch-'0'+25];
    }
    int main()
    { 
    `
    char s[30];
    //scanf tab 空格 回车 结束
    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",s,msg[m*2+p]);
    }
    return 0;
    }

    例题3-5 生成元

    #include<stdio.h>
    #include<string.h>
    #define maxn 10005
    int ans[maxn];
    int main()
    {
    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
    ",ans[n]);
    }
    return 0;
    }


    例题 3-6 环状序列

    #include<stdio.h>
    #include<string.h>
    #define maxn 105
    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;//equal
    
    }
    int main()
    {
    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++)
    //从第几位开始循环至第一位 比如 234561 345612 
    putchar(s[(i+ans)%n]);
    putchar('
    '); 
    }
    return 0;
    }
  • 相关阅读:
    ConfigurableApplicationContext
    JCA-Java加密框架
    Resource通配符路径 ——跟我学spring3
    Spring学习总结(四)——表达式语言 Spring Expression Language
    Spring讲解-----------表达式语言
    java多线程详解(5)-Threadlocal用法
    ThreadLocal 详解
    MessageFormat
    WPF中的导航框架(一)——概述
    在WPF中实现玻璃模糊效果
  • 原文地址:https://www.cnblogs.com/is-Tina/p/7340085.html
Copyright © 2020-2023  润新知