题目链接 https://vjudge.net/contest/193071
A - 字符串统计
for循环遍历 找到数字个数
#include<stdio.h>
#include<string.h>
char str[10000000];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%s",str);
int len=strlen(str);
int sum=0;
for(int i=0;i<len;i++)
{
if(str[i]>='0'&&str[i]<='9')
sum++;
}
printf("%d\n",sum);
}
return 0;
}
B - 亲和数
#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,m;
scanf("%d%d",&n,&m);
int sum1=0,sum2=0;
for(int i=1;i<=sqrt(n*1.0);i++)
{
if(n%i==0)
sum1+=i+n/i;
}
sum1-=n;
for(int i=1;i<=sqrt(m*1.0);i++)
{
if(m%i==0)
sum2+=i+m/i;
}
sum2-=m;
if(sum1==m&&sum2==n)
printf("YES\n");
else printf("NO\n");
}
return 0;
}
C - How many days?
#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m),(n||m))
{
int sum=0;//总共过的天数
while(n)
{
sum+=n/m*m;//先加上最多能过的k天的倍数
n=n%m+n/m;//剩下的不够k天的钱再加上获赠的钱
if(n<m)//如果现在有的钱不够k,输出 如果够k 继续循环直至不够k
{
sum+=n;
break;
}
}
printf("%d\n",sum);
}
return 0;
}
D - Rightmost Digit
快速幂水题 每次 %10
#include<stdio.h>
typedef long long LL;
int kuai(LL n,LL k)
{
LL sum=1,p=n;
while(k)
{
if(k&1)
sum=(p*sum)%10;
p=((LL)p*p)%10;
k>>=1;
}
return (int)sum;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
LL n;
scanf("%lld",&n);
printf("%d\n",kuai(n,n));
}
return 0;
}
E - 权势二进制
因为每一位都可以选择加1或者加0 所以只要得到各个位上数字的最大值就好
#include<stdio.h>
int main()
{
int n,ma=0;
scanf("%d",&n);
while(n)
{
int t=n%10;
if(t>ma)
ma=t;
n=n/10;
}
printf("%d\n",ma);
}
F - 排序
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
char a[1009];
int b[10000];
int main()
{
while(~scanf("%s",a))
{
int len=0;
for(int i=0;i<strlen(a);i++)
{
if(a[i]!='5')//如果不是‘5’
{
int sum=0;
for(;a[i]!='5'&&i<strlen(a);i++) //碰到‘5’或者到字符串末尾则停止
sum=sum*10+a[i]-'0'; //得到那一串的数值
b[len++]=sum; //存入
}
}
sort(b,b+len);
for(int i=0;i<len-1;i++)
printf("%d ",b[i]);
printf("%d\n",b[len-1]);
}
return 0;
}
G - 18岁生日
#include<stdio.h>
bool pan(int x)//判断是否为闰年
{
if((x%4==0&&x%100)||x%400==0)
return 1;
return 0;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int y,m,d;
scanf("%d-%d-%d",&y,&m,&d);
if(m==2&&d==29)
{
printf("-1\n");
}
else
{
int k=0,sum=0;
for(int i=y+1;i<y+18;i++) //找出从出生后一年到17岁那年有几年为闰年
{
if(pan(i))
k++;
}
if(pan(y)) //如果出生那年是闰年且月份在2月前闰年数+1
{
if(m<=2)
k++;
}
if(pan(y+18))//如果18岁那年为闰年且月份在2月后闰年数+1
{
if(m>2)
k++;
}
printf("%d\n",k*366+(18-k)*365);
}
}
}
H - 阿牛的EOF牛肉串
O后面只能接 E或F E后面是 O E F F后面是 O E F
假设结尾是O的串数为 a 结尾是E或F的串数为 b
因为 只有结尾是E或 F后面才能添 O
结尾为O或E或F 后面都能添 E 或F
所以 如果再增加1个字符则 a=b b=2*(a+b)
而最开始只有1个字符的时候 a=1 ,b=2 然后开始递推 最后输出 a+b
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int main()
{
long long n;
while(~scanf("%lld",&n))
{
long long a=2,b=1;
for(long long i=2;i<=n;i++)
{
long long p=a,pp=b;
b=p;
a=pp*2+p*2;
}
printf("%lld\n",a+b);
}
return 0;
}
I - 密码
#include<stdio.h>
#include<string.h>
#include<math.h>
char str[100];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%s",str);
int len=strlen(str);
int a1=0,a2=0,a3=0,a4=0;
for(int i=0; i<len; i++)
{
if(str[i]>='0'&&str[i]<='9') a3=1;
if(str[i]>='a'&&str[i]<='z') a2=1;
if(str[i]>='A'&&str[i]<='Z') a1=1;
if(str[i]=='~'||str[i]=='!'||str[i]=='@'||str[i]=='#'||str[i]=='$'||str[i]=='%'||str[i]=='^')
a4=1;
}
if(len<=16&&len>=8&&a1+a2+a3+a4>=3) //只要满足3个条件
printf("YES\n");
else printf("NO\n");
}
return 0;
}
J - 求数列的和
#include<stdio.h>
#include<math.h>
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
double sum=(double)n,sun=(double)n;
for(int i=2;i<=m;i++)
{
sum+=sqrt(sun);
sun=sqrt(sun);
}
printf("%.2lf\n",sum);
}
return 0;
}
K - 整除的尾数
枚举后两位从 0到99 看(尾数加100*a )%b 是否为0
#include<stdio.h>
int main()
{
int a,b;
while(~scanf("%d%d",&a,&b)&&a+b)
{
int t=a*100;
int o=0;
for(int i=0;i<100;i++)
{
if((t+i)%b==0)
{
if(o==0)
{
printf("%02d",i);
o++;
}
else
printf(" %02d",i);
}
}
printf("\n");
}
}