zoukankan      html  css  js  c++  java
  • 算法入门笔记------------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;
    }
    

      

  • 相关阅读:
    第一节:SpringMVC概述
    SpringMVC【目录】
    Windows 系统快速查看文件MD5
    (error) ERR wrong number of arguments for 'hmset' command
    hive使用遇到的问题 cannot recognize input
    Overleaf支持的部分中文字体预览
    Understanding and Improving Fast Adversarial Training
    Django2实战示例 第十三章 上线
    Django2实战示例 第十二章 创建API
    Django2实战示例 第十一章 渲染和缓存课程内容
  • 原文地址:https://www.cnblogs.com/SqLver/p/4937217.html
Copyright © 2011-2022 走看看