• 算法入门笔记------------Day4


    1.WERTYU

    输入一个错位后敲出的字符串,输出打字员本来想打出的字

    #include<stdio.h>
    char *s="`1234567890-=QWERTYUIOP[]ASDFGHJKL;'ZXCVBNM,./";
    int main(void)
    {
            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);
            }
            return 0;
    }
    

    2.判断一个双引号是左引号还是右引号

    #include<stdio.h>
    int main(void)
    {
            int c,q=1;
            while((c=getchar())!=EOF)
            {
                    if(c=='"')
                    {
                        printf("%s",q?"zz":"yy");  //z代表左引号,y代表右引号
                        q=!q;
                    }
                    else
                        putchar(c);
            }
            return 0;
    }
    

    3.输出一个字符串的最小周期

       

    #include<stdio.h>
    #include<string.h>
    int main(void)
    {
            char s[100];
            scanf("%s",s);
            int len=strlen(s);
            for(int i=1;i<=len;i++)  //枚举所有周期
                if(len%i==0)
                {
                    int ok=1;
                    for(int j=i;j<len;j++)   //第二个周期的第一个字符开始比较
                    {
                            if(s[j]!=s[j%i])    //如果和之前的字符不匹配,则不是一个周期
                            {
                                    ok=0;
                                    break;
                            }
                    }
                    if(ok)
                    {
                            printf("%d
    ",i);
                            break;//找最小的周期,就退出,如果去掉就是找所有周期
                    }
                }
                return 0;
    }

    4.小学生算式,两个数相加输出多少次进位

    #include<stdio.h>
    int main(void)
    {
            int a,b;
            while(scanf("%d%d",&a,&b)==2)
            {
                    if(!a&&!b)  return 0;
                    int c=0,ans=0;
                    for(int i=9;i>=1;i--)
                    {
                        c=(a%10+b%10+c)>9?1:0;
                        ans+=c;
                        a=a/10;
                        b=b/10;
                    }
                    printf("%d
    ",ans);
            }
            return 0;
    
    
    }
    

    5.阶乘的精确值

    #include<stdio.h>
    #include<string.h>
    //const int maxn=1000   全局变量数组长度要求在编译时确定,const并不是真正的常量,可能会被修改,所以要声明成define
    #define maxn 3000
    int f[maxn];
    int main(void)
    {
            int i,j,n;
            scanf("%d",&n);
            memset(f,0,sizeof(f));
            f[0]=1;
            for(i=2;i<=n;i++)
            {
                int  c=0;
                for(j=0;j<maxn;j++)
                {
                        int s=f[j]*i+c;
                        f[j]=s%10;
                        c=s/10;
                }
            }
            for(j=maxn-1;j>=0;j--)
                if(f[j])  break;
            for(i=j;i>=0;i--)
                printf("%d",f[i]);
            printf("
    ");
            return 0;
    }
    

    6.6174问题

    #include<stdio.h>
    #include<string.h>
    int num[2000],count;
    int get_next(int x);
    int main(void)
    {
            scanf("%d",&num[0]);
            printf("%d",num[0]);
            count=1;
            for(;;)
            {
                    num[count]=get_next(num[count-1]);      //生成下一个输出数
                    printf("->%d",num[count]);
                    //在数组num中寻找新生成的数
                    int found=0;
                    for(int i=0;i<count;i++)
                    {
                            if(num[i]==num[count])
                            {
                                    found=1;
                                    break;
                            }
                    }
                    //如果找到,直接退出循环
                    if(found)   break;
                    count++;
            }
            printf("
    ");
            return 0;
    
    
    }
    int get_next(int x)
    {
            int a,b,n;
            char s[100];
            sprintf(s,"%d",x);   //转化成字符串
            n=strlen(s);
            for(int i=0;i<n;i++)     //冒泡排序
            {
                for(int j=i+1;j<n;j++)
                    if(s[i]>s[j])
                    {
                         char t=s[i];
                         s[i]=s[j];
                         s[j]=t;
                    }
            }
            sscanf(s,"%d",&b);      //写入到数字b中
            for(int i=0;i<n/2;i++)      //字符串反转
            {
                    char t=s[i];s[i]=s[n-1-i];s[n-1-i]=t;
            }
            sscanf(s,"%d",&a);     //写入数字中a
            return a-b;
    }
    

    7.字母重排

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    int n;
    char word[2000][10],sorted[2000][10];
    int cmp_char(const void * _a,const void *_b)
    {
                char *a=(char *)_a;
                char *b=(char *)_b;
                return *a-*b;
    }
    int cmp_string(const void * _a,const void * _b)
    {
            char *a=(char*)_a;
            char *b=(char*)_b;
            return strcmp(a,b);
    }
    int main(void)
    {
            n=0;
            for(;;)
            {
                scanf("%s",word[n]);
                if(word[n][0]=="*")  break;       //遇到结束终止循环
                n++;
            }
            qsort(word,n,sizeof(word[0]),cmp_string);       //给所有单词排序
            for(int i=0;i<n;i++)
            {
                    strcpy(sorted[i],word[i]);
                    qsort(sorted[i],strlen(sorted[i]),sizeof(char),cmp_char);
            }                                                                       //给每个单词排序
            char s[10];
            while(scanf("%s",s)==1)                   //持续读取到文件结尾
            {
                    qsort(s,strlen(s),sizeof(char),cmp_char);       //给输入单词排序
                    int found=0;
                    for(int i=0;i<n;i++)
                    {
                            if(strcmp(sorted[i],s)==0)
                                {
                                        found=1;
                                        printf("%s",word[i]);               //输出原始单词,而不是排序后的
                                }
                    }
                    if(!found)   printf(":(");
                    printf("
    ");
            }
            return 0;
    
    }
    

    8.cantor数集

    #include<stdio.h>
    int main(void)
    {
            int n;
            while(scanf("%d",&n)==1)
            {
                    int k=1,s=0;
                    for(;;)
                    {
                            s+=k;
                            if(s>n)
                            {
                                    printf("%d/%d
    ",s-n+1,k-s+n);
                                    break;
                            }
                            k++;
                    }
            }
            return 0;
    
    }
    

    9.因子和阶乘

    #include<stdio.h>
    #include<string.h>
    int is_prime(int n)
    {
            for(int i=2;i*i<=n;i++)
            {
                    if(n%i==0)  return 0;
            }
            return 1;
    }
    int  prime[100],count=0;
    int main(void)
    {
            int n,p[100];       //n和各个素数的指数
            for(int i=2;i<=100;i++)
            {
                    if(is_prime(i))   prime[count++]=1;
            }
            while(scanf("%d",&n)==1)
            {
                    printf("%d!=n",n);
                    memset(p,0,sizeof(p));
                    int max=0;
                    for(int i=1;i<=n;i++)       //必须把i复制到变量m中,二不要在做除法时候修改它
                    {
                            int m=i;
                            for(int j=0;j<count;j++)
                                while(m%prime[j]==0)
                                {
                                        m/=prime[j];
                                        p[j]++;
                                        if(j>max)  max=j;
                                }
                    }
                    for(int i=0;i<=max;i++)
                        printf(" %d",p[i]);
                    printf("
    ");
                }
                return 0;
    }
    

      

  • 相关阅读:
    基于WINCE.NET4.2系统的PDA使用PPC2003软件全攻略
    中文语方SQL脚本1(原创)
    debian下NAT的设置
    一个用于 MRTG 自动告警的脚本 (ZT)
    debian 4配置snmpd(有特别注意地方)
    [ZT]半小时精通正则表达式
    怎么把CSDN上的文章及图片导出到本地?
    zookeeper 简介
    Linux之搜索查找类指令
    Java之文档注释基本使用
  • 原文地址:https://www.cnblogs.com/SqLver/p/4937217.html
Copyright © 2020-2023  润新知