优雅的点
小易有一个圆心在坐标原点的圆,小易知道圆的半径的平方。小易认为在圆上的点而且横纵坐标都是整数的点是优雅的,小易现在想寻找一个算法计算出优雅的点的个数,请你来帮帮他。
例如:半径的平方如果为25优雅的点就有:(+/-3, +/-4), (+/-4, +/-3), (0, +/-5) (+/-5, 0),一共12个点
简单代码:
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int main()
{
int r,x,y;
while(~scanf("%d",&r))
{
int cnt=0;
for(x=1;x*x<=r;x++)
{
int t=x*x;
y=sqrt(r-t);
if(x*x+y*y==r)
cnt++;
}
printf("%d\n",cnt*4);
}
return 0;
}
暗黑的字符串
一个只包含'A'、'B'和'C'的字符串,如果存在某一段长度为3的连续子串中恰好'A'、'B'和'C'各有一个,那么这个字符串就是纯净的,否则这个字符串就是暗黑的。例如:
BAACAACCBAAA 连续子串"CBA"中包含了'A','B','C'各一个,所以是纯净的字符串
AABBCCAABB 不存在一个长度为3的连续子串包含'A','B','C',所以是暗黑的字符串
你的任务就是计算出长度为n的字符串(只包含'A'、'B'和'C'),有多少个是暗黑的字符串。
题目的思路:
f[n]=f[n-1]*2+f[n-2];
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
long long a[35];
a[1]=3,a[2]=9;
for(int i=3;i<=30;i++)
a[i]=a[i-1]*2+a[i-2];
int n;
while(~scanf("%d",&n))
{
printf("%lld\n",a[n]);
}
return 0;
}
数字翻转
对于一个整数X,定义操作rev(X)为将X按数位翻转过来,并且去除掉前导0。例如:
如果 X = 123,则rev(X) = 321;
如果 X = 100,则rev(X) = 1.
现在给出整数x和y,要求rev(rev(x) + rev(y))为多少?
思路:就是一个字符串求和的问题
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
void add(char s1[],char s2[],char s3[])
{
int len1=strlen(s1);
int len2=strlen(s2);
int i=0,j=0,flag=0,x,k=0;
for(;i<len1&&j<len2;i++,j++)
{
x=s1[i]+s2[j]-'0'-'0'+flag;
s3[k++]=x%10+'0';
flag=x/10;
}
while(i<len1)
{
x=s1[i]+flag-'0';
s3[k++]=x%10+'0';
flag=x/10;
i++;
}
while(j<len2)
{
x=s2[j]+flag-'0';
s3[k++]=x%10+'0';
flag=x/10;
j++;
}
if(flag==1)
{
s3[k]=flag+'0';
}
}
int main()
{
char s1[10],s2[10];
while(~scanf("%s%s",s1,s2))
{
char s3[10];
memset(s3,0,sizeof(s3));
add(s1,s2,s3);
int flag=0;
for(int i=0;i<strlen(s3);i++)
{
if(flag==0&&s3[i]=='0')
continue;
else
{
flag=1;
printf("%c",s3[i]);
}
}
printf("\n");
}
return 0;
}
最大奇约数
小易是一个数论爱好者,并且对于一个数的奇数约数十分感兴趣。一天小易遇到这样一个问题: 定义函数f(x)为x最大的奇数约数,x为正整数。例如:f(44) = 11.
现在给出一个N,需要求出 f(1) + f(2) + f(3).......f(N)
例如: N = 7
f(1) + f(2) + f(3) + f(4) + f(5) + f(6) + f(7) = 1 + 1 + 3 + 1 + 5 + 3+ 7 = 21
小易计算这个问题遇到了困难,需要你来设计一个算法帮助他。
思路:奇数的最大奇约数,就是自己。1~n中的奇数先加一次,然后将奇数剔除,偶数除以2,又变成了奇数相加。
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
long long n;
while(~scanf("%lld",&n))
{
long long sum=0;
for(long long i=n;i>0;i/=2)
{
long long x=(i+1)/2;
sum+=x*x;
}
printf("%lld\n",sum);
}
return 0;
}
买苹果:
小易去附近的商店买苹果,奸诈的商贩使用了捆绑交易,只提供6个每袋和8个每袋的包装(包装不可拆分)。 可是小易现在只想购买恰好n个苹果,小易想购买尽量少的袋数方便携带。如果不能购买恰好n个苹果,小易将不会购买。
除了10,奇数,小于6的数,8和6不能组合出来,其余的都可以
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int n;
while(~scanf("%d",&n))
{
if((n&1)||(n==10)||(n<6))
printf("-1\n");
else
{
if(n%8==0)
printf("%d\n",n/8);
else
printf("%d\n",n/8+1);
}
}
return 0;
}