算法笔记 第三章

B1001 害死人不偿命的(3n+1)猜想

在这里插入图片描述
代码:

#include<cstdio>
int main(void)
{
    
    
    int n;
    int temp=0;
    scanf("%d",&n);
    while(n!=1)
    {
    
    
        if(n%2==0)
        {
    
    
            n=n/2;
            temp++;
            continue;
        }
        n=(n*3+1)/2;
        temp++;
    }
    printf("%d\n",temp);
    return 0;
}

B1032 挖掘机技术哪家强

在这里插入图片描述
代码:

#include<cstdio>
int school[100005];
int main(void)
{
    
    
    int n,sch,number;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
    
    
        scanf("%d %d",&sch,&number);
        school[sch]+=number;
    }
    int max_x,max;
    max=-1;
    for(int i=1;i<=n;i++)
    {
    
    
        if(school[i]>max)
        {
    
    
            max_x=i;
            max=school[i];
        }
    }
    printf("%d %d",max_x,max);
    return 0;
}

问题B: 找X

在这里插入图片描述
代码:

#include<cstdio>
int a[205];
int main(void)
{
    
    
	int n;
	int i;
	int x;
	int x_x;
	int temp;
	while(scanf("%d",&n)!=EOF)
	{
    
    
	    temp=0;
	    for(i=0;i<n;i++)
	    {
    
    
		    scanf("%d",&a[i]);
	    }
    	scanf("%d",&x);
	    for(i=0;i<n;i++)
	    {
    
    
		    if(x==a[i])
		    {
    
    
			    x_x=i;
		    	temp=1;
		    	printf("%d\n",x_x);
			    break;
	    	}	
    	}
	    if(!temp)
	    {
    
    
		    printf("-1\n");
	    } 
	}
	return 0;
}

进一步的优化

#include<cstdio>
int a[205];
int main(void)
{
    
    
	int n;
	int i;
	int x;
	while(scanf("%d",&n)!=EOF)
	{
    
    
	    for(i=0;i<n;i++)
	    {
    
    
		    scanf("%d",&a[i]);
	    }
    	scanf("%d",&x);
	    for(i=0;i<n;i++)
	    {
    
    
		    if(x==a[i])
		    {
    
    
		    	printf("%d\n",i);
			    break;
	    	}	
    	}
	    if(i==n)
	    {
    
    
		    printf("-1\n");
	    } 
	}
	return 0;
}

B1036 跟奥巴马一起编程

在这里插入图片描述

问题分析:
当列数是偶数时,行数等于列数的一半。
当列数是奇数时,行数等于列数的一半再加1

代码

#include<cstdio>
int main(void)
{
    
    
    int n,i,j;
    int lie;//空格列的个数
    int hang;//空格行的个数
    char a;
    scanf("%d %c",&n,&a);
    for(i=1;i<=n;i++)
    {
    
    
        printf("%c",a);
    }
    lie=n-2;
    if(n%2==0)
    hang=n/2;
    else
    hang=n/2+1;
    printf("\n");
    hang=hang-2;
    for(i=1;i<=hang;i++)
    {
    
    
        printf("%c",a);
        for(j=1;j<=lie;j++)
            printf(" ");
        printf("%c\n",a);
    }
    for(i=1;i<=n;i++)
    {
    
    
        printf("%c",a);
    }
    return 0;
}

问题 A: 日期差值

在这里插入图片描述

问题分析:
先假设第一个日期大(如果不是就互换)
让第一个的日期一直加1直到等于第二个日期。
为了方便直接取出每个月的天数,不妨给定一个二维数组int month[13][2],用来存放
每个月的天数,其中第二维为0时表示平年,为1时表示闰年。

代码如下:

#include<cstdio>
int month[13][2]=
{
    
    
	{
    
    0,0},//当二维为0时代表平年,当二维为1时代表润年, 
	{
    
    31,31},//一月 
	{
    
    28,29},//二月 
	{
    
    31,31},//3
	{
    
    30,30},//4
	{
    
    31,31},//5
	{
    
    30,30},//6
	{
    
    31,31},//7
	{
    
    31,31},//8
	{
    
    30,30},//9
	{
    
    31,31},//10
	{
    
    30,30},//11
	{
    
    31,31}//12
};
bool panduan(int year)
{
    
    
	return  (year%4==0 && year%100!=0) || (year%400==0);
}
int main(void)
{
    
    
	int temp;
	int a1,a2;
	int y1,m1,d1;
	int y2,m2,d2;
	while( scanf("%d %d",&a1,&a2) != EOF )
	{
    
    
		if(a1>a2)
		{
    
    
			temp=a2;
			a2=a1;
			a1=temp;
		}
		temp=1;
		y1=a1/10000;
		m1=(a1/100)%100;
		d1=a1%100;
		y2=a2/10000;
		m2=(a2/100)%100;
		d2=a2%100;
		//while( y1!=y2 || m1!=m2 || d1!=d2 )
		while( y1<y2 || m1<m2 || d1<d2 )
		{
    
    
			d1++;
			if(d1==month[m1][panduan(y1)]+1)
			{
    
    
				m1++;
				d1=1;
			}
			if(m1==13)
			{
    
    
				y1++;
				m1=1;
			}
			temp++;
		}
		printf("%d\n",temp);
	}
	return 0;
} 

如果想提升运行速度,只需把第一个的年份不断加1,直到与第二个日期的年份相差为1。
天数按照平/闰年的天数来加365或366。
年份相差为1是因为第一个日期的月日可能比第二个日期的月日大。
代码如下:

#include<cstdio>
int month[13][2]=
{
    
    
	{
    
    0,0},//当二维为0时代表平年,当二维为1时代表润年, 
	{
    
    31,31},//一月 
	{
    
    28,29},//二月 
	{
    
    31,31},//3
	{
    
    30,30},//4
	{
    
    31,31},//5
	{
    
    30,30},//6
	{
    
    31,31},//7
	{
    
    31,31},//8
	{
    
    30,30},//9
	{
    
    31,31},//10
	{
    
    30,30},//11
	{
    
    31,31}//12
};
bool panduan(int year)
{
    
    
	return  (year%4==0 && year%100!=0) || (year%400==0);
}
int main(void)
{
    
    
	int temp;
	int a1,a2;
	int y1,m1,d1;
	int y2,m2,d2;
	while( scanf("%d %d",&a1,&a2) != EOF )
	{
    
    
		if(a1>a2)
		{
    
    
			temp=a2;
			a2=a1;
			a1=temp;
		}
		temp=1;
		y1=a1/10000;
		m1=(a1/100)%100;
		d1=a1%100;
		y2=a2/10000;
		m2=(a2/100)%100;
		d2=a2%100;
		while(y1<(y2-1)) //提升速度
		{
    
    
			if(panduan(y1))
			temp+=366;
			else
			temp+=365;
			y1++;
		}
		//while( y1!=y2 || m1!=m2 || d1!=d2 )
		while( y1<y2 || m1<m2 || d1<d2 )
		{
    
    
			d1++;
			if(d1==month[m1][panduan(y1)]+1)
			{
    
    
				m1++;
				d1=1;
			}
			if(m1==13)
			{
    
    
				y1++;
				m1=1;
			}
			temp++;
		}
		printf("%d\n",temp);
	}
	return 0;
} 

进制转换

题目:对于一个P进制的数,如果要转换为Q进制。
分为两步:

  1. 将P进制数x转换成为十进制数y
  2. 将十进制数y转换成Q进制数z
    代码如下:
#include<cstdio>
int main(void)
{
    
    
	int P,Q,x;
	int x_D=0;
	int x_Q[30]={
    
    0};
	int product=1;
	int i=0;
	printf("请输入P:");
	scanf("%d",&P);
	printf("请输入x:");
	scanf("%d",&x);
	printf("请输入Q:");
	scanf("%d",&Q);
	while(x!=0)
	{
    
    
		x_D=x_D+(x%10)*product;
		x=x/10;
		product=product*P; 
	}
	printf("%d\n",x_D);
	while(x_D!=0)
	{
    
    
		x_Q[i]=x_D%Q;
		x_D/=Q;
		i++; 
	}
	for(;i>=0;i--)
	{
    
    
		printf("%d",x_Q[i]);
	}
	return 0;
} 

B1022 D进制的A+B

在这里插入图片描述
代码如下:

#include<cstdio>
int main(void)
{
    
    
    int A,B,D,sum,i;
    int a[100]={
    
    0};
    scanf("%d%d%d",&A,&B,&D);
    sum=A+B;
    i=0;
    if(sum==0)
    {
    
    
    	printf("0\n");
    	return 0;
    }
    while(sum!=0)
    {
    
    
        a[i++]=sum%D;
        sum=sum/D;
    }
    i--;
    for(;i>=0;i--)
    {
    
    
        printf("%d",a[i]);
    }
    return 0;
}

或者这样更好

#include<cstdio>
int main(void)
{
    
    
    int A,B,D,sum,i;
    int a[100]={
    
    0};
    scanf("%d%d%d",&A,&B,&D);
    sum=A+B;
    i=0;
    do
	{
    
    
        a[i++]=sum%D;
        sum=sum/D;
    }while(sum!=0);
    i--;
    for(;i>=0;i--)
    {
    
    
        printf("%d",a[i]);
    }
    return 0;
}

问题 I: 【字符串】回文串

在这里插入图片描述
代码如下:

#include<cstdio>
#include<cstring>>
bool judge(char a[],int len)
{
    
    
	int i=0;
	for(i=0;i<len/2;i++)
	{
    
    
		if(a[i]!=a[len-1-i])
			return false;
	}
	return true;
}
int main(void)
{
    
    
    char a[256];
    gets(a);
    if(judge(a,strlen(a)))
    printf("YES\n");
    else
    printf("NO\n");
    return 0;
}

B1009 说反话

在这里插入图片描述
方法一

#include<cstdio>
int main(void)
{
    
    
	int num=0;
	char ans[90][90];
	while( scanf("%s",ans[num]) != EOF )
	{
    
    
		num++;
	} 
	for(int i=num-1;i>=0;i--)
	{
    
    
		printf("%s",ans[i]);
		if(i>0)
		printf(" ");
	}
	return 0;
}

方法二:

#include<stdio.h>
#include<string.h>
int main(void)
{
    
    
	int num=0;
	int i,h;
	char a[90];
	char ans[90][90];
	gets(a);
	for(i=0;i<strlen(a);i++)
	{
    
    
		if(a[i]!=' ')
		{
    
    
			ans[num][h++]=a[i];
		}
		else
		{
    
    
			ans[num][h]='\0';
			num++;
			h=0;
		}
	}
	for(i=num;i>=0;i--)
	{
    
    
		printf("%s",ans[i]);
		if(i>0)
		printf(" ");
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_46527915/article/details/114583148