东华大学计算机软件工程复试 进阶练习

1、求长方形的面积和周长

#include <stdio.h>
int main()
{
    int a,b;
    while(~scanf("%d%d",&a,&b))
    {
        printf("%d %d
",a*b,2*(a+b));
    }
    return 0;
}

2、数列和

int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        int sum=0;
        for(int i=1;i<=n;i++)
            sum+=i;
        printf("%d
",sum);
    }
    return 0;
}

3、解方程

#include <stdio.h>
int main()
{
    double x;
    int a,b;
    while(~scanf("%d%d",&a,&b))
    {
        x=(double)(5-3*b)/(double)(2*a);
        printf("%.1f
",x);
    }
    return 0;
}

4、一个月的天数

#include <stdio.h>
//            1  2  3  4  5  6  7  8  9  10  11  12
//  闰年366   31 29 31 30 31 30 31 31 30 31  30  31  year%400==0||(year%4==0&&year%100!=0)
//非闰年365   31 28 31 30 31 30 31 31 30 31  30  31
int main()
{
    int year,month;
    scanf("%d%d",&year,&month);
    int flag=0;
    if(year%400==0||(year%4==0&&year%100!=0))flag=1;
    int days;
    switch(month)
    {
        case 4:
        case 6:
        case 9:
        case 11:days=30;break;
        case 2:days=flag?29:28;break;
        default:days=31;break;
    }
    printf("%d
",days);
   return 0; }

5、银行存款到期日

#include <stdio.h>
int fun(int year,int month)
{
    int flag=0;
    if(year%400==0||(year%4==0&&year%100!=0))flag=1;
    int days;
    switch(month)
    {
        case 4:
        case 6:
        case 9:
        case 11:days=30;break;
        case 2:days=flag?29:28;break;
        default:days=31;break;
    }
    return days;
}
int main()
{
    int year,month,day,time;
    scanf("%d%d%d%d",&year,&month,&day,&time);
    year+=time/12;
    month+=time%12;
    if(month>12)
    year+=month/12,month=month%12;
    int temp=fun(year,month);
    if(temp<day)day=temp;
    printf("%d %d %d
",year,month,day);
    return 0;
}

6、实数运算

#include <stdio.h>
int main()
{
    double a,b;
    char c;
    scanf("%lf%lf",&a,&b);
    getchar();
    scanf("%c",&c);
    if(c=='+')printf("%.1f
",a+b);
    else if(c=='-')printf("%.1f
",a-b);
    else if(c=='*')printf("%.1f
",a*b);
    else
    {
        if(b==0)printf("Wrong!
");
        else    printf("%.1f
",a/b);
    }
    return 0;
}

7、解二次方程

#include <stdio.h>
#include <math.h>
int main()
{
    double a,b,c;
    scanf("%lf%lf%lf",&a,&b,&c);
    double result1,result2;
    result1=(-b-sqrt(b*b-4*a*c))/(2*a);
    result2=(-b+sqrt(b*b-4*a*c))/(2*a);
    printf("%.2f %.2f
",result2,result1);
    return 0;
}

8、求第几天

#include <stdio.h>
int main()
{
    int year,month,day;
    scanf("%d%d%d",&year,&month,&day);
    int flag=0,i;
    if(year%400==0||(year%4==0&&year%100!=0))flag=1;
    int days[12]={0};
    for(i=1;i<=12;i++)
    {
        if(i==1||i==3||i==5||i==7||i==8||i==10||i==12)
            days[i-1]=31;
        else if(i==4||i==6||i==9||i==11)days[i-1]=30;
        else days[1]=flag?29:28;
    }
    int re=0;
    for(i=1;i<month;i++)re+=days[i-1];
    re+=day;
    printf("%d
",re);
    return 0;
}

9、求阶乘结果0的个数

//计算各乘数中因子5的个数即可。
#include <stdio.h>
int main()
{
    int num,count,i,temp;
    while(~scanf("%d",&num))
    {
        count=0;
        for(i=1;i<=num;i++)
        {
            temp=i;    //这里注意
            while(temp%5==0)
            {
                count++;
                temp/=5;
            }
        }
        printf("%d
",count);
    }
    return 0;
}

10、怪数

#include <stdio.h>
int isOdd(int num)
{
    int re=0,i;
    for(i=1;i<num;i++)if(num%i==0)re+=i;
    if(re==num)return 1;
    else return 0;
}
int main()
{
    int num,i;
    scanf("%d",&num);
    for(i=2;i<=num;i++)if(isOdd(i))printf("%d
",i);
    return 0;
}

11、abc数字

#include <stdio.h>
int main()
{
    int a,b,c;
    while(~scanf("%d%d%d",&a,&b,&c))
    {
        int x=a*100+b*10+c;
        int y=c*100+b*10+a;
        int re=x*y;
        int count=0,temp=re,t;
        while(temp)
        {
            t=temp%10;
            if(t==a||t==b||t==c)count++;
            temp/=10;
        }
        printf("%d %d
",re,count);
    }
    return 0;
}

12、奇妙的比值

#include <stdio.h>
double fun(int num)
{
    int re=0,i;
    for(i=1;i<=num;i++)
        if(num%i==0)re+=i;
    return (double)re/(double)num;
}
int main()
{
    int num;
    while(~scanf("%d",&num))
        printf("%.2f
",fun(num));
    return 0;
}

13、t的倍数n

#include <stdio.h>
#include <math.h>
__int64 fun(int num)
{
    if(num==1) return 7;
    int r=1;
    __int64 i,a,b;
    for(i=1;i<=100000;i++)
    {
        if(i>=pow(10,r))r++;
        a=i*10+7;
        b=7*pow(10,r)+i;
        if(b==a*num)return a;
    }
    return -1;
}
int main()
{
    int num;
    while(~scanf("%d",&num))
    {
        if(fun(num)==-1)printf("No
");
        else printf("%I64d
",fun(num));
    }
    return 0;
}

14、黑色星期五

#include <stdio.h>
int fun(int year,int month)
{
    int flag=0;
    if(year%400==0||(year%4==0&&year%100!=0))flag=1;
    int days;
    switch(month)
    {
        case 4:
        case 6:
        case 9:
        case 11:days=30;break;
        case 2:days=flag?29:28;break;
        default:days=31;break;
    }
    return days;
}
int main()
{
    int n,i;
    scanf("%d",&n);
    int count[7]={0};
    int year=1900,month,total_day=14;
    while(year<=1900+n-1)
    {
        month=1;
        while(month<=12)
        {
            count[total_day%7]++;
            //printf("%d %d %d %d
",year,month,total_day,total_day%7);
            total_day+=fun(year,month);
            month++;
        }
        year++;
    }
    for(i=0;i<6;i++)printf("%d ",count[i]);printf("%d
",count[i]);
    return 0;
}

15、三角形

#include <stdio.h>
int main()
{
    int a,b,i,j;
    while(~scanf("%d%d",&a,&b))
    {
        for(i=1;i<=b;i++)
        {
            for(j=1;j<=i-1;j++)
            {
                printf("%d ",a);
                a++;
                if(a==10)a=1;
            }
            printf("%d
",a);
            a++;
            if(a==10)a=1;
        }
    }
    return 0;
}

16、数字串处理

#include <stdio.h>
#include <malloc.h>
int main()
{
    int n,i;
    while(~scanf("%d",&n))
    {
        int* a=(int*)malloc(sizeof(int)*n);
        for(i=0;i<n;i++)scanf("%d",&a[i]);
        int res_count=1,res=a[0],cur,cur_count=0;
        for(i=1;i<n;i++)
        {
            if(a[i]==a[i-1])
            {
                if(cur_count!=0){cur_count++;if(cur_count>res_count)res_count=cur_count,res=cur;}
                else res_count++;
            }
            else
            {
                cur=a[i];
                cur_count=1;
            }
        }
        printf("%d %d
",res,res_count);
    }
    return 0;
}

17、公式求解

#include <stdio.h>
int main()
{
    int a,b,x,y;
    while(~scanf("%d%d",&a,&b))
    {
        if(a==0&&b==0)break;
        for(x=1;x<=100;x++)
        {
            for(y=1;y<=100;y++)
            {
                if((x*x+a*a)==(y*y+b*b))
                    printf("%d %d
",x,y);
            }
        }
        printf("
");
    }
    return 0;
}

18、累加式

#include <stdio.h>
int main()
{
    int n,i;
    while(~scanf("%d",&n))
    {
        i=1;
        if(n==1)printf("1
");
        else printf("1");
        while(i<n)
            printf("+%d",++i);
        while(i>2)
            printf("+%d",--i);
        if(n!=1)printf("+1
");
    }
    return 0;
}

19、约瑟夫环

#include <stdio.h>
#include <string.h>
//用数组模拟环 取出后置-1 时间复杂度n*n 
//会超时
int main()
{
    int a[20];
    int n,m,i,index,count_n,count_m,flag;
    while(~scanf("%d",&n))
    {
        //m从n+1开始取值
        for(m=n+1;;m++)
        {
            for(i=2*n-1;i>=0;i--)a[i]=i+1;
            flag=0;//是否选到了普通人
            count_n=0;
            count_m=0;
            index=-1;
            while(count_n!=n)//当淘汰完所有绑匪停止
            {
                while(count_m!=m)//当数m个人时停止
                {
                    index=(index+1)%(2*n);
                    if(a[index]!=-1)count_m++;
                }
                if(a[index]<=n){flag=1;break;printf("淘汰%d
",m);}//选到了普通人
                count_n++;
                //淘汰1个人
                a[index]=-1;
                count_m=0;
            }
            if(!flag)//找到了m
            {
                printf("%d
",m);
                break;
            }
        }
    }
    return 0;
}
#include <stdio.h>
int main()
{
    int n;
        int num[10]={0,2,7,5,30,169,441,1872,7632,1740,93313};
    while (scanf("%d", &n) != EOF)
    {
          printf("%d
",num[n]);
    }
    return 0;
}

20、整除的尾数

#include <stdio.h>
#include <math.h>
int main()
{
    int n,i,size;
    __int64 a,b,temp;
    int res[20];
    while(~scanf("%d",&n))
    {
        while(n--)
        {
            scanf("%I64d%I64d",&a,&b);
            size=0;
            for(i=0;i<100;i++)
            {
                temp=a*100+i;
                if(temp%b==0)res[size++]=i;
            }
            for(i=0;i<size-1;i++)printf("%d ",res[i]);if(size>0)printf("%d
",res[i]);
        }
    }
    return 0;
}

21、回文质数

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
int isPrimeNumber(__int64 n)
{
    if(n==1)return 0;
    for(int i=2;i<=sqrt(n);i++)
        if(n%i==0)return 0;
    return 1;
}
int isPlalindrome(char* str)
{
    int size=strlen(str);
    int i=0,j=size-1;
    while(i<j)
    {
        if(str[i]!=str[j]) return 0;
        i++,j--;
    }
    return 1;
}
int main()
{
    char str[7];
    __int64 a,b,i;
    scanf("%I64d%I64d",&a,&b);
    for(i=a;i<=b;i++)
    {
        itoa(i,str,10);
        if(isPlalindrome(&str[0])&&isPrimeNumber(i))printf("%I64d
",i);
    }
    return 0;
}

22、汽水瓶

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

23、阶乘最后的非零位

#include <stdio.h>
//http://www.docin.com/p-328958091.html
//https://www.cnblogs.com/cshg/p/5762316.html
//每次只保留 非零的最后一位 这种想法是错误的 比如14!最右一位是2 ;15!最右一位是8;而2*15=30得到的结果为3

//找到阶乘中因数为factor的个数 若p是质数
//result=[n/p]+[n/p^2]+[n/p^3]+....+[n/p^k]
int GetFactorNumber(int Number, int Factor) {
    int result = 0;
    if(Factor < 2 || Number < 1)
        return -1;
    while(Number >= Factor)
        result += Number /= Factor;
    return result;
}

int GetLastDigit(int Number) {
    int result = 1;
    int i;
    int tmp;
    int Count = 0;
    int TotalFactors = GetFactorNumber(Number, 5);//Number!阶乘中5的个数
    for(i = Number; i >= 1; i--) {
        tmp = i;
        while(tmp % 2 == 0 && Count < TotalFactors) {//去除TotalFactors个2
            tmp /= 2;
            Count++;
        }
        while(tmp % 5 == 0)//去除TotalFactors个5
            tmp /= 5;
        result *= tmp;//与结果相乘
        result %= 10;//结果只保留个位数
    }
    return result;
}
int main() {
    int n;
    scanf("%d", &n);
    printf("%d
", GetLastDigit(n));
    return 0;
}

 24、算菜价

#include <stdio.h>
int main() {
    int n;
    int num;
    char name[10];
    double a,b,res;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d",&num);
        res=0;
        while(num--)
        {
            scanf("%s",&name);getchar();
            scanf("%lf%lf",&a,&b);
            res+=a*b;
        }
        res=(int)(res*10+0.5)/10.0;//小数点后二位 四舍五入
        printf("%.1f
",res);
    }
    return 0;
}

25、繁殖问题

#include <stdio.h>
/*
#1 1
#2 1
#3 =#2+#1=2
#4 =#3+#2=3
#5 =#4+#3=5
#6 =#5+(#4-#1)=5+3-1=7
#7 =#(7-1)天前的小数死亡 更新存活的数量
   =#6+(#5-#2)=6+4-0=10
#n =#(n-1)       + (#(n-2)-#(n-5))
    上个月的个数 + 已经可以繁殖的个数
10+7-2-1
*/
int main() {
    __int64 num[51]={0};//模拟每月存活的数量 动态变化
    __int64 res[51]={0};//每月的结果
    num[1]=num[2]=1;num[3]=2;num[4]=3;num[5]=5;num[6]=7;num[7]=10;
    res[1]=res[2]=1;res[3]=2;res[4]=3;res[5]=5;res[6]=7;res[7]=10;
    int i,temp;
    for(i=7;i<=50;i++)
    {
        temp=i-1;
        while(temp)num[temp--]-=num[i-6];//死亡
        res[i]=num[i-1]+num[i-2]-num[i-5];
        num[i]=res[i];
    }
    int n;
    while(~scanf("%d",&n))
    {
        printf("%I64d
",res[n]);
    }
    return 0;
}

26、树

#include <stdio.h>
#include <malloc.h>
#include <string.h>
int main() {
    int len,num,a,b,i;
    while(~scanf("%d%d",&len,&num))
    {
        len++;
        int *tree=(int*)malloc(sizeof(int)*len);
        //注意不是字符数组时 要写sizeof(int)*len
        memset(tree,0,sizeof(int)*len);
        while(num--)
        {
            scanf("%d%d",&a,&b);
            for(i=a;i<=b;i++)
                if(tree[i]==0)len--,tree[i]=1;
        }
        printf("%d
",len);
    }
    return 0;
}

27、约瑟夫环

#include <stdio.h>
#include <string.h>
//用数组模拟环 取出后置-1 时间复杂度n*n
int main()
{
    int a[100];
    int n,m,i,index,count_n,count_m;
    while(~scanf("%d%d",&n,&m))
    {
        count_n=0;
        count_m=0;
        index=-1;
        for(i=n-1;i>=0;i--)a[i]=i+1;
        while(count_n!=n)//当淘汰完所有人停止
        {
            while(count_m!=m)//当数m个人时停止
            {
                index=(index+1)%n;
                if(a[index]!=-1)count_m++;
            }
            count_n++;
            //淘汰第1个人
            if(count_n==n)printf("%d
",a[index]);//最后一个
            else printf("%d ",a[index]);
            a[index]=-1;
            count_m=0;
        }
    }
}

28、最大与最小

#include <stdio.h>
#include <malloc.h>
int getLenSum(int* arr,int size,int len,int start)
{
    int res=0;
    while(len--)
    {
        res+=arr[(start++)%size];
    }
    return res;
}
int main() {
    int size,len,i,max,min,temp;
    while(~scanf("%d%d",&size,&len))
    {
        int *arr=(int*)malloc(sizeof(int)*size);
        for(i=0;i<size;i++)scanf("%d",&arr[i]);
        max=getLenSum(arr,size,len,0);
        min=max;
        for(i=1;i<size;i++)
        {
            temp=getLenSum(arr,size,len,i);
            max=max>=temp?max:temp;
            min=min<=temp?min:temp;
        }
        printf("Max=%d
",max);
        printf("Min=%d

",min);
    }
    return 0;
}

29、环

#include <stdio.h>
int fun(int* arr,int index)
{
    int len=9,i=index;
    __int64 a=0,b=0,temp;
    while(len){a=a*10+arr[(i++)%9];len--;}
    len=9;
    i=index-1;
    while(len){if(i==-1)i=8;b=b*10+arr[i--];len--;}
    if(a<b){temp=a;a=b;b=temp;}
    if((a-b)%396==0)return 1;
    else return 0;
}
int main() {
    int n,i,count;
    int arr[9];
    scanf("%d",&n);
    while(n--)
    {
        count=0;
        for(i=0;i<9;i++)scanf("%d",&arr[i]);
        for(i=0;i<9;i++)if(fun(arr,i))count++;
        printf("%d
",count);
    }
    return 0;
}

30、求数列项

#include <stdio.h>
int main() {
    int arr[51];
    int i,n;
    arr[1]=1;arr[2]=5;
    for(i=3;i<=50;i++)
        arr[i]=arr[i-1]+(i-3)*3+7;
    while(~scanf("%d",&n))
        printf("%d
",arr[n]);
    return 0;
}

31、最高频率

#include <stdio.h>
#include <string.h>
int main() {
    int i,size,temp,res;
    int arr[110];
    while(~scanf("%d",&size))
    {
        res=1;
        memset(arr,0,sizeof(int)*110);
        for(i=0;i<size;i++){scanf("%d",&temp);arr[temp]++;}
        for(i=2;i<110;i++)if(arr[i]>arr[res])res=i;
        printf("%d
",res);
    }
return 0; }

32、三艘船

#include <stdio.h>
//找出速度最快的那个船 然后遍历答案
int main() {
    int t[3],v[3];
    int max_vi,i,temp,s,time;
    while(~scanf("%d%d%d",&t[0],&t[1],&t[2]))
    {
        scanf("%d%d%d",&v[0],&v[1],&v[2]);
        //找出速度最快的 再将其放到第一项
        max_vi=0;for(i=1;i<3;i++)if(v[i]>v[max_vi])max_vi=i;
        if(max_vi!=0)
        {
            temp=v[max_vi];v[max_vi]=v[0];v[0]=temp;
            temp=t[max_vi];t[max_vi]=t[0];t[0]=temp;
        }
        time=t[0];
        //依次根据time 设距离s
        while(1)
        {
            s=v[0]*time;
            if((s/v[1])%24==t[1]&&(s/v[2])%24==t[2])break;
            time+=24;
        }
        printf("%d
",s);
    }
    return 0;
}

33、回文数

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
int isPlalindrome(char* str)
{
    int size=strlen(str);
    int i=0,j=size-1;
    while(i<j)
    {
        if(str[i]!=str[j]) return 0;
        i++,j--;
    }
    return 1;
}
__int64 getReverseInt(char* str)
{
    int len=strlen(str),i;
    __int64 res=0;
    for(i=len-1;i>=0;i--)
    res=res*10+str[i]-'0';
    return res;
}
int main()
{
    __int64 n,a,b;
    char str[10];
    while(1)
    {
        scanf("%I64d",&n);
        if(n==0)break;
        while(1)
        {
            itoa(n,str,10);
            a=n;b=getReverseInt(&str[0]);
            n=a+b;
            printf("%I64d+%I64d=%I64d
",a,b,n);
            itoa(n,str,10);
            if(isPlalindrome(&str[0]))break;
        }
    }
    return 0;
}

34、特殊四位数

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
int main()
{
    //char str[4];
    int n,size=0,i;
    int res[3]={1156,3136,7921};
    /*for(i=1000;i<=9999;i++)
    {
        if(sqrt(i)-(int)sqrt(i)!=0)continue;
        itoa(i,str,10);
        if(str[0]-'0'+str[2]-'0'==(str[1]-'0')*(str[3]-'0'))
            res[size++]=i;
    }*/
    while(~scanf("%d",&n))
        printf("%d
",res[n-1]);
    return 0;
}

35、最大值

#include <stdio.h>
#include <malloc.h>
int getNextN(int* arr,int size,int index,int n)
{
    int res=0,i=index;
    while(i<index+n)res+=arr[i++];
    return res;
}
int main()
{
    int n,a,b,res,i,j,max,temp;
    while(~scanf("%d%d%d",&n,&a,&b))
    {
        int *arr=(int*)malloc(sizeof(int)*n);
        for(i=0;i<n;i++)scanf("%d",&arr[i]);
        max=arr[0];
        for(i=a;i<=b;i++)
        {
            for(j=0;j<n-i+1;j++)
            {
                temp=getNextN(arr,n,j,i);
                if(temp>max)max=temp;
            }
        }
        printf("%d
",max);
    }
    return 0;
}

36、数列1

#include <stdio.h>
#include <malloc.h>
int getNextNSum(int* arr,int size,int index,int n)
{
    int res=0,i=index;
    while(i<index+n)res+=arr[i++];
    return res;
}
int main()
{
    int n,i,j,count,temp;
    while(~scanf("%d",&n))
    {
        count=0;
        int *arr=(int*)malloc(sizeof(int)*n);
        for(i=0;i<n;i++)scanf("%d",&arr[i]);
        for(i=1;i<=n;i++)
        {
            for(j=0;j<n-i+1;j++)
            {
                temp=getNextNSum(arr,n,j,i);
                if(temp%11==0)count++;
            }
        }
        printf("%d
",count);
    }
    return 0;
}

37、混合牛奶

#include <stdio.h>
#include <malloc.h>
#include <iostream>
using namespace std;
typedef struct farmers
{
    int price;
    __int64 account;
}Farmer;
void sort(Farmer* farmers,int size)
{
    int i,j,flag;
    for(i=0;i<size-1;i++)
    {
        flag=0;
        for(j=1;j<size-i;j++)
        {
            if(farmers[j].price<farmers[j-1].price)
            {
                swap(farmers[j],farmers[j-1]);
                flag=1;
            }
        }
        if(!flag)break;
    }
}
int main()
{
    __int64 total,res=0;
    int num,i;
    scanf("%I64d%d",&total,&num);
    Farmer *farmers=(Farmer*)malloc(sizeof(Farmer)*num);
    for(i=0;i<num;i++)
        scanf("%d%I64d",&farmers[i].price,&farmers[i].account);
    sort(farmers,num);
    i=0;
    while(total)
    {
        if(farmers[i].account<total)
        {
            res+=farmers[i].account*farmers[i].price;
            total-=farmers[i].account;
            i++;
        }
        else
        {
            res+=total*farmers[i].price;
            total=0;
        }
    }
    printf("%I64d
",res);
    return 0;
}

38、修理牛棚

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
//M为木板最大数 C是牛的数目 a[]为安置牛的牛棚编号大小为C
//1# 若木板数比牛数多M>=C 
//       每个牛用一块木板,长度为C
//2# 若木板数小于牛棚数
//       先用一整根木板挡住牛棚 长度为L1=a[C-1]-a[0]+1
//       再将这一整根木板切掉M-1处没有放牛 但需要遮挡的连续的牛棚的长度(每次选择最长的) 
//       算出两个相邻的牛棚所需的额外放置的无用木板 C-1个放在b[]中
//       在b[]中找出M-1个无用木板 总长度为L2
//       结果为L1-L2
int cmp(const void* a,const void*b)
{
    return (*(int*)a-*(int*)b);
}
int main()
{
    int M,C,i,index;
    scanf("%d%d",&M,&C);
    int *a=(int*)malloc(sizeof(int)*C);
    int *b=(int*)malloc(sizeof(int)*(C-1));
    for(i=0;i<C;i++)scanf("%d",&a[i]);
    if(M>=C )printf("%d
",C);//1#
    else//2#
    {
        qsort(a,C,sizeof(int),cmp);//牛棚排序
        int L1=a[C-1]-a[0]+1;
        for(i=0;i<C-1;i++)b[i]=a[i+1]-a[i]-1;//算出M-1个 连续无用木板的长度
        qsort(b,C-1,sizeof(int),cmp);//排序无用木板
        index=C-2;
        for(i=0;i<M-1;i++)L1-=b[index--];//减去M-1个 最长的连续无用木板
        printf("%d
",L1);
    }
    return 0;
}

39、奇妙的数字

#include <stdio.h>
__int64 getSum(__int64 n)
{
    __int64 res=0;
    while(n)
    {
        res+=n%10;
        n/=10;
    }
    return res;
}
int main()
{
    __int64 res[10],i=0;;
    int size=0,n;
    for(i=0;size<10;i++)
        if(getSum(i)%17==0&&getSum(i+1)%17==0)res[size++]=i;
    while(~scanf("%d",&n))printf("%I64d
",res[n-1]);
    return 0;
}

40、按要求输出序列

#include <stdio.h>
#include <stdlib.h>
int cmp(const void* a,const void *b)
{
    return (*(int*)a-*(int*)b);
}
int main()
{
    int n,i,p;
    int arr[200]={0};
    while(~scanf("%d",&n))
    {
        for(i=0;i<n;i++)scanf("%d",&arr[i]);
        qsort(arr,n,sizeof(int),cmp);
        p=0;
        for(i=1;i<n;i++)
        {
            if(arr[i]!=arr[p])arr[++p]=arr[i];
        }
        for(i=0;i<p;i++)printf("%d ",arr[i]);printf("%d
",arr[i]);
    }
    return 0;
}

41、部落人乘法

#include <stdio.h>
int main()
{
    int a,b,res,temp;
    while(~scanf("%d%d",&a,&b))
    {
        res=0;
        printf("%d*%d=",a,b);
        while(1)
        {
            if(a==1){res+=b;printf("%d=%d
",b,res);break;}
            if(a%2==1){res+=b;printf("%d+",b);}
            a/=2;b*=2;
        }
    }

    return 0;
}

42、双重回文数

#include <stdio.h>
//进制转换 取余倒序 5%2=1 5/2=2; 2%2=0 2/2=1 ;1%2=1 1/2=0; 5=101
char number[21]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K'};
int D2R(int num,int r,char *ch)//将十进制数num转为r进制数 返回的size为所求数的第一位的位置(倒序)
{    int mod_num,i=0,flag=0;
    if(num<0){num=-num;flag=1;}
    if(num==0){ch[i++]='0';}
    while(num)
    {
        mod_num=num%r;
        ch[i++]=number[mod_num];
        num/=r;
    }
    if(flag)ch[i++]='-';
    return i-1;
}
int isPalindrome(char* ch,int size)
{
    int i=0,j=size,flag=1;
    while(!(i-1==j)&&!(i==j))
    {
        if(ch[i]!=ch[j]){flag=0;break;}
        i++,j--;
    }
    return flag;
}
int main()
{
    int n,s,i,r,count,size;
    char ch[10000];
    scanf("%d%d",&n,&s);
    for(i=s+1;n>0;i++)
    {
        count=0;
        for(r=2;r<=10;r++)
        {
            size=D2R(i,r,&ch[0]);
            if(isPalindrome(&ch[0],size))count++;
            if(count==2){printf("%d
",i);n--;break;}
        }
    }
    return 0;
}

42、数列2

#include <stdio.h>
#include <string.h>
//类似思路 https://blog.csdn.net/qq_39883358/article/details/88929010
//每个数都有选或者不选两种情况
int fun(int index,int sum,int* a,int size)
{
    if(index==size-1&&(sum%11!=0||sum==0))return 0;
    else if(index==size-1&&sum%11==0)return 1;
    else
        return fun(index+1,sum+a[index+1],a,size)+//选第index+1个
    fun(index+1,sum,a,size);//不选index+1个
}
int main()
{
    int a[15];
    int n,i;
    while(~scanf("%d",&n))
    {
        for(i=0;i<n;i++)scanf("%d",&a[i]);
        printf("%d
",fun(-1,0,a,n));
    }
    return 0;
}

43、序列

#include <stdio.h>
//先构造一个差为1的等差数列 再将剩余的依次加到每项
int main()
{
    int res[143];
    int i,n,size;
    while(~scanf("%d",&n))
    {
        int remain=n,i=0;
        while(i<=remain)
        {
            res[i]=i;
            remain-=i;
            i++;
        }
        size=i;
        for(i=size-1;i>=1&&remain;i--)
        {
            remain--;
            res[i]++;
        }
        for(i=1;i<size-1;i++)
            printf("%d,",res[i]);
        printf("%d
",res[i]);
    }
    return 0;
}

44、双重回文数

#include <stdio.h>
//进制转换 取余倒序 5%2=1 5/2=2; 2%2=0 2/2=1 ;1%2=1 1/2=0; 5=101
char number[21]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K'};
int D2R(int num,int r,char *ch)//将十进制数num转为r进制数 返回的size为所求数的第一位的位置(倒序)
{    int mod_num,i=0,flag=0;
    if(num<0){num=-num;flag=1;}
    if(num==0){ch[i++]='0';}
    while(num)
    {
        mod_num=num%r;
        ch[i++]=number[mod_num];
        num/=r;
    }
    if(flag)ch[i++]='-';
    return i-1;
}
int isPalindrome(char* ch,int size)
{
    int i=0,j=size,flag=1;
    while(!(i-1==j)&&!(i==j))
    {
        if(ch[i]!=ch[j]){flag=0;break;}
        i++,j--;
    }
    return flag;
}
int main()
{
    int n,s,i,r,count,size;
    char ch[10000];
    scanf("%d%d",&n,&s);
    for(i=s+1;n>0;i++)
    {
        count=0;
        for(r=2;r<=10;r++)
        {
            size=D2R(i,r,&ch[0]);
            if(isPalindrome(&ch[0],size))count++;
            if(count==2){printf("%d
",i);n--;break;}
        }
    }
    return 0;
}

45、等差数列

#include <stdio.h>
#include <math.h>
#include <malloc.h>
#include <string.h>
int doubleSquare[250*250*2+1];//双平方数
//返回数列的第i项
int fun(int a,int b,int i)
{
    return a+b*i;
}
//先判断上界为m的双平方数
void initDoubleSquare(int m)
{
    memset(doubleSquare,0,sizeof(int)*(m*m*2+1));
    int i,j;
    for(i=0;i<=m;i++)
        for(j=i;j<=m;j++)
            doubleSquare[i*i+j*j]=1;
}
int main()
{
    int n,m,i,max,a,b,flag,exist;
    //for(i=1;i<250;i++)if(doubleSquare[i])printf("%d ",i);
    while(~scanf("%d%d",&n,&m))
    {
        exist=0;//判断是否存在这样的数组
        max=2*m*m+1;//数组的上界
        initDoubleSquare(m);
        /*for(i=1;i<max;i++)if(doubleSquare[i])printf("%d ",i);
        printf("
");*/
        
        for(b=1;(n-1)*b<max;b++)//当a=0时,数组最后一项大于数组上界结束
        {
            for(a=0;fun(a,b,n-1)<max;a++)//当数组最后一项大于数组上界结束
            {
                flag=1;
                for(i=0;i<n;i++)
                {
                    if(!doubleSquare[fun(a,b,i)])
                    {
                        flag=0;
                        break;
                    }
                }
                if(flag)
                {
                    exist=1;    
                    printf("%d %d
",a,b);
                }    
            }
        }
        if(!exist)printf("NONE
");
    }
    return 0;
}

46、人见人爱A-B

#include <stdio.h>
#include <stdlib.h>
int cmp(const void*a,const void* b)
{
    return (*(int*)a-*(int*)b);
}
int main()
{
    int num,i,j,n,m,p1,p2;
    int a[100],b[100];
    scanf("%d",&num);
    while(num--)
    {
        scanf("%d%d",&n,&m);
        for(i=0;i<n;i++)scanf("%d",&a[i]);
        for(i=0;i<m;i++)scanf("%d",&b[i]);
        qsort(a,n,sizeof(int),cmp);
        qsort(b,m,sizeof(int),cmp);
        p1=-1,p2=0;//p2为工作指针 p1为结果指针
        for(i=0;i<m;i++)
        {
            //如果a[p2]的值比b[i]的值小 那么保存a[p2]的值 p2++
            while(a[p2]<b[i]&&p2<n)
                a[++p1]=a[p2++];

            //如果a[]到了尽头break
            if(p2==n)break;

            //如果a[p2]的值等于b[i]的值 不保存a[p2]的值 p2++
            if(a[p2]==b[i])p2++;
            //默认情况  如果a[p2]的值大于b[i]的值i++
        }
        //当p2<n 保存剩下的值
        while(p2<n)a[++p1]=a[p2++];

        if(p1+1==0)printf("NULL
");
        else 
        {
            for(i=0;i<p1+1;i++)
                printf("%d ",a[i]);
            printf("
");
        }
    }
    return 0;
}

47、最少拦截系统

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <malloc.h>
int findMinSys(int* a,int size)
{
    int *visited=(int*)malloc(sizeof(int)*size);
    memset(visited,0,sizeof(int)*size);
    visited[0]=1;
    int pre=a[0],i=1;
    int count=size-1,res=1;
    //每次找比上一个小的数 并标记
    //过完一趟 就是一个系统拦截的导弹
    //res等于遍历的躺数
    while(count)
    {
        if(i==size)pre=10000,i=0,res++;
        if(a[i]<pre&&visited[i]==0)pre=a[i],count--,visited[i]=1;
        i++;
    }
    free(visited);
    return res;
}
int main()
{
    int n,num,i;
    int a[1000];
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d",&num);
        for(i=0;i<num;i++)scanf("%d",&a[i]);
        printf("%d
",findMinSys(a,num));
    }
    return 0;
}

48、求N!

#include <stdio.h>
#include <string.h>
const int MAX_SIZE=100000;
int main()
{
    int res[MAX_SIZE];
    int i,j,n,size,carry,temp;
    while(~scanf("%d",&n))
    {
        memset(res,0,sizeof(int)*MAX_SIZE);
        res[0]=1;
        size=1;
        carry=0;//进位
        for(i=2;i<=n;i++)
        {
            for(j=0;j<size;j++)
            {
                temp=res[j]*i+carry;
                res[j]=temp%10;
                carry=temp/10;
            }
            while(carry)
            {
                res[size++]=carry%10;
                carry/=10;
            }
        }
        for(i=size-1;i>0;i--)
            printf("%d",res[i]);
        printf("%d
",res[i]);
    }
    return 0;
}

49、我素故我在

#include <stdio.h>
#include <math.h>
int isPrimeNumber(int n)
{
    if(n==1)return 0;
    int i;
    for(i=2;i<=sqrt(n);i++)
        if(n%i==0)return 0;
    return 1;
} 
int removeLowest(int n)
{
    return n/10;
}
int isPurePrimeNumber(int n)
{
    while(n)
    {
        if(!isPrimeNumber(n))return 0;
        n=removeLowest(n);
    }
    return 1;
}
//直接暴力找的话会超时
int main()
{
    int i,j,size=0,cur_size=0,temp,n,width,k,val;
    int res[8][20];
    for(i=2;i<10;i++)if(isPurePrimeNumber(i))res[0][size++]=i;
    res[0][size]=0;
    for(i=1;i<8;i++)
    {
        for(j=0;j<size;j++)
        {
            temp=res[i-1][j]*10;
            for(k=1;k<10;k++)
            {
                val=temp+k;
                if(isPurePrimeNumber(val))
                {    
                    //printf("%d
",val);
                    res[i][cur_size++]=val;
                }
            }
        }
        //printf("%d
",size);
        res[i][cur_size]=0;
        size=cur_size;
        cur_size=0;
    }
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d",&width);
        for(i=0;res[width-1][i]!=0;i++)
            printf("%d
",res[width-1][i]);
    }
    return 0;
}

50、素数

#include <stdio.h>
#include <math.h>
int isPrimeNumber(int n)
{
    if(n==1)return 0;
    for(int i=2;i<=sqrt(n);i++)
        if(n%i==0)return 0;
    return 1;
}
int main()
{
    int a,b,temp,count;
    while(~scanf("%d%d",&a,&b))
    {
        count=0;
        if(a>b){temp=a;a=b;b=temp;}
        for(int i=a;i<=b;i++)
            if(isPrimeNumber(i))
                count++;
        printf("%d
",count);
    }
    return 0;
}

51、歌德巴赫猜想

#include <stdio.h>
#include <math.h>
int isPrimeNumber(int n)
{
    if(n==1)return 0;
    for(int i=2;i<=sqrt(n);i++)
        if(n%i==0)return 0;
    return 1;
}
int main()
{
    int n,num,i;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d",&num);
        for(i=2;i<=num/2;i++)
            if(isPrimeNumber(i)&&isPrimeNumber(num-i)){printf("%d %d
",i,num-i);break;}
    }
    return 0;
}

52、N的倍数

#include <stdio.h>
int isAns(int n)
{
    int temp;
    while(n)
    {
        temp=n%10;
        if(!(temp==1||temp==0))return 0;
        n/=10;
    }
    return 1;
}
int main()
{
    int n,ans,i;
    while(~scanf("%d",&n))
    {
        for(i=1;;i++)
        {
            ans=i*n;
            if(isAns(ans)){printf("%d
",ans);break;}
        }
    }
    return 0;
}

53、求n天后的日期

#include <stdio.h>
int getYearDay(int year)
{
    if(year%400==0||(year%4==0&&year%100!=0))return 366;
    else return 365;
}
int getMonthDay(int year,int month)
{
    int flag=0;
    if(year%400==0||(year%4==0&&year%100!=0))flag=1;
    int days;
    switch(month)
    {
        case 4:
        case 6:
        case 9:
        case 11:days=30;break;
        case 2:days=flag?29:28;break;
        default:days=31;break;
    }
    return days;
}
int main()
{
    int y,m,d,n,i;
    scanf("%d%d%d%d",&y,&m,&d,&n);
    //先化成1/1
    if(d!=1){n+=(d-1);d=1;}
    if(m!=1){for(i=m-1;i>=1;i--)n+=getMonthDay(y,i);m=1;}

    while(n>=getYearDay(y)){n-=getYearDay(y);y++;}
    while(n>=getMonthDay(y,m)){n-=getMonthDay(y,m);m++;}
    d+=n;
    printf("%d %d %d
",y,m,d);
    return 0;
}

54、菱形输出

#include <stdio.h>
#include <string.h>
void fun(int n)
{
    char ch='Z';
    int i,j,pre_l,pre_r;
    if(n==1)
    {
        printf("%c
",ch);
    }
    else
    {
        //上半菱形 加 中间一行
        for(i=1;i<=n-1;i++)printf(" ");
        printf("%c
",ch--);
        pre_l=pre_r=n;//上个输出的位置
        for(i=2;i<=n;i++)
        {
            for(j=1;j<=2*n-1;j++)
            {
                if(j==pre_l-1)
                {
                    printf("%c",ch--);
                    pre_l--;
                }
                else if(j==pre_r+1)
                {
                    printf("%c
",ch--);
                    pre_r++;
                    break;
                }
                else
                    printf(" ");
            }
        }
        //下半菱形 
        for(i=1;i<=n-2;i++)
        {
            for(j=1;j<=2*n-1;j++)
            {
                if(j==pre_l+1)
                    printf("%c",ch--);
                else if(j==pre_r-1)
                {
                    printf("%c
",ch--);
                    pre_l++;
                    pre_r--;
                    break;
                }
                else
                    printf(" ");
            }
        }
        for(i=1;i<=n-1;i++)printf(" ");
        printf("%c
",ch--);
    }
    printf("
");
}
int main()
{
    int n;
    while(~scanf("%d",&n))
        fun(n);
    return 0;
}

55、三角形的个数

#include <stdio.h>
#include <string.h>
//a<b<c<a+b;a+b+c=n
void fun(int n)
{
    int a,b,c,res=0;
    for(a=1;a<n-1;a++)
    {
        for(b=a+1;a+b<n;b++)
        {
            c=n-a-b;
            if(c<a+b&&c>b)res++;
        }
    }
    printf("%d
",res);
}
int main()
{
    int n;
    while(~scanf("%d",&n))
        fun(n);
    return 0;
}

56、汉诺塔问题的第m步

#include <stdio.h>
#include <string.h>
int k;//执行的步数
int flag;//是否存在第m步
void move(char from,int val,char to,int m)
{
    k++;
    if(k==m)
    {
        printf("%c--%c
",from,to);
        flag=1;
    }
    //printf("%d:将%d从%c移动到%c
",k++,val,from,to);
}
//当n==1时将盘子从a移动到c即可
//将a中n-1个盘子移动到b上 
//将a中最后一个盘子移动到c上 
//将b上n-1个盘子移动到c上
void Hanoi(int n,char a,char b,char c,int m)
{
    if(k>m)return;
    if(n==1)
        move(a,1,c,m);
    else
    {
        Hanoi(n-1,a,c,b,m);
        move(a,n,c,m);
        Hanoi(n-1,b,a,c,m);
    }
}
int main()
{
    int n,m;
    while(~scanf("%d%d",&n,&m))
    {
        k=0;
        flag=0;
        Hanoi(n,'A','B','C',m);
        if(!flag)printf("none
");
    }
    return 0;
}

57、数字游戏

#include <stdio.h>
#include <string.h>
//将两个字符串 正接和反接判断哪个大
//冒泡
void sort(char str[50][50],int n)
{
    int i,j,flag;
    char temp[50];
    char a[100];
    char b[100];
    for(i=0;i<n-1;i++)
    {
        flag=0;
        for(j=1;j<n;j++)
        {
            strcpy(a,str[j-1]);
            strcat(a,str[j]);//a中是str[j-1]拼接str[j]
            strcpy(b,str[j]);
            strcat(b,str[j-1]);//b中是str[j]拼接str[j-1]
            //printf("%s %s %d
",a,b,strcmp(a,b));
            if(strcmp(a,b)==-1)//后一个大于前一个
            {
                strcpy(temp,str[j-1]);
                strcpy(str[j-1],str[j]);
                strcpy(str[j],temp);
                //交换位置
                flag=1;
            }
        }
        if(!flag)break;
    }
}
int main()
{
    int n,i;
    char str[50][50];
    while(~scanf("%d",&n))
    {
        if(n==0)break;
        for(i=0;i<n;i++)scanf("%s",str[i]);
        sort(str,n);
        for(i=0;i<n;i++)printf("%s",str[i]);printf("
");
    }
    return 0;
}

58、矩阵转换

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    int n,i,j;
    int a[10][10];
    int res[10][10];
    while(~scanf("%d",&n))
    {
        for(i=0;i<n;i++)for(j=0;j<n;j++)scanf("%d",&a[i][j]);
        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                if(i==j)
                    res[i][j]=a[i][j];
                else
                    res[i][j]=a[j][i];
            }
        }
        for(i=0;i<n;i++){for(j=0;j<n-1;j++)printf("%d ",res[i][j]);printf("%d
",res[i][j]);}
        printf("
");
    }
    return 0;
}

59、魔方矩阵

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    int n,count,i,j,val;
    int res[19][19]={0};
    while(~scanf("%d",&n))
    {
        memset(res,0,sizeof(int)*19*19);
        val=1;
        i=0,j=n/2;
        while(val<=n*n)
        {
            res[i][j]=val++;
            if((i==0&&j==n-1))i=(i+1)%n;
            else 
            {
            //    printf("%d %d %d
",i,j,val);
                if(res[(i-1)%n<0?(i-1)%n+n:(i-1)%n][(j+1)%n]==0)
                {
                    i=(i-1)%n<0?(i-1)%n+n:(i-1)%n;
                    j=(j+1)%n;
                }
                else
                    i=(i+1)%n;
            }
        }
        for(i=0;i<n;i++)
        {
            for(j=0;j<n-1;j++)
                printf("%d ",res[i][j]);
            printf("%d
",res[i][j]);
        }
        printf("
");
    }
    return 0;
}

60、最大效益

#include <stdio.h>
//每次从表中找出最大的数 然后将这一行 这一列置为负数
int main()
{
    int a[5][5];
    int i,j,n,res=0,max_i,max_j,max;
    while(~scanf("%d",&a[0][0]))
    {
        n=5,res=0;
        for(i=0;i<5;i++)
            for(j=0;j<5;j++)
            {
                if(i==0&&j==0)continue;
                scanf("%d",&a[i][j]);
            }
        while(n--)
        {
            max=-1;
            for(i=0;i<5;i++)
            {
                for(j=0;j<5;j++)
                {
                    if(a[i][j]>max)    
                    {
                        max=a[i][j];
                        max_i=i;
                        max_j=j;
                    }
                }
            }
            res+=max;
            for(i=0;i<5;i++)a[i][max_j]=-1;
            for(j=0;j<5;j++)a[max_i][j]=-1;
        }
        printf("%d
",res);
    }
    return 0;
}

61、螺旋方阵

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    int n,i,j;
    int res[10][10];
    while(~scanf("%d",&n))
    {
        //l左边界 r右 t上 b下
        int l=0,r=n-1,t=0,b=n-1,len=n*n,num=1;
        memset(res,0,sizeof(int)*10*10);
        while(num<=len)
        {
            for(i=l;i<=r;i++)res[t][i]=num++;
            t++;
            for(i=t;i<=b;i++)res[i][r]=num++;
            r--;
            for(i=r;i>=l;i--)res[b][i]=num++;
            b--;
            for(i=b;i>=t;i--)res[i][l]=num++;
            l++;
        }
        for(i=0;i<n;i++)
        {
            for(j=0;j<n-1;j++)
                printf("%d ",res[i][j]);
            printf("%d
",res[i][j]);
        }
        printf("
");
    }
    return 0;
}

62、方块转换

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int fun(char a[10][10],char b[10][10],int n)
{
    int flag,i,j;
    /*for(i=0;i<n;i++)
    {    
        for(j=0;j<n;j++)
            printf(" %c,%c ",a[i][j],b[i][j]);
        printf("
");
    }*/
    //1
    flag=1;
    for(i=0;i<n;i++)    
    {for(j=0;j<n;j++)if(a[i][j]!=b[j][n-i-1])
    {flag=0;break;}}if(flag)return 1;

    //2
    flag=1;
    for(i=0;i<n;i++)    
    {for(j=0;j<n;j++)if(a[i][j]!=b[n-i-1][n-j-1])
    {flag=0;break;}}if(flag)return 2;

    //3
    flag=1;
    for(i=0;i<n;i++)    
    {for(j=0;j<n;j++)if(a[i][j]!=b[n-j-1][i])
    {flag=0;break;}}if(flag)return 3;

    //4
    flag=1;
    for(i=0;i<n;i++)    
    {for(j=0;j<n;j++)if(a[i][j]!=b[i][n-j-1])
    {flag=0;break;}}if(flag)return 4;

    //5
    char **c;
    c=(char**)malloc(sizeof(char*)*n);
    for(i=0;i<n;i++)c[i]=(char*)malloc(sizeof(char)*n);
    for(i=0;i<n;i++)for(j=0;j<n;j++)c[i][j]=a[i][n-j-1];
    int count_1=0,count_2=0,count_3=0;
    for(i=0;i<n;i++)    
    {
        for(j=0;j<n;j++)
        {
            if(c[i][j]==b[j][n-i-1])count_1++;
            if(c[i][j]==b[n-i-1][n-j-1])count_2++;
            if(c[i][j]==b[n-j-1][i])count_3++;
        }
    }
    //printf("%d %d %d
",count_1,count_2,count_3);
    if(count_1==n*n||count_2==n*n||count_3==n*n)return 5;


    //6
    flag=1;
    for(i=0;i<n;i++)    
    {for(j=0;j<n;j++)if(a[i][j]!=b[i][j])
    {flag=0;break;}}if(flag)return 6;

    return 7;
}
int main()
{
    char a[10][10];
    char b[10][10];
    int i,j,n;
    scanf("%d",&n);
    getchar();
    for(i=0;i<n;i++)    
    {
        getchar();
        for(j=0;j<n;j++)
            scanf("%c",&a[i][j]);
        getchar();
    }
    for(i=0;i<n;i++)    
    {
        getchar();
        for(j=0;j<n;j++)
            scanf("%c",&b[i][j]);
        getchar();
    }
    printf("%d
",fun(a,b,n));
    return 0;
}

63、阵列

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
//返回矩阵最小维数
int getN(int n)
{
    int res=1;
    while(res*res<n)res++;
    return res;
}
//1 5-9 17-25 36-49 65-81
//2-4 10-16 26-36 50-64 82-100
//2 4 6 8 10
void my_print(int res[11][11],int N,int n)
{
    char val[3];
    int count=n;
    int left=0,top=0,right=N-1,bottom=N-1,i,j;
    if(N%2==0)right=N,bottom=N;//N是偶数是 会空一圈
    if(res[0][0]==0)left++;
    if(res[0][right]==0)top++;
    if(res[right][bottom]==0)right--;
    //printf("%d %d %d %d
",left,right,top,bottom);
    //n小于10时 都是占1位
    //=10 第一列2位
    //=11 第1、2列2位
    //>=12 全都2位
    for(i=top;i<=bottom;i++)
    {
        for(j=left;j<right;j++)
        {
            if(res[i][j]==65&&n==99)break;
            if(res[i][j]==0)strcpy(val," ");
            else {itoa(res[i][j],&val[0],10);count--;}
            if(count==0)break;
            //printf("-%s-
",val);
            if((n>=12)||(n==10&&j==left)||(n==11&&(j==left||j==left+1)))printf("%2s ",val);
            else printf("%s ",val);
        }
        if(res[i][j]==0)strcpy(val," ");
        else {itoa(res[i][j],&val[0],10);count--;}

        //printf("-%s-
",val);
        if((n>=12)||(n==10&&j==left)||(n==11&&(j==left||j==left+1)))printf("%2s
",val);
        else printf("%s
",val);
    }
    printf("
");
}
int main()
{
    int res[11][11];
    //dirction 0是下 1是向右 2是向上 3是向左
    int i,j,val,direction,n,N;
    while(~scanf("%d",&n))
    {
        N=getN(n);
        val=1;
        memset(res,0,sizeof(int)*11*11);
        i=N/2,j=N/2;
        direction=3;
        while(val<=n)
        {
            res[i][j]=val++;
            if(direction==3)
            {
                //可以拐弯
                if(res[i+1][j]==0)
                    i++,direction=0;
                else j--;
                continue;
            }
            else if(direction==0)
            {
                if(res[i][j+1]==0)
                    j++,direction=1;
                else i++;
                continue;
            }
            else if(direction==1)
            {
                if(res[i-1][j]==0)
                    i--,direction=2;
                else j++;
                continue;
            }
            else if(direction==2)
            {
                if(res[i][j-1]==0)
                    j--,direction=3;
                else i--;
                continue;
            }
        }
        /*for(i=0;i<11;i++)
        {
            for(j=0;j<10;j++)
                printf("%2d ",res[i][j]);
            printf("%2d
",res[i][j]);
        }
        printf("
");*/
        my_print(res,N,n);
    }
    return 0;
}

64、饲料调配

#include <stdio.h>
int main()
{
    int a[4][3];//={{3,4,5},{1,2,3},{3,7,1},{2,1,2}};
    int temp[3];
    int i,j,k,t;
    for(i=0;i<4;i++)
        for(j=0;j<3;j++)scanf("%d",&a[i][j]);
    int max=300,res_i=-1,res_j=-1,res_k=-1,res_t=-1;
    for(i=0;i<100&&i<max;i++)
    {
        for(j=0;j<100&&i+j<max;j++)
        {
            for(k=0;k<100&&i+k+j<max;k++)
            {
                if(i+k+j==0)continue;
                for(t=0;t<3;t++)
                temp[t]=i*a[1][t]+j*a[2][t]+k*a[3][t];
                t=temp[0]/a[0][0];
                //printf("%d %d %d %.1f %.1f
",i,j,k,(double)t,(double)temp[0]/a[0][0]);
                if((double)t!=(double)temp[0]/(double)a[0][0])continue;
                if(t*a[0][1]!=temp[1]||t*a[0][2]!=temp[2])continue;
                max=i+j+k;
                res_i=i;
                res_k=k;
                res_j=j;
                res_t=t;
            
            }
        }
    }
    if(res_t==-1)printf("NONE
");
    else printf("%d %d %d %d
",res_i,res_j,res_k,res_t);
    return 0;
}

65、乒乓球

#include <stdio.h>
#include <string.h>
void fun(char* str,int score)
{
    int size=strlen(str);
    int a,b,i=0,flag;
    while(i<size)
    {
        a=0,b=0,flag=0;
        for(;i<size;i++)
        {
            if(str[i]=='W')a++;
            else if(str[i]=='L') b++;
            if((a>=score||b>=score)&&(a-b>=2||b-a>=2))
            {
                printf("%d:%d
",a,b);
                flag=1;
                i++;
                break;
            }
        }
    }
    if(!flag&&(a||b))
        printf("%d:%d
",a,b);
    printf("
");
}
int main()
{
    char ch;
    char str[200],size=0;
    while(~scanf("%c",&ch))
    {
        if(ch=='W'||ch=='L')
            str[size++]=ch;
        if(ch=='E')
        {
            str[size]='';
            fun(str,11);
            fun(str,21);
            size=0;
        }
    }
    return 0;
}

66、字符串统计

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void fun(char* a,char* b)
{
    int a_len=strlen(a),b_len=strlen(b);
    int i,count_a[26]={0},count_b[26]={0};
    for(i=0;i<a_len;i++)count_a[a[i]-'a']++;
    for(i=0;i<b_len;i++)count_b[b[i]-'a']++;
    printf("in s1 or s2:");
    for(i=0;i<26;i++)if(count_a[i]||count_b[i])printf("%c",i+'a');
    printf("
");

    printf("in s1 and s2:");
    for(i=0;i<26;i++)if(count_a[i]&&count_b[i])printf("%c",i+'a');
    printf("
");

    printf("in s1 but not in s2 ,or in s2 but not in s1:");
    for(i=0;i<26;i++)
        if((count_a[i]&&!count_b[i])||(!count_a[i]&&count_b[i]))printf("%c",i+'a');
    printf("
");

    printf("not in s1 and s2:");
    for(i=0;i<26;i++)if(!count_a[i]&&!count_b[i])printf("%c",i+'a');
    printf("
");
    printf("
");
}
int main()
{
    char a[26];
    char b[26];
    while(~scanf("%s",&a[0])&&getchar())
    {
        scanf("%s",&b[0]);getchar();
        fun(a,b);
    }
    return 0;
}

67、求字符串起始位置

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    char str[100];
    char sub[100];
    int str_len,sub_len,i;
    while(~scanf("%s",&str[0])&&getchar())
    {
        scanf("%s",&sub[0]);getchar();
        int sub_len=strlen(sub);
        int str_len=strlen(str);
        for(i=0;i<=str_len-sub_len;i++)
        {
            if(strncmp(&str[i],sub,sub_len)==0)break;
        }
        if(i==str_len-sub_len+1)
            printf("0
");
        else
            printf("%d
",i+1);
    }
    return 0;
}

68、最长的单词

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void fun(char* str)
{
    char *p=str;
    int res_size=0;
    char res[1000];
    char temp[1000];
    int size=0;
    while(*p!='')
    {
        while(*p!=' '&&*p!='')
            temp[size++]=*(p++);
        temp[size++]='';size--;
        if(size>res_size)
        {
            strcpy(res,temp);
            res_size=size;
        }
        size=0;
        if(*p!='')p++;
    }
    printf("%d %s
",res_size,res);
}
int main()
{
    char str[1000];
    while(~scanf("%[^
]",&str[0])&&getchar())
    fun(&str[0]);
    return 0;
}

69、奖学金

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct stu
{
    char name[21];
    int final_avg;
    int preview_score;
    char isLeader;
    char isWest;
    int paper_num;
    int scholarship;
}Stu;
void computeScholarship(Stu* stus,int size)
{
    int i;
    for(i=0;i<size;i++)
    {
        stus[i].scholarship=0;
        if(stus[i].final_avg>80&&stus[i].paper_num>=1)
            stus[i].scholarship+=8000;
        if(stus[i].final_avg>85&&stus[i].preview_score>80)
            stus[i].scholarship+=4000;
        if(stus[i].final_avg>90)
            stus[i].scholarship+=2000;
        if(stus[i].final_avg>85&&stus[i].isWest=='Y')
            stus[i].scholarship+=1000;
        if(stus[i].preview_score>80&&stus[i].isLeader=='Y')
            stus[i].scholarship+=850;
    }
}
int main()
{
    int n,i,sum,max_index;
    Stu stus[100];
    while(~scanf("%d",&n))
    {
        for(i=0;i<n;i++)
        {
            scanf("%s",&stus[i].name);
            getchar();
            scanf("%d%d",&stus[i].final_avg,&stus[i].preview_score);
            getchar();
            scanf("%c",&stus[i].isLeader);
            getchar();
            scanf("%c",&stus[i].isWest);
            getchar();
            scanf("%d",&stus[i].paper_num);
            getchar();
        }
        computeScholarship(stus,n);
        sum=0;max_index=0;
        for(i=0;i<n;i++)
        {
            sum+=stus[i].scholarship;
            if(stus[i].scholarship>stus[max_index].scholarship)max_index=i;
        }
        printf("%s
",stus[max_index].name);
        printf("%d
",stus[max_index].scholarship);
        printf("%d

",sum);
    }
    return 0;
}

70、回文数2

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int isPalindrome(char* ch)
{
    int i=0,j=strlen(ch)-1,flag=1;
    while(!(i-1==j)&&!(i==j))
    {
        if(ch[i]!=ch[j]){flag=0;break;}
        i++,j--;
    }
    return flag;
}
int main()
{
    int n;
    char ch[10000];
    while(~scanf("%d",&n))
    {
        itoa(n,ch,10);
        if(!isPalindrome(&ch[0]))
        {
            printf("No
");
            continue;
        }
        itoa(n,ch,2);
        if(!isPalindrome(&ch[0]))
        {
            printf("No
");
            continue;
        }
        printf("Yes
");
    }
    return 0;
}

71、加法器(可用92题代码)

72、构造序列

#include <stdio.h>
#include <math.h>
#include <malloc.h>
#include <string.h>
int main()
{
    int i,n,len,index;
    char **ch;
    char *p1,*p2;
    ch=(char**)malloc(sizeof(char*)*9);
    for(i=0;i<9;i++)ch[i]=(char*)malloc(sizeof(char)*1000);
    ch[0][0]='1',ch[0][1]='1',ch[0][2]='';
    for(i=1;i<9;i++)
    {
        index=0;
        p1=&ch[i-1][0];
        p2=&ch[i-1][1];
        while(*p2!='')
        {
            ch[i][index++]=*p1;
            if((*p1-'0')+(*p2-'0')==i+1)
                ch[i][index++]='0'+i+1;
            *p1=*(p2++);
        }
        ch[i][index++]=*p1;
        ch[i][index++]='';
    }
    //for(i=0;i<9;i++)printf("%s
",ch[i]);
    while(~scanf("%d",&n))
        printf("%s
",ch[n-1]);
    return 0;
}

73、纯粹合数

#include <stdio.h>
#include <math.h>
int isCompositeNumber(int n)
{
    if(n==1)return 0;
    int i;
    for(i=2;i<=sqrt(n);i++)
        if(n%i==0)return 1;
    return 0;
} 
int removeHighest(int n)
{
    int r=1;
    while(n>=pow(10,r))r++;r--;
    return n%(int)(pow(10,r)+0.5);//这里四舍五入 不然会错
}
int isPureCompositeNumber(int n)
{
    while(n)
    {
        if(!isCompositeNumber(n))return 0;
        n=removeHighest(n);
    }
    return 1;
}
int main()
{
    const int max_num=100;
    int size=0;
    int res[max_num];
    int i=100;
    while(size<max_num)
    {
        if(isPureCompositeNumber(i))res[size++]=i;
        i++;
    }
    int n;
    while(~scanf("%d",&n))
        printf("%d
",res[n-1]);

    return 0;
}

74、找出质数

#include <stdio.h>
#include <string.h>
#include <math.h>
int isPrimeNumber(int n)
{
    int i;
    if(n==1)return 0;
    for(i=2;i<=sqrt(n);i++)
        if(n%i==0)return 0;
    return 1;
}
int getNumber(char* str,int index,int end)
{
    int res=0;
    while(index<end)
        res=res*10+str[index++]-'0';
    return res;
}
void fun(char* str)
{
    int size=strlen(str);
    int res,i,j,flag,temp;
    for(i=4;i>=1;i--)
    {
        flag=0;
        for(j=0;j<=size-i;j++)
        {
            temp=getNumber(str,j,j+i);
            //printf("-%d
",temp);
            if(isPrimeNumber(temp)&&flag==0)
            {
                flag=1;
                res=temp;
            }
            else if(isPrimeNumber(temp)&&flag==1)
                res=res>temp?res:temp;
        }
        if(flag==1)break;
    }
    printf("%d
",res);
}
int main()
{
    char ch[20];
    while(~scanf("%s",&ch[0])&&getchar())
        fun(&ch[0]);
    return 0;
}

75、翻译字符串

#include <stdio.h>
#include <string.h>
void fun(char* str)
{
    char res[100];
    char temp;
    int i=0,size=0,len=strlen(str),count;
    while(i<len)
    {
        if(str[i]>='0'&&str[i]<='9')
        {
            count=str[i]-'0'+1;
            temp=str[++i];
            while(count--)res[size++]=temp;
            i++;
        }
        else
            res[size++]=str[i++];
    }
    count=0;
    for(i=0;i<size-1;i++)
    {
        if(count==3)
        {
            printf(" %c",res[i]);
            count=1;
        }
        else
        {
            count++;
            printf("%c",res[i]);
        }
    }
    if(count==3)printf(" %c
",res[i]);
    else printf("%c
",res[i]);
}
int main()
{
    char ch[10];
    while(~scanf("%s",&ch[0])&&getchar())
    {
        fun(&ch[0]);
    }
    return 0;
}

76、分割数字并排序

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int cmp(const void*a,const void* b)
{
    return *(int*)a>*(int*)b?1:-1;
}
int main()
{
    int res[500];
    char ch[1000];
    int re_size,ch_size,temp,i;
    int n;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%s",&ch[0]);getchar();
        re_size=0,ch_size=strlen(&ch[0]);
        i=0,temp=0;
        while(ch[i]=='5')i++;
        for(;i<ch_size;i++)
        {
            if(ch[i]=='5')
            {
                if(ch[i-1]=='5')continue;//防止两个五之间没有0
                res[re_size++]=temp;
                temp=0;
            }
            else
                temp=temp*10+ch[i]-'0';
        }
        if(ch[ch_size-1]!='5')res[re_size++]=temp;
        qsort(res,re_size,sizeof(int),cmp);
        for(i=0;i<re_size-1;i++)printf("%d ",res[i]);printf("%d
",res[i]);
    }
    return 0;
}

77、大实数加法

#include <stdio.h>
#include <string.h>
char a1[400],b1[400];//整数部分
char a2[400],b2[400];//小数部分
//返回进位的值
int my_add(char a[400],char b[400],int c)
{
    int asize=strlen(a),bsize=strlen(b),i,temp;
    a[asize]='0',b[bsize]='0';
    asize=asize>bsize?asize:bsize;
    for(i=asize-1;i>=0;i--)
    {
        temp=a[i]+b[i]+c-'0'-'0';
        a[i]=temp%10+'0';
        c=temp/10;
    }
    a[asize]='';
    return c;
}
void my_print(char a1[400],char a2[400],int c)
{
    int a1_len=strlen(a1),a2_len=strlen(a1);
    while(a2[a2_len-1]=='0'&&a2_len)a2_len--;
    if(a1_len==0)a1[0]='0',a1[1]='';
    if(c!=0)
    {
        if(a2_len!=0)
            printf("%d%s.%s
",c,a1,a2);
        else
            printf("%d%s
",c,a1);
    }
    else
    {
        if(a2_len!=0)
            printf("%s.%s
",a1,a2);
        else
            printf("%s
",a1);
    }
}
int main()
{
    int n,flag,a1_size,a2_size,b1_size,b2_size,carry;
    char ch;
    scanf("%d",&n);getchar();
    while(n--)
    {
        memset(a1,'0',400);
        memset(a2,'0',400);
        memset(b1,'0',400);
        memset(b2,'0',400);
        a1_size=0,a2_size=0,b1_size=0,b2_size=0;
        a1[0]=a2[0]=b1[0]=b2[0]='';
        flag=0;
        //分别输入a的整数部分和小数部分
        while(1)
        {
            ch=getchar();
            //以空格结束
            if(ch==' '&&flag)
            {
                a2[a2_size]='';
                break;
            }
            else if(ch==' '&&!flag)
            {
                a1[a1_size]='';
                break;
            }
            else if(ch=='.'){flag=1;a1[a1_size]='';continue;}
            else if(ch!='.'&&!flag)a1[a1_size++]=ch;
            else if(ch!='.'&&flag)a2[a2_size++]=ch;
        }
        //printf("%s.%s
",a1,a2);
        flag=0;
        //分别输入b的整数部分和小数部分
        while(1)
        {
            ch=getchar();
            //以换行结束
            if((ch==-1||ch==10||ch==13)&&flag)
            {
                b2[b2_size]='';
                break;
            }
            else if((ch==-1||ch==10||ch==13)&&!flag)
            {
                b1[b1_size]='';
                break;
            }
            else if(ch=='.'){flag=1;b1[b1_size]='';continue;}
            else if(ch!='.'&&!flag)b1[b1_size++]=ch;
            else if(ch!='.'&&flag)b2[b2_size++]=ch;
        }
        //printf("%s.%s
",b1,b2);
        carry=my_add(&a1[0],&b1[0],my_add(&a2[0],&b2[0],0));
        my_print(a1,a2,carry);
    }
    return 0;
}

78、A==B?

#include <stdio.h>
#include <string.h>
int main()
{

    char a[1000];
    char b[1000];
    int n,al,bl,pa,pb;
    scanf("%d",&n);
    while(n--)
    {
        int flag=0;
        scanf("%s%s",&a[0],&b[0]);getchar();
        al=strlen(&a[0]);
        bl=strlen(&b[0]);
        pa=pb=0;
        while(a[pa]=='0')pa++;
        while(b[pb]=='0')pb++;
        while(pa<al&&pb<bl)
        {
            if(a[pa]==b[pb])
            {
                pa++;
                pb++;
            }
            else
            {
                flag=1;
                break;
            }
        }
        if(pa<al&&a[pa]=='.')pa++;
        if(pb<bl&&b[pb]=='.')pb++;
        while(pa<al)if(a[pa++]!='0')flag=1;
        while(pb<bl)if(b[pb++]!='0')flag=1;
        if(flag) printf("NO
");
        else printf("YES
");
    }
    return 0;
}

79、母牛制造的回文

#include <stdio.h>
#include <string.h>
int my_cmp(char a,char b)
{
    if(a>='A'&&a<='Z')
        a='a'+a-'A';
    if(b>='A'&&b<='Z')
        b='a'+b-'A';
    if(a==b)return 1;
    else return 0;
}
void fun(char* s)
{
    int max_size=0,max_i,max_j;
    int len=strlen(s),size,flag=0;
    char *p,*q;
    int i=0,j=len-1,k;
    //i代表起始位置
    while(i<len)
    {
        if(!((s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z')))
        {
                i++;
                continue;
        }
        j=len-1;
        //j代表结束位置
        while(j>=i+max_size)
        {
            if(!((s[j]>='a'&&s[j]<='z')||(s[j]>='A'&&s[j]<='Z')))
            {
                j--;
                continue;
            }
            p=&s[i],q=&s[j];
            //这里判断回文
            while(p!=q&&q+1!=p)
            {
                //printf("1 %c %c
",*p,*q);
                if(!((*p>='a'&&*p<='z')||(*p>='A'&&*p<='Z')))
                {p++;continue;}
                if(!((*q>='a'&&*q<='z')||(*q>='A'&&*q<='Z')))
                {q--;continue;}
                if(!my_cmp(*p,*q))break;
                //printf("2 %c %c
",*p,*q);
                p++,q--;
            }
            //如果是回文 记录长度
            if(p==q||q+1==p)
            {
                size=0;
                //记录长度
                for(k=i;k<=j;k++)
                {
                    if((s[k]>='a'&&s[k]<='z')||(s[k]>='A'&&s[k]<='Z'))
                    size++;
                }
                //选出最长的一个
                if(size>max_size)
                {
                    max_size=size;
                    max_i=i;
                    max_j=j;
                }
            }
            j--;
        }
        i++;
    }
    printf("%d
",max_size);
    for(k=max_i;k<=max_j;k++)
        printf("%c",s[k]);
    printf("
");
}
int main()
{
    char ch[20000];
    int size=0;
    while(~scanf("%[^
]",&ch[size])&&getchar())
    {
        size=strlen(ch);
        ch[size++]='
';
    }
    fun(&ch[0]);
    return 0;
}

80、大整数相加

#include <stdio.h>
#include <string.h>
//a为较大的 b为较小的
int add(char* a,int a_size,char* b,int b_size,char c[2000])
{
    int carry=0;
    int i=a_size-1,j=b_size-1,temp,size=0;
    while(j>=0)
    {
        temp=a[i]+b[j]-'0'-'0'+carry;
        c[size++]=temp%10+'0';
        carry=temp/10;
        i--,j--;
    }
    while(i>=0)
    {
        temp=a[i]-'0'+carry;
        c[size++]=temp%10+'0';
        carry=temp/10;
        i--;
    }
    while(carry)
    {
        c[size++]=carry%10+'0';
        carry/=10;
    }
    return size;
}
int main()
{
    char a[2000];
    char b[2000];
    char c[2000];
    int n,a_size,b_size,i,j,size;
    scanf("%d",&n);
    for(j=0;j<n;j++)
    {
        scanf("%s",a);
        getchar();
        scanf("%s",b);
        getchar();
        a_size=strlen(a);
        b_size=strlen(b);
        if(a_size>b_size)size=add(a,a_size,b,b_size,&c[0]);
        else size=add(b,b_size,a,a_size,&c[0]);
        printf("Case %d:
",j+1);
        for(i=0;i<a_size;i++)printf("%c",a[i]);
        printf(" + ");
        for(i=0;i<b_size;i++)printf("%c",b[i]);
        printf(" = ");
        for(i=size-1;i>0;i--)printf("%c",c[i]);printf("%c

",c[i]);
    }
    return 0;
}

81、十六进制加法

#include <stdio.h>
#include <string.h>
int hex2dec(char ch)
{
    if(ch>='0'&&ch<='9')return ch-'0';
    else return ch-'a'+10;
}
char dec2hec(int n)
{
    if(n<10) return '0'+n;
    else return 'a'+n-10;
}
//a为较大的 b为较小的
int add(char* a,int a_size,char* b,int b_size,char c[100])
{
    int carry=0;
    int i=a_size-1,j=b_size-1,temp,size=0;
    while(j>=0)
    {
        temp=hex2dec(a[i])+hex2dec(b[j])+carry;
        c[size++]=dec2hec(temp%16);
        carry=temp/16;
        i--,j--;
    }
    while(i>=0)
    {
        temp=hex2dec(a[i])+carry;
        c[size++]=dec2hec(temp%16);
        carry=temp/16;
        i--;
    }
    while(carry)
    {
        c[size++]=dec2hec(temp%16);
        carry/=10;
    }
    return size;
}
int main()
{
    char a[100];
    char b[100];
    char c[100];
    int n,a_size,b_size,i,j,size;
    scanf("%d",&n);getchar();
    while(n--)
    {
        scanf("%s",a);
        getchar();
        scanf("%s",b);
        getchar();
        a_size=strlen(a);
        b_size=strlen(b);
        if(a_size>b_size)size=add(a,a_size,b,b_size,&c[0]);
        else size=add(b,b_size,a,a_size,&c[0]);

        for(i=size-1;i>0;i--)printf("%c",c[i]);printf("%c
",c[i]);
    }
    return 0;
}

82、纯粹的素数

#include <stdio.h>
#include <math.h>
int isPrimeNumber(int n)
{
    if(n==1)return 0;
    int i;
    for(i=2;i<=sqrt(n);i++)
        if(n%i==0)return 0;
    return 1;
} 
int removeHighest(int n)
{
    int r=1;
    while(n>=pow(10,r))r++;r--;
    return n%(int)(pow(10,r)+0.5);//这里四舍五入 不然会错
}
int isPurePrimeNumber(int n)
{
    while(n)
    {
        if(!isPrimeNumber(n))return 0;
        n=removeHighest(n);
    }
    return 1;
}
int main()
{
    const int max_num=20;
    int size=0;
    int res[max_num];
    int i=1000;
    while(size<max_num)
    {
        if(isPurePrimeNumber(i))res[size++]=i;
        i++;
    }
    int n;
    while(~scanf("%d",&n))
        printf("%d
",res[n-1]);

    return 0;
}

83、成绩统计

#include <stdio.h>
#include <stdlib.h>
typedef struct stu
{
    char name[6];
    int math;
    int politics;
} Stu;
int cmp(const void* a,const void* b)
{
    int x=(*(Stu*)a).math;
    int y=(*(Stu*)b).math;
    return x>y?1:-1;
}
int main()
{
    Stu stus[5];
    int i;
    for(i=0;i<5;i++)
        scanf("%s %d %d",&stus[i].name[0],
        &stus[i].math,
        &stus[i].politics);
    for(i=0;i<5;i++)printf("%s %d
",stus[i].name,(stus[i].math+stus[i].politics)/2);
    qsort(stus,5,sizeof(Stu),cmp);
    printf("%s %d %d
",stus[4].name,stus[4].math,stus[4].politics);
}

84、摩托车

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct  motor
{
    char car_type[3];
    char color[10];
    char motor_type[3];
}Motor;
int cmp(const void* a,const void* b)
{
    Motor* pa=(Motor*)a;
    Motor* pb=(Motor*)b;
    return strcmp(pa->car_type,pb->car_type);
}
int main()
{
    Motor motor[100];
    Motor res[21];
    char demand[21][3];
    int n,m,i,j,res_size;
    while(~scanf("%d%d",&n,&m))
    {
        res_size=0;
        getchar();
        for(i=0;i<n;i++)
        {
            scanf("%s",&demand[i]);
            //printf("%s
",demand[i]);
            getchar();
        }
        for(i=0;i<m;i++)
        {
            scanf("%s%s%s",&motor[i].car_type,&motor[i].color,&motor[i].motor_type);
            //printf("%s %s %s
",motor[i].car_type,motor[i].color,motor[i].motor_type);
            getchar();
        }
        for(i=0;i<n;i++)
        {
            for(j=0;j<m;j++)
            {
                if(!strcmp(demand[i],motor[j].car_type))
                    res[res_size++]=motor[j];
            }
        }
        qsort(res,res_size,sizeof(Motor),cmp);
        for(i=0;i<res_size;i++)
            printf("%s %s %s
",res[i].car_type,res[i].color,res[i].motor_type);
        if(res_size==0)
            printf("Not found!
");
    }
    return 0;
}

85、扑克牌

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char COLOR[4]={'S','H','D','C'};
char SIZE[13]={'A','K','Q','J','T','9','8','7','6','5','4','3','2'};
typedef struct poker
{
    char color;
    char size;
}Poker;
int getIndex(char* str,char key)
{
    int len=strlen(str);
    int i;
    for(i=0;i<len;i++)
        if(str[i]==key)return i;
    return -1;
}
//结构体二级排序 先排size size相同再排color 
//返回-1代表a排在b 前面
int cmp(const void* a,const void* b)
{
    Poker *pa=(Poker*)a;
    Poker *pb=(Poker*)b;
    int index_a_color=getIndex(COLOR,pa->color);
    int index_b_color=getIndex(COLOR,pb->color);
    int index_a_size=getIndex(SIZE,pa->size);
    int index_b_size=getIndex(SIZE,pb->size);
    if(index_a_size!=index_b_size)
        return index_a_size<index_b_size?-1:1;
    else
        return index_a_color<index_b_color?-1:1;
}
int main()
{
    int n,i,k;
    scanf("%d",&n);
    getchar();
    Poker p[13];
    while(n--)
    {
        for(k=0;k<4;k++)
        {
            for(i=0;i<13;i++)
            {
                scanf("%c",&p[i].color);
                scanf("%c",&p[i].size);
                getchar();
            }
            qsort(p,13,sizeof(Poker),cmp);
            for(i=0;i<12;i++)printf("%c%c ",p[i].color,p[i].size);
            printf("%c%c
",p[i].color,p[i].size);
        }
        printf("
");
    }
    return 0;
}

86、商店购物

#include <stdio.h>
#include <string.h>
typedef struct goods
{
    int id;
    int num;
    int price;
}Goods;
typedef struct discount
{
    int n;
    int goods[5][2];//0代表编号 1代表数量
    int price;//打折后的价格
    int discount_price;//能省的钱数

}Discount;
int findGoodsById(Goods goods[25],int goods_size,int id)
{
    int i;
    for(i=0;i<goods_size;i++)
        if(goods[i].id==id)
            return i;
    return -1;
}
//返回当前可获得的最大优惠策略的编号
int findCurrentMaxDiscount(Goods goods[25],int goods_size,Discount dis[99],int dis_size)
{
    int i,j,maxDiscount=0,max_id=-1,goods_index;
    for(i=0;i<dis_size;i++)
    {
        for(j=0;j<dis[i].n;j++)
        {
            goods_index=findGoodsById(goods,goods_size,dis[i].goods[j][0]);
            if(dis[i].goods[j][1]>goods[goods_index].num)
            {
                //printf("i:%d num1:%d num2:%d
",i,dis[i].goods[j][1],goods[goods_index].num);
                break;
            }
        }
        //printf("i:%d j:%d dis[i].n:%d maxDiscount:%d discount_price%d
",i,j,dis[i].n,maxDiscount,dis[i].discount_price);
        if(j==dis[i].n&&maxDiscount<dis[i].discount_price)
        {
            max_id=i;
            maxDiscount=dis[i].discount_price;
        }
    }
    //printf("max_id:%d
",max_id);
    return max_id;
}
void my_print(Goods goods[25],int goods_size,Discount dis[99],int dis_size)
{
    printf("---------------------------------------
");
    int i,j;
    for(i=0;i<goods_size;i++)
    {
        printf("id:%d num:%d price:%d
",goods[i].id,goods[i].num,goods[i].price);
    }
    printf("
");
    for(i=0;i<dis_size;i++)
    {
        printf("n:%d price:%d discount_price:%d ",dis[i].n,dis[i].price,dis[i].discount_price);
        for(j=0;j<dis[i].n;j++)
        printf("    id:%d num:%d ",dis[i].goods[j][0],dis[i].goods[j][1]);
        printf("
");
    }
    printf("---------------------------------------
");
}
int main()
{
    int n,i,j,dis_size,goods_size,goods_index;
    Discount dis[99];
    Goods goods[25];

    //Init
    /*dis_size=4,goods_size=4;
    dis[0].n=2;dis[0].goods[0][0]=81;dis[0].goods[0][1]=1;
    dis[0].goods[1][0]=62;dis[0].goods[1][1]=1;dis[0].price=149;

    dis[1].n=2;dis[1].goods[0][0]=62;dis[1].goods[0][1]=1;
    dis[1].goods[1][0]=113;dis[1].goods[1][1]=1;dis[1].price=147;

    dis[2].n=2;dis[2].goods[0][0]=113;dis[2].goods[0][1]=1;
    dis[2].goods[1][0]=34;dis[2].goods[1][1]=1;dis[2].price=77;

    dis[3].n=2;dis[3].goods[0][0]=81;dis[3].goods[0][1]=1;
    dis[3].goods[1][0]=34;dis[3].goods[1][1]=1;dis[3].price=75;

    goods[0].id=81;goods[0].num=1;goods[0].price=27;
    goods[1].id=62;goods[1].num=2;goods[1].price=135;
    goods[2].id=113;goods[2].num=3;goods[2].price=27;
    goods[3].id=34;goods[3].num=4;goods[3].price=56;*/

    scanf("%d",&dis_size);
    for(i=0;i<dis_size;i++)
    {
        scanf("%d",&n);
        dis[i].n=n;
        for(j=0;j<n;j++)
            scanf("%d%d",&dis[i].goods[j][0],&dis[i].goods[j][1]);
        scanf("%d",&dis[i].price);
    }
    scanf("%d",&goods_size);
    for(i=0;i<goods_size;i++)
        scanf("%d%d%d",&goods[i].id,&goods[i].num,&goods[i].price);


    //初始化discount_price
    for(i=0;i<dis_size;i++)
    {
        int originPrice=0;
        for(j=0;j<dis[i].n;j++)
        {
            goods_index=findGoodsById(goods,goods_size,dis[i].goods[j][0]);
            originPrice+=goods[goods_index].price*dis[i].goods[j][1];
        }
        dis[i].discount_price=originPrice-dis[i].price;
    }
    //my_print(goods,goods_size,dis,dis_size);
    int res=0;
    i=findCurrentMaxDiscount(goods,goods_size,dis,dis_size);
    while(i!=-1)
    {
        //printf("i:%d
",i);
        res+=dis[i].price;
        for(j=0;j<dis[i].n;j++)
        {
            goods_index=findGoodsById(goods,goods_size,dis[i].goods[j][0]);
            goods[goods_index].num-=dis[i].goods[j][1];
        }
        //printf("res:%d i:%d
",res,i);
        //my_print(goods,goods_size,dis,dis_size);
        i=findCurrentMaxDiscount(goods,goods_size,dis,dis_size);
    }
    for(i=0;i<goods_size;i++)
        res+=goods[i].num*goods[i].price;
    printf("%d
",res);
    return 0;
}

87、挤牛奶

#include <stdio.h>
#include <string.h>
int main()
{
    char ch[1000001];
    memset(ch,'0',1000001);
    int min=1000000,max=-1;
    int n,a,b,res_a,res_b,i,flag;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d%d",&a,&b);
        if(a<min)min=a;
        if(b>max)max=b;
        memset(&ch[a],'1',b-a);
    }
    flag=1;//1代表正在计数有农民挤奶的时刻
    a=0,b=0;//a为挤奶时刻 b为非挤奶
    res_a=0;
    res_b=0;
    for(i=min;i<=max;i++)
    {
        if(ch[i]=='1'&&flag)a++;//挤奶
        else if(ch[i]=='0'&&!flag)b++;//不挤奶
        else if(ch[i]=='0'&&flag)//从有农民挤奶变为无
        {
            b=1;
            if(a>res_a)res_a=a;
            a=0;
            flag=0;
        }
        else //无挤奶变为有挤奶
        {
            a=1;
            if(b>res_b)res_b=b;
            b=0;
            flag=1;
        }
    }
    printf("%d %d
",res_a,res_b);
    return 0;
}

88、顺序的分数

#include <stdio.h>
#include <stdlib.h>
typedef struct fraction
{
     int son;
     int mother;
}Fraction;
int cmp(const void*a,const void*b)
{
    double x=(double)(*(Fraction*)a).son/(double)(*(Fraction*)a).mother;
    double y=(double)(*(Fraction*)b).son/(double)(*(Fraction*)b).mother;
    return x-y>0?1:-1;
}
//求a,b的最大公约数
int getGCD(int a,int b)
{
    int temp;
    int GCD;//最大公约数
    int LCM;//最小公倍数
    int product=a*b;//下面会改变ab的值
    if(a<b) {temp=a;a=b;b=temp;}
    while(1)
    {
       temp=a%b;
       if(!temp)break;
       a=b;
       b=temp;
    }
    GCD=b;
    LCM=product/GCD;//本题无意义
    return  GCD;
}
int main()
{
    int n,i,j;
    int size=0;
    scanf("%d",&n);
    Fraction f[127];
    printf("0/1
");
    for(i=1;i<n;i++)
    {
        for(j=n;j>i;j--)
        {
            if(i>=j||getGCD(i,j)!=1)continue;
            f[size].son=i;f[size].mother=j;size++;
        }
    }
    qsort(f,size,sizeof(Fraction),cmp);
    for(i=0;i<size;i++)
        printf("%d/%d
",f[i].son,f[i].mother);
    return 0;
}

89、分糖果

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
int max=-1;
int noCarryAdd(int a,int b)
{
    char stra[10],strb[10];
    itoa(a,stra,2);
    itoa(b,strb,2);
    //printf("%s %s
",stra,strb);
    int alen=strlen(stra),blen=strlen(strb),i,r=0,res=0;
    while(alen&&blen)
    {
        stra[alen-1]=(stra[alen-1]+strb[blen-1]-'0'-'0')%2+'0';
        alen--,blen--;
    }
    if(blen){strb[blen]='';strcat(strb,stra),strcpy(stra,strb);}
    alen=strlen(stra);
    for(i=alen-1;i>=0;i--)
    {
        res+=(stra[i]-'0')*(int)(pow(2,r++)+0.5);
    }
    return res;
}
//每个数都可能弟弟选 或者 我选
void select(int a[10],int broVal,int broRealVal,int myVal,int myRealVal,int n,int index)
{
    //printf("%d %d %d %d
",broRealVal,myRealVal,broVal,myVal);
    if(index==n&&(broVal==myVal&&myRealVal>=broRealVal&&broRealVal>0)){if(myRealVal>max)max=myRealVal;return;}
    if(index==n)return ;
    select(a,noCarryAdd(broVal,a[index]),broRealVal+a[index],myVal,myRealVal,n,index+1);
    select(a,broVal,broRealVal,noCarryAdd(myVal,a[index]),myRealVal+a[index],n,index+1);
}
int main()
{
    int n,num,i,a[10];
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d",&num);
        for(i=0;i<num;i++)scanf("%d",&a[i]);
        max=-1;
        select(a,0,0,0,0,num,0);
        if(max==-1)printf("NO
");
        else printf("%d
",max);
    }
    return 0;
}

90、循环数

#include <stdio.h>
#include <string.h>
int main()
{
    int n,size,temp,i,num,factor,index,flag;
    int arr[10];
    int count[10];
    scanf("%d",&n);
    while(1)
    {
        temp=++n;
        size=0;
        while(temp){arr[size++]=temp%10;temp/=10;}

        //判断是否包括0 是否有重复数字
        flag=0;
        memset(count,0,sizeof(int)*10);
        for(i=0;i<size;i++)    
        {
            count[arr[i]]++;
            if(arr[i]==0||count[arr[i]]>1){flag=1;break;}
        }
        if(flag)continue;
        memset(count,0,sizeof(int)*10);
        num=size;
        index=size-1;
        factor=arr[size-1];
        count[size-1]=1;
        while(num)
        {
            //printf("%d %d %d %d
",n,num,factor,index);
            if(factor>size)factor-=size;
            index-=factor;
            while(index<0)index+=size;
            if(count[index]==1&&num!=1)break;
            count[index]=1;
            factor=arr[index];
            num--;
        }
        if(num==0&&factor==arr[size-1])
        {
            printf("%d
",n);
            break;
        }
    }
  return 0; }

91、棋盘游戏

#include <stdio.h>
#include <string.h>
#define swap(a,b) do{a=a+b;b=a-b;a=a-b;}while(0) //两个数相同时 会导致结果为0
//参考 https://www.luogu.com.cn/problemnew/solution/P2739
//深度优先搜索加剪枝
//白色的只往右移动
//黑色的只往左移动
//移动方式 
/*
    1、白色的右移到空格
    2、黑色的左移到空格
    3、白色的通过一个黑色的右移到空格
    4、黑色的通过一个白色的左移到空格
*/
int n,min=168,a[25],flag=0,i,t;
int temp[210],res[210];
void dfs(int s,int p,int t)//s为当前步数 p为空格所在的位置 t为最左边的白色的所在的位置
{
    if(s-1>min)return;
    if(s-1==min&&flag)return ;
    if(p==n+1&&t==n+2)
    {
        min=s-1;flag=1;
        for(i=1;i<=min;i++)res[i]=temp[i];
    }
    //1、白色的右移到空格
    if(p-1>=1&&a[p-1]==1)
    {
        temp[s]=p-1;
        swap(a[p-1],a[p]);
        dfs(s+1,p-1,p-1==t?p:t);
        swap(a[p-1],a[p]);
    }
    //2、黑色的左移到空格
    if(p+1<=2*n+1&&a[p+1]==2)
    {
        temp[s]=p+1;
        swap(a[p+1],a[p]);
        dfs(s+1,p+1,t);
        swap(a[p+1],a[p]);
    }
    //3、白色的通过一个黑色的右移到空格
    if(p-2>=1&&a[p-1]==2&&a[p-2]==1)
    {
        temp[s]=p-2;
        swap(a[p-2],a[p]);
        dfs(s+1,p-2,p-2==t?p:t);
        swap(a[p-2],a[p]);
    }
    //3、黑色的通过一个白色的左移到空格
    if(p+2<=2*n+1&&a[p+2]==2&&a[p+1]==1)
    {
        temp[s]=p+2;
        swap(a[p+2],a[p]);
        dfs(s+1,p+2,t);
        swap(a[p+2],a[p]);
    }
}
int main()
{
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        a[i]=1;
        a[n+1+i]=2;
    }
    a[n+1]=0;
    dfs(1,n+1,1);
    for(i=1;i<=min;i++)
    {
        if(i%20==0||i==min)printf("%d
",res[i]);
        else printf("%d ",res[i]);
    }
    return 0;
}

92、表达式求值

#include <stdio.h>
int fun(char* str)
{
    int sum=0,size=0,temp=0;
    char f='+';
    char* p=str;
    while(*p!='')
    {
        if(*p==' '){p++;continue;}
        else if(*p=='+'||*p=='-')
        {
            if(f=='+')
                sum+=temp;
            else
                sum-=temp;
            temp=0;
            f=*p;
        }
        else temp=temp*10+*p-'0';
        p++;
    }
    if(f=='+')
        sum+=temp;
    else
        sum-=temp;
    return sum;
}
int main()
{
    char ch[1000];
    scanf("%[^
]",&ch[0]);
    printf("%d
",fun(&ch[0]));
    while(getchar()&&~scanf("%[^
]",&ch[0]))
    printf("%d
",fun(&ch[0]));
    return 0;
}

93、隐藏口令

#include <stdio.h>
#include <math.h>
#include <string.h>
//数组右移k位相当于翻转前1~n-k;再翻转n-k~n;再翻转1~n
//左移k为 相当于翻转1~k 再k~n 再1~n
void Reverse(char* a,int p,int q)
{
    int temp;
    while(!(p==q)&&!(q+1==p))
    {
        temp=a[p];
        a[p]=a[q];
        a[q]=temp;
        p++,q--;
    }
}
void RightShift(char* a,int k,int n)
{
    Reverse(a,0,n-k-1);
    Reverse(a,n-k,n-1);
    Reverse(a,0,n-1);
}
//顺时针移位 左移位
void LeftShift(char* a,int k,int n)
{
    Reverse(a,0,k-1);
    Reverse(a,k,n-1);
    Reverse(a,0,n-1);
}
int main()
{
    int size,i;
    char str[100000];
    char str1[100000];
    int res=0;
    scanf("%d",&size);
    int cur_size=0;
    while(cur_size<size)
    {
        scanf("%s",&str[cur_size]);getchar();
        cur_size=strlen(str);
    }
    strcpy(str1,str);
    for(i=1;i<size;i++)
    {
        LeftShift(str,1,size);
        if(strcmp(str,str1)<0)
        {
            strcpy(str1,str);
            res=i;
        }
        //printf("%s %s %d %d
",str,str1,res,i);
    }
    printf("%d
",res);
    return 0;
}

94、分数化小数

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//参考https://www.luogu.com.cn/problemnew/solution/P1530
int main()
{
    int i,n,d,size,z,last_show,count;//n为被除数 d为除数
    char ans[10000];
    char temp[100000];
    int flag[100000];//标记除数是否出现过
    while(~scanf("%d%d",&n,&d))
    {
        size=0,last_show=-1;//同样的被除数数上次出现的位置
        ans[0]='';
        memset(flag,0,100000*sizeof(int));
        
        //处理整数部分
        z=n/d;//整数部分
        if(z==0)ans[size++]='0';
        else
        {
            itoa(z,temp,10);
            strcat(ans,temp);
            size=strlen(ans);
        }
        //加上小数点
        ans[size++]='.';

        z=n%d;//产生小数的那部分被除数
        //处理小数部分
        if(z==0)ans[size++]='0';
        else
        {
            while(z)
            {
                if(flag[z]!=0)//若被除数之前出现过
                {
                    last_show=flag[z];
                    break;
                }
                flag[z]=size;//被除数之前未出现过 标记一次
                z*=10;
                ans[size++]='0'+z/d;//
                z=z%d;//下一个被除数
            }
        }
        if(last_show!=-1)ans[size++]=')';

        //输出
        count=0;
        for(i=0;i<size;i++)
        {
            if(i==last_show)
            {
                printf("(");
                last_show=-1;
                i--;
            }
            else printf("%c",ans[i]);
            count++;
            if(count%76==0)printf("
");
        }
        printf("
");
    }
    return 0;
}

95、回文或镜面回文

#include <stdio.h>
#include <string.h>
int isPlalindrome(char* str)
{
    int size=strlen(str);
    int i=0,j=size-1;
    while(i<j)
    {
        if(str[i]!=str[j])return 0;
        i++,j--;
    }
    return 1;
}
int isMirrored(char* str)
{
    int size=strlen(str);
    int i=0,j=size-1;
    while(i<j)
    {
        if(str[i]=='A'||str[i]=='H'||str[i]=='i'||str[i]=='M'
            ||str[i]=='O'||str[i]=='T'||str[i]=='U'||str[i]=='V'
            ||str[i]=='W'||str[i]=='X'||str[i]=='Y'||str[i]=='1'
            ||str[i]=='0'||str[i]=='8')if(str[i]==str[j]){i++,j--;continue;}
        if((str[i]=='E'&&str[j]=='3')||(str[i]=='3'&&str[j]=='E')){i++,j--;continue;}
        if((str[i]=='J'&&str[j]=='L')||(str[i]=='L'&&str[j]=='J')){i++,j--;continue;}
        if((str[i]=='J'&&str[j]=='L')||(str[i]=='L'&&str[j]=='J')){i++,j--;continue;}
        if((str[i]=='S'&&str[j]=='2')||(str[i]=='2'&&str[j]=='S')){i++,j--;continue;}
        if((str[i]=='Z'&&str[j]=='5')||(str[i]=='5'&&str[j]=='Z')){i++,j--;continue;}
        else
        return 0;
        i++,j--;
    }
    return 1;
}
void fun(char* str)
{
    if(!isPlalindrome(str)&&!isMirrored(str))printf("%s -- is not a palindrome.
",str);
    else if(isPlalindrome(str)&&!isMirrored(str))printf("%s -- is a regular palindrome.
",str);
    else if(!isPlalindrome(str)&&isMirrored(str))printf("%s -- is a mirrored string.
",str);
    else printf("%s -- is a mirrored palindrome.
",str);
    printf("
");
}
int main()
{
    int i;
    char ch[20];
    scanf("%s",&ch);
    fun(&ch[0]);
    while(getchar()&&~scanf("%s",&ch))fun(&ch[0]);
    return 0;
}

1

分割数字并排序

原文地址:https://www.cnblogs.com/lancelee98/p/12234916.html