湘潭大学 2023年下学期《C语言》作业0x04-循环2 XTU OJ 1182,1149,1213,1277,1343

第一题

#include

int main()
{
	int t;
	scanf("%d",&t);
	
	while(t--)
	{
		double month[20];
		for(int i=0;i<12;i++)	scanf("%lf",&month[i]);
		double ans=1;
		for(int i=0;i<12;i++)	ans=(month[i]/100+1)*ans;
		
		ans*=100;
		ans-=100;
		
		printf("%.3lf\n",ans);
	}
	
	return 0;
}

注意题目输入的是带百分号的数字,输入1表示的是0.01,另外输出的答案也是输出带百分号的答案,注意还要减去原来的大小才是计算的利率,合理使用双精度变量非常方便

第二题

#include
#include

#define N 100010
bool state[N];

int main()
{
	int a,c,m;
	while(~scanf("%d%d%d",&a,&c,&m))
	{
		for(int i=0;i

注意标记状态,把0~m-1这些数字初始状态都标记为false,然后使用循环,如果可以生成某数字,就把该数字的状态标记为true,之后遍历0~m-1数字的状态,如果存在数字的状态仍然是false,说明该数字不能使用所给方程生成出来,输出No,反之输出Yes 

第三题

#include

int gcd(int a,int b)	
{
	return b>0?gcd(b,a%b):a;
}

int main()
{
	int t;
	scanf("%d",&t);
	
	while(t--)
	{
		int n,m;
		scanf("%d%d",&n,&m);
		int total_down=n*(n-1)*(n-2)/6;
		int total_up=m*(m-1)*(m-2)/6;
		
		int u=gcd(total_down,total_up);
		total_down/=u;
		total_up/=u;
		
		if(n==m)	printf("1\n");
		else if(m<3)	printf("0\n");
		else	printf("%d/%d\n",total_up,total_down);
	}
	
	return 0;
}

题目有点绕,主要考查的是最大公约数模板:最大公约数模板 

有一些简单的排列组合的知识,从n个元素里面选择3个,有多少种情况(total_down),从m个元素里面选择3个,有多少种情况(total_up),然后分情况讨论一下

第四题

#include

int main()
{
	char c[2];
	while(~scanf("%s",c))
	{
		int length=c[0]-'A';
		for(int i=0;i<=length;i++)
		{
			int j,k,m;
			for(j=0;j<=length*2-i;j++)	printf(" ");
			for(k=0;k<=i;k++)	printf("%c",'A'+k);
			for(m=k-2;m>=0;m--)	printf("%c",'A'+m);
			printf("\n");
		}
		
		for(int i=0;i<=length;i++)
		{
			int l,h,g;
			for(l=0;l<=length-i-1;l++)	printf(" ");
			for(h=0;h<=i;h++)	printf("%c",'A'+h);
			for(g=h-2;g>=0;g--)	printf("%c",'A'+g);
			
			int q,w,e;
			for(q=0;q<=length*2-i*2;q++)	printf(" ");
			for(w=0;w<=i;w++)	printf("%c",'A'+w);
			for(e=w-2;e>=0;e--)	printf("%c",'A'+e);
			
			printf("\n");
		}
	}
	
	return 0;
}

是一个恐怖的模拟题目,我们输入的时候有换行,所以使用字符数组,字符串输入可以避免这个问题,数组的第一个元素就是我们输入的字符

可以分两个循环来实现,第一个循环是上面的三角形,第二个循环是下面的两个三角形,第二个循环里面先打印左边三角形,再打印右边三角形

循环变量的终点需要取什么数值,需要我们根据样例找规律找出来,建立各个循环变量之间的关系即可,可以一边写代码,一边测试打印结果是否符合预期效果

第五题

#include

int gcd(int a,int b)
{
	return b>0?gcd(b,a%b):a;
}

int main()
{
	int t;
	scanf("%d",&t);
	
	while(t--)
	{
		int n,k;
		scanf("%d%d",&n,&k);
		
		if(gcd(n,k+1)==1)	printf("Yes\n");
		else	printf("No\n");
	}
	
	return 0;
}

注意k是中间间隔的青蛙数目,不是两只青蛙之间的距离,比如说第一个样例,从1到3,中间间隔的不是2那只青蛙,间隔的是4,5两只青蛙,所以从1到3其实是只可以逆时针走的(刚开始看到题目我还以为是题目描述出错了) 

经过分析我们发现,k+1表示的是每一次青蛙可以跳的单位数,涉及到一些数论知识,笔者也没有完全弄懂,(k+1)x=c%n,(k+1)x=ny+c, (k+1)x-ny=c,根据裴蜀定理,可以知道需要k+1和n互质

你可能感兴趣的:(湘大,XTU,OJ,c语言,算法,数据结构)