目录
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的幂次)的功勋值。
国王将用与每位将领功勋值对等数值的勋章授予他们,
并且每位将领只会被授予一枚同种勋章。现在请你帮助国王算出,对于每一位将领,他需要准备多少枚勋章?*/
Input Output 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
Input2
Output
2Sample 2
Input5
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;
}