算法入门笔记------------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;
}

  

原文地址:https://www.cnblogs.com/SqLver/p/4937217.html