c语言分拆素数和函数,NYIST--2017大一新生第一次周赛题解

这篇博客汇总了多道编程竞赛题目,包括A到J共10道题目,涉及数学计算、字符串处理、素数分解、取模运算、整数解枚举、单词搜索、向量夹角计算、手机短号生成、C语言标识符合法性检查和叠筐模拟等。博主提供了详细的解题思路和C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

比赛链接:

https://cn.vjudge.net/contest/191248

密码:nyist

弱校新生题解,大牛速速离去~

A - Thickest Burger

输出A*2+ B和A+B*2 较大的一个

#include

int max(int a,int b)

{

if(a>b)

return a;

else

return b;

}

int main()

{

int t,a,b;

scanf("%d",&t);

while(t--)

{

scanf("%d%d",&a,&b);

printf("%d\n",max(a*2+b,a+b*2));

}

return 0;

}

B - Relative atomic mass

直接计算即可

#include

#include

using namespace std;

char s[20];

int main()

{

int t,a,b;

scanf("%d",&t);

while(t--)

{

scanf("%s",s);

int len=strlen(s);

int sum=0;

for(int i=0; iif(s[i]=='C')

sum+=12;

if(s[i]=='H')

sum+=1;

if(s[i]=='O')

sum+=16;

}

printf("%d\n",sum);

}

return 0;

}

C - 分拆素数和

写一个判断素数的函数,直接暴力即可

#include

#include

int prime(int x)

{

int i,flag=1;

for(i=2; i<=sqrt(x); i++)

{

if(x%i==0)

flag=0;

}

return flag;

}

int main()

{

int n,i,j;

while(scanf("%d",&n)!=0&&n)

{

j=0;

for(i=2; i2; i++)

{

if(prime(i)&&prime(n-i))

j++;

}

printf("%d\n",j);

}

return 0;

}

D - 小明A+B

对于要计算的数,直接对100取模即可

#include

int main()

{

int a,b,c,d,n;

scanf("%d",&n);

while(n--)

{

scanf("%d%d",&a,&b);

c=a%100;

d=b%100;

printf("%d\n",(c+d)%100);

}

}

E - 整数解

通过枚举,可以暴力水过

#include

int main()

{

int n,m;

while(scanf("%d%d",&m,&n)!=EOF)

{

if(m==0&&n==0)

return 0;

int flag=0;

for(int i=-1000; i<=10000; i++)

{

if(i*(m-i)==n)

{

printf("Yes\n");

flag=1;

break;

}

}

if(flag==0)

printf("No\n");

}

return 0;

}

F - 找单词

我们把题目转化成多重背包的思路来理解。

先看一下多重背包的一般定义:有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件重量是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。

在这个题目里面就是:

有26个物品,背包的容量为50,每一件物品的数量题目已经给出,现在就剩下每一个物品的重量,我们可以直接用字母的标号1-26代替.

先定义状态:dp[i][j]表示有i个字母,总价值为j的时候,符合条件的单词数量

我们可以得到状态转移方程:

dp[i][j]+=dp[i−1][j−k∗w[i]]

#include

#include

int dp[55][55];

int w[30],num[30];

int main()

{

int t;

scanf("%d",&t);

while(t--)

{

memset(dp,0,sizeof(dp));

memset(w,0,sizeof(w));

for(int i=1; i<=26; i++)

{

w[i]=i;

scanf("%d",&num[i]);

}

dp[0][0]=1;

for(int i=1; i<=26; i++)

for(int j=0; j<=50; j++)

for(int k=0; k<=num[i]&&k*w[i]<=j; k++)//k代表字母的数量,w[i]代表不同的字母

dp[i][j]+=dp[i-1][j-k*w[i]];

int ans=0;

for(int i=1; i<=50; i++)

ans+=dp[26][i];

printf("%d\n",ans);

}

return 0;

}

G - 夹角有多大II

回顾一下我们学过的向量的知识,利用两条边来计算夹角

cosC=x1∗x2+y1∗y2x21+y21−−−−−−√∗x22+y22−−−−−−√

#include

#include

#define PI 3.1415926535;

int main()

{

double x1,x2,y1,y2;

int T;

double a,b,c;

while(scanf("%d",&T)!=EOF)

{

while(T--)

{

scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);

a=x1*x2+y1*y2;

b=sqrt(x1*x1+y1*y1)*sqrt(x2*x2+y2*y2);

c=acos(a/b)/PI;

c*=180;

printf("%.2lf\n",c);

}

}

return 0;

}

H - 手机短号

加深一下对字符串的理解,字符串可以如何输出

#include

int main()

{

int n,i;

char a[12];

scanf("%d",&n);

while(n--)

{

scanf("%s",a);

printf("6%s\n",a+6);

}

}

I - C语言合法标识符

考察一下什么是c语言合法标识符

#include

#include

char a[66];

int main()

{

int t;

scanf("%d",&t);

getchar();

while(t--)

{

gets(a);

int l=strlen(a);

if(a[0]=='_'||(a[0]>='a'&&a[0]<='z')||(a[0]>='A'&&a[0]<='Z'))

{

int m=0;

for(int i=1; iint flag=0;

if(a[i]=='_'||(a[i]>='a'&&a[i]<='z')||(a[i]>='A'&&a[i]<='Z')||(a[i]>='0'&&a[i]<='9'))

{

flag=1;

}

if(flag==0)

{

printf("no\n");

m=1;

break;

}

}

if(m==0)

printf("yes\n");

}

else

printf("no\n");

}

return 0;

}

J - 叠筐

模拟题,每个人的答案可能不一样,代码仅供参考

这种题一般就是看图找规律+模拟

#include

#include

char e[85][85];

char op1[2],op2[2];

int main()

{

int n,T=0;

while(~scanf("%d %s %s",&n,op1,op2))

{

if(T)puts("");

if(n==1)

{

printf("%c\n",op1[0]);

continue;

}

char x,a=op1[0],b=op2[0];

int tmp=1;

if(((n+1)/2)%2==1)

{

char c=a;

a=b;

b=c;

}

while(tmp<=(n+1)/2)

{

int m=n-tmp+1;

if (tmp%2==1)x=b;

else x=a;

for(int i=tmp; i<=m; i++)

{

e[tmp][i]=x;

e[m][i]=x;

e[i][tmp]=x;

e[i][m]=x;

}

tmp++;

}

e[1][1]=e[n][n]=e[1][n]=e[n][1]=' ';

for(int i=1; i<=n; i++)

{

for(int j=1; j<=n; j++)

printf("%c",e[i][j]);

puts("");

}

T++;

}

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值