题解

本文解析了十道经典的编程题目,涉及字符串比较、日期计算、分数拆分等内容,通过具体的C语言实现展示了如何解决这些问题。

第一题:比大小

    转化为字符串来判断数的大小,首先判断第一位的符号,正号>负号; 其次判断长度,不相等时,如果是正数,长>短。如果是负数,短>长;相等时,直接strcmp。

#include<stdio.h>
#include<string.h>
int main()
{
	int t=0,lena,lenb;
	char a[1100],b[1100];
		while(scanf("%s%s",a,b)&&(t<=10)&&(strcmp("0",a)!=0)||(strcmp("0",b)!=0))
		{
			lena=strlen(a);
			lenb=strlen(b);
			if(a[0]=='-'&&b[0]!='-')
			  printf("a<b\n");
			else if(a[0]!='-'&&b[0]=='-')
			  printf("a>b\n");
			else if(a[0]=='-'&&b[0]=='-'&&lena!=lenb)//此处一定要将字符串a,b的长度不相等写上
			{
			    if(lena>lenb)
			       printf("a<b\n");
	            if(lena<lenb)
				   printf("a>b\n");
			}
			else if(a[0]!='-'&&b[0]!='-'&&lena!=lenb)//同上
			{
				if(lena<lenb)
				   printf("a<b\n");
				if(lena>lenb)
				   printf("a>b\n");
			}
			else if(a[0]=='-'&&b[0]=='-'&&lena==lenb)
			{
				if(strcmp(a,b)>0)
				   printf("a<b\n");
				else if(strcmp(a,b)<0)
				   printf("a>b\n");
				else
				   printf("a==b\n");
			}
			else if(a[0]!='-'&&b[0]!='-'&&lena==lenb)
			{
				if(strcmp(a,b)>0)
				   printf("a>b\n");
				else if(strcmp(a,b)<0)
				   printf("a<b\n");
				else
				   printf("a==b\n");
			}
			t++;
	    }
	return 0;
}


第二题:日期计算

    直接把今年的每个月的天数统计出来(特殊的就是判断2月有29天还是28天,就变成了判断是否为闰年),然后把1月到当前月份的天数加起来,最后再把这个月的剩余天数加起来就O了。

#include<stdio.h>

int main()

{

    int a,b=0,c,y,m,d,fib;

    scanf("%d",&a);

    while(a--)

    {

        scanf("%d %d %d",&y,&m,&d);

        if(y%400==0||y%100!=0&&y%4==0)

            fib=29;

        else fib=28;

        for(c=1; c<=m; c++)

            switch(c-1)

            {

            case 1:

            case 3:

            case 5:

            case 7:

            case 8:

            case 10:
                b+=31;
                break;

            case 2:
                b+=fib;
                break;

            case 4:

            case 6:

            case 9:

            case 11:
                b+=30;
                break;

            }

        b+=d;

        printf("%d\n",b);

        b=0;

    }

    return 0;

}

第三题:分数拆分

    数学题,1/k=1/x+1/y.这个等式转化成 1/k=(x+y)/xy ,k就等于k=xy/(x+y);因为x>y,我们直接枚举x和y的值,这题求出来了。


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


第四题:矩形的个数

    此题是求出N*M的矩形能分成多少小矩形,其实很简单,还是数学几何题,你想一下,长度为N的边可以分成多少情况?长度为1的话有N种,长度为2的话有N-1种,。。。。长度为N的有1种,由等差数列求和公式求出来有(1+N)*N/2种。长度为M的边如上,求出有(1+M)*M/2种。  好了,每个边的分割方式都求出来了,你想一下,在长度为N这条边的分割方式中使其中一个和长度为M边的任意一种分割方式组合起来都正好对应一个不同的矩形。。。。。所以求矩阵数就等于 N*(N+1)/2*M*(M+1)/2;还是不会的去问NQD学长。


#include<stdio.h>
int main()
{
    long long  a,b;
    while(~scanf("%lld%lld",&a,&b))
    {
        printf("%lld\n",a*(a+1)*(b+1)*b/4);
    }
    return 0;
}


第五题:16进制的简单运算

    考输入格式的,不懂得去看书


#include <stdio.h>
int main()
{
    int a,b,n;
    scanf("%d",&n);
        while(n--)
        {
            scanf("%x %x",&a,&b);
            printf("%o\n",a+b);
        }

    return 0;
}


第六题:车牌号

    字符串比较。


#include <stdio.h>
#include <string.h>
int main()
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        int m;
        scanf("%d",&m);
        getchar();
        char a[6],b[6];
        gets(a);
        while(--m)
        {
            gets(b);
            if(strcmp(b,a)<=0)
                strcpy(a,b);
        }
        puts(a);
    }
    return 0;
}


第七题:king选太子

    排序,抽中间数


#include<stdio.h>
#include<string.h>
#include<math.h>
int main()//
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n,h;
        scanf("%d",&n);
        int a[18];
        for(int i=0; i<n; i++)
        {
            scanf("%d",&a[i]);
        }
        for(int k=0;k<n;k++)
            for(int i=0;i<n-k-1;i++)
               if(a[i]>a[i+1])
               {
                   h=a[i];
                   a[i]=a[i+1];
                   a[i+1]=h;
               }
            printf("%d\n",a[n/2]);


    }
    return 0;
}



第八题:小明的烦恼

    判断题,和成绩分级那个一样


#include<stdio.h>
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        char a[11];
        int i;
        scanf("%s",a);
        for(i=0; i<11; i++)
        {
            if(a[i]>=97&&a[i]<=99)
            {
                printf("2");
            }
            else if(a[i]>=100&&a[i]<=102)
            {
                printf("3");
            }
            else if(a[i]>=103&&a[i]<=105)
            {
                printf("4");
            }
            else if(a[i]>=106&&a[i]<=108)
            {
                printf("5");
            }
            else if(a[i]>=109&&a[i]<=111)
            {
                printf("6");
            }
            else if(a[i]>=112&&a[i]<=115)
            {
                printf("7");
            }
            else if(a[i]>=116&&a[i]<=118)
            {
                printf("8");
            }
            else if(a[i]>=119&&a[i]<=122)
            {
                printf("9");
            }
        }
        printf("\n");
    }
    return 0;
}



第九题:小明的调查统计

    求最大值,最小值


#include <stdio.h>
#include <string.h>
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int N,i;
        scanf("%d",&N);
        int a[105];
        for(i=1;i<=N;i++)
        {
            scanf("%d",&a[i]);
        }
        int maxn=0,minn=1000;
        for(i=1;i<=N;i++)
        {
            if(a[i]>=maxn)
                maxn=a[i];
            if(a[i]<minn)
                minn=a[i];
        }
        printf("%d\n",maxn-minn);
    }
    return 0;
}


第十题:小明求素数积

    求N以内的素数,然后相乘,很简单,因为可以取巧,因为数据很小,所以直接打表,就是把要求的数据直接存在数组里,至于怎么求出来的,肯定是私下求啊。打表是一个很取巧的,但是却能高效的解决问题,推荐~~


#include<stdio.h>
int da[500]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,
163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,
367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593
,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827
,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997};
int main(){
	int n,a;
	scanf("%d",&n);
	while(n--){
		int sum=1;
		scanf("%d",&a);
		for(int i=0;i<500;i++){
			if(da[i]>a){
				printf("%d\n",sum);
				break;
			}
			sum*=da[i]%1000000;
			sum%=1000000;
		}

	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值