算法题小总结(1)

目录

1.连续数之和

思路

代码展示

 2.授勋

 思路

代码展示

3.完美立方

 思路

代码展示

4.买鸡问题

思路

代码展示

5.母牛的故事

思路

代码展示 

6.暖气坏了

思路

代码展示

 


1.连续数之和

思路

这个题很水,可能乍一看有点玄乎,但很简单。如6=-5+-4+-3+-2+-1+0+1+2+3+4+5+6.

每一个数都可以这样表示。

代码展示

C语言:

#include<stdio.h>

int main()
{
	int t,l,r;
	int n;
	scanf("%d",&t);
	while(t!=0)
	{
		scanf("%d",&n);
		l=n;
		r=-n+1;
		printf("%d %d\n",r,l);
		t--;
	}
	return 0;
}

python:

t=int(input())
i=0
for i in range(t):
    n=int(input())
    l=-n+1
    r=n
    print("%d %d"%(l,r))

 2.授勋

/*历经旷日持久的战争之后,百纳瑞王国终于迎来了胜利的曙光。
于是国王决定在胜利日这一天为在战争中奋战的将领们授勋。

已经需要为N位将领授勋,他们每人有一个功勋值p[i]。
国王准备了不同种类的勋章,它们分别代表1,2,4,8,16......(即2的幂次)的功勋值。
国王将用与每位将领功勋值对等数值的勋章授予他们,
并且每位将领只会被授予一枚同种勋章。

现在请你帮助国王算出,对于每一位将领,他需要准备多少枚勋章?*/

InputOutput
3
15
1
22
4
1
3

 思路

与2有关,勋章都是2的次幂,可以对2取余,一直到1,记录取余次数

代码展示

#include<stdio.h>

int main()
{
	int n,m;
	scanf("%d",&n);
	while(n--)
	{
		int count=0;
		scanf("%d",&m);
		while(m!=0)
		{
			if(m%2==1)
			    count+=1;
			m/=2;
		}
		printf("%d\n",count);
	}	
	return 0;
}

3.完美立方

/*完美立方
输入格式
一个正整数 N(N≤100)。

输出格式
每行输出一个完美立方。输出格式为:

Cube = a, Triple = (b,c,d)

其中 a,b,c,d 所在位置分别用实际求出四元组值代入。

请按照 a 的值,从小到大依次输出。
当两个完美立方等式中 a 的值相同,则 b 值小的优先输出;
仍相同则 c 值小的优先输出;再相同则 d 值小的先输出。*/

 思路

这个题不难,只是要注意完美立方数最小为6,3,4,5,可以减少循环次数。

代码展示

#include<stdio.h>
int lifang(int a)
{
	return a*a*a;
}

int main()
{
	int a=6,b=3,c=4,d=5,n;//最小的完美立方数 
	scanf("%d",&n);
	for(int i=6;i<=n*n*n*n;i++)
	{
		if(lifang(a)==lifang(b)+lifang(c)+lifang(d)&&b<=c&&c<=d)
			printf("Cube = %d, Triple = (%d,%d,%d)\n",a,b,c,d);			
		d++;
		if(b>n){
			b=2;
			a++;
		}
		if(c>n){
			c=2;
			b++;
		}
		if(d>n){
			d=2;
			c++;
		}
		if(a>n) return 0;
	}
	return 0;
}

4.买鸡问题

/*百钱买百鸡问题:公鸡五文钱一只,母鸡三文钱一只,小鸡三只一文钱,
用 100 文钱买 100 只鸡,公鸡、母鸡、小鸡各买多少只?

本程序要求解的问题是:给定一个正整数 n,
用 n文钱买 n 只鸡,问公鸡、母鸡、小鸡各买多少只?*/

思路

两个循环暴力解决, 对,是两个循环,公鸡母鸡数量知道,小鸡的数量就知道了

代码展示

#include<stdio.h>

int main()
{
	int n,c=0,k,sum;
	scanf("%d",&n);
	for(int i=0;i<=n/5;i++)
	    for(int j=0;j<=((n-5*i)/3);j++)
	    {
	    	k=(n-5*i-3*j)*3;
	    	sum=k+i+j;
	    	if(sum==n)
	    	{
	    		printf("%d %d %d\n",i,j,k);
	    		c=1;
			}
		}
	if(c==0) printf("No Answer.");
	return 0;
}

5.母牛的故事

/*有一头母牛,它每年年中生一头小母牛。
每头小母牛从第四个年头开始,每年年中也生一头小母牛。
请编程实现在第 n 年的时候(不算第 n 年出生的小母牛),
共有多少头母牛?

输入格式
输入包括一个整数 n(0 < n < 55)

输出格式
输出在第 n 年的时候母牛的数量。

Sample 1
Input   

2

Output
2       

Sample 2
Input  

5

 Output
6
*/

思路

首先是递归,如果牛的“年龄”<=3,返回自己本身,否则返回自己和一头新的牛

如果年数为n,n<=3,return n,否则return niu(n-1)+niu(n-3)

代码展示 

#include<stdio.h>
int niu(int n);

int niu(int n)
{
	if(n<=3) return n;
	else return niu(n-1)+niu(n-3);
} 
int main()
{
	int n;
	scanf("%d",&n);
    printf("%d",niu(n)); 
	return 0;
}

还有一种方法,用循环做的

#include<stdio.h>

int main()
{
	int a[55]={1,2,3,4},n;
	scanf("%d",&n);
	if(n<=4) printf("%d",n);
	else{
		for(int i=4;i<n;i++)
		{
			a[i]=a[i-1]+a[i-3]; 
		}
		printf("%d",a[n-1]);
	}
	return 0;
} 

6.暖气坏了

/*蒜头君家的暖气经常出问题,每当暖气坏了,
蒜头君就会持续感冒m天(从坏的那天算起,两次感冒时间重叠不会累加)。
蒜头君去寻求预言家的帮助,预言家告诉他接下来n次暖气片坏掉的时间。
根据这个时间,蒜头君就能知道他未来获得感冒的总天数。
输入格式
第一行两个整数n, m,表示暖气片坏掉的次数以及每次感冒的持续天数。
第二行n个整数ai,表示暖气片坏掉的日期。
数据范围:1<=n ≤10000,1 <=m, ai≤10^9,保证ai是严格递增的。
输出格式
一个整数,表示蒜头君感冒的总天数。
Sample Input
4 3
1 2 4 8
Sample Output
9*/

思路

循环,注意,感冒天数不叠加

代码展示

#include<stdio.h>

int main()
{
	int n,m,a[10000],sum=0;
	scanf("%d%d",&n,&m); 
	for(int i=0;i<n;i++)
	    scanf("%d",&a[i]);;
	for(int i=0;i<n-1;i++)
	{
		if(a[i+1]<=a[i]+m) 
		{
			sum+=a[i+1]-a[i];
		}else{
			sum+=m;
		}
	}
	sum+=m;
	printf("%d",sum);
	return 0;
}

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值