XJTU大计基例题分享(第11周)

文章涉及多个编程问题,包括数组元素的循环右移、递归计算ack函数、求最大公约数、多项式值计算、数字转换为字母、查找共同元素、等值数列识别、电梯运行时间计算以及数字反向操作。
摘要由CSDN通过智能技术生成

个人水平有限,只是分享自己的想法和思路,希望大家多批评指正

1.

设数组A中存有n(n>0)个整数,在不允许使用另外数组的前提下,将A中的每个整数循环右移m(m>=0)个位置。即:将A中的数据由(A0A1……An-1)变换为(An-m…… An-1A0A1……An-m-1)。

要求:输入n ( 1<=n<=100)、m(m>=0)及n个整数,输出循环右移m位以后的整数序列。

输入:占二行,其中

第1行:n和m两个数,n和m之间用空格分隔。

第2行:数组A中的n个数,各数之间用空格分隔(第一个数之前和最后一个数之后无空格)。

输出:占一行,数据间用一个空格分隔(第一个数之前和最后一个数之后无空格)。

样例:

10 5

1 2 3 4 5 6 7 8 9 0

6 7 8 9 0 1 2 3 4 5

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main()
{
	int n, m;
	do 
	{
		scanf("%d %d", &n, &m);
	} while (n < 1 || n>100 || m < 0);
	int A[100];
	for (int k = 0; k < n; k++)//循环输入
	{
		scanf("%d", &A[k]);
	}
	for (int i = 0; i < m; i++)//循环向前移动m次,一次移动一格
	{
		for (int t = 0; t < n-1; t++)//内循环每个元素向前移动一格
			//特别注意由于第n个元素在其他元素前移时在temp中被后移
			//所以只需循环n-1次
		{
			int temp;
			if (t == 0)//第一个元素前移到末尾
			{
				temp = A[n - 1];
				A[n - 1] = A[t];
				A[t] = temp;
			}
			else
			{
				temp = A[t - 1];
				A[t - 1] = A[t];
				A[t] = temp;
			}
		}
	}
	for (int j = 0; j < n; j++)//循环输出
	{
		if (j == 0)
			printf("%d", A[j]);
		else
		{
			printf(" %d", A[j]);
		}
	}
	

	return 0;
}

2.

编程计算函数ack(m,n)的值。m,n的定义域是非负整数(m<=3,n<=9)。

当m=0时,ack(0,n)=n+1

当n=0时,ack(m,0)=ack(m-1,1)

其它情况下,ack(m,n)=ack(m-1,ack(m,n-1))

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int ack(int m, int n);//函数名出现,因为c独特执行顺序而导致的格式

int main()
{
	int m, n;
	do
	{
		scanf("%d %d", &m, &n);
	} while (m < 0 || m>3 || n < 0 || n>9);//输入mn,循环目的是确保mn的取值范围
	int ans = ack(m, n);
	printf("ack(%d,%d)=%d\n", m, n, ans);
	return 0;
}
int ack(int m, int n)//按照题设定义函数
{
	int ans;
	if (m == 0)
		ans = n + 1;
	else if (n == 0)
		ans = ack(m - 1, 1);
	else
		ans = ack(m - 1, ack(m, n - 1));//函数内也可嵌套函数自身
	return ans;
}

3.求n个数

入:n个正整数,以0作为数的结束。用空格隔开。

输出:最大公约数和这n个数,用一个空格隔开。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int fun(int ans, int b);

int main()
{
	int a[50], i = 0;
	do
	{
		scanf("%d", &a[i]);
		i++;
	} while (a[i - 1] != 0);
	int ans=a[0];
	for (int t = 0; t < i - 1; t++)
	{
		ans = fun(ans, a[t]);
	}
	printf("%d", ans);
	for (int j = 0; j < i - 1; j++)
	{
		printf(" %d", a[j]);
	}
	return 0;
}
int fun(int ans, int b)//辗转相除法求公约数
{
	int temp, c;
	if (ans < b)
	{
		do
		{

			temp = ans;
			c = b % ans;
			if (c != 0)
			{
				ans = c;
			}
			b = temp;
		} while (c != 0);
	}
	else if (ans > b)
	{

		do
		{
			temp = b;
			c = ans % b;
			if (c != 0)
			{
				b = c;
			}
			ans = temp;
		} while (c != 0);
		ans = b;
	}
		
	return ans;
}

4.

编写程序,计算下列多项式的值:

poly(n,x)=1, 当 n=0;

poly(n,x)=x, 当 n=1;

poly(n,x)=((2*n-1)*x* poly(n-1,x)-(n-1)* poly(n-2,x))/n, 当 n>1;

输入:n和x,格式:"%d%lf"。(n<20)

    输出:第n个多项式在x处的值,格式:"%lf\n"。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>



double poly(int n, double x)
{
	if (n == 0)
		return 1;
	if (n == 1)
		return x;
	if (n > 1)
		return ((2 * n - 1) * x * poly(n - 1, x) - (n - 1) * poly(n - 2, x)) / n;
}
int main()
{
	int n; double x;
	scanf("%d%lf", &n, &x);
	printf("%lf\n", poly(n, x));
	return 0;
}

 5.

将数字替换为字母。输入一个整数,将它除以2;再将除以2后所得数字的整数部分的各位用相应序号的字母替代。替换原则:0换为a,1换为b,2换为c,...,以此类推,9换为j。

例如,1234,除以2等于617,替换结果为gbh

输入:一个正整数

输出:除2后的整数部分和字符串,中间用一个空格隔开。

样例:1234

617 gbh

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main()
{
	int num;
	scanf("%d", &num);
	int num0 = num / 2;
	printf("%d ", num0);
	int len=0;
	int num2 = num0;
	do//求len长度
	{
		num2 = num2 / 10;
		len++;
	} while (num2 != 0);
	int num3[200];
	for (int i = len-1; i >=0; i--)//按位储存进数组
	{
		num3[i] = num0 % 10;
		num0 = num0 / 10;
	}
	char arry[200];
	for (int i = len-1; i>=0; i--)//数字转化为字符
	{
		arry[i] = 'a' + num3[i];
	}
	for (int i = 0; i < len; i++)
	{
		printf("%c", arry[i]);
	}
	return 0;
}

6.

定义最大下标为50的整型数组a和b,编程实现:查找同时在数组a和数组b中的全部元素。

首先输入数组a的元素个数,再输入数组a每个元素的值;接着输入数组b的元素个数,再输入数组b中各元素的值。输出同时在两个数组的全部元素,各元素间用空格隔开(第1个元素前和最后1个元素后无空格)。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main()
{
	int a[51], b[51];
	int e, f;
	scanf("%d", &e);
	for (int i = 0; i < e; i++)
	{
		scanf("%d", &a[i]);
	}
	scanf("%d", &f);
	for (int i = 0; i < f; i++)
	{
		scanf("%d", &b[i]);
	}
	int c[51]; int j = 0;//c储存共有元素
	for (int i = 0; i < e; i++)
	{
		
		for (int t = 0; t < f; t++)
		{
			if (a[i] == b[t])
			{
				c[j] = a[i];
				j++;
			}

		}
	}
	int g[51], G=0;
	for (int i = 0; i < j; i++)
	{
		int k = 0;
		for (int t =i-1; t>=0; t--)
		{
			if (c[i] == c[t])
				k++;
		}
		if (k == 0)//剔除多次出现的元素
		{
			g[G] = c[i];
			G++;
		}
	}
	int i = 0;
	while(i!=G-1)
	{
		printf("%d ", g[i]);
		i++;
	} 
	printf("%d\n", g[G-1]);
	return 0;
}

7.

如果一个数列中某一段(至少有两个元素)的各元素值均相同,则称其为等值数列段。等值数列段中元素的个数叫做等值数列段的长度。

  输入: 分两行输入序列长度N和N个整数(其中1<=N<=50), N个整数的每个数之间以空格隔开。

  输出: 数组中长度最大的等值数列段的始末下标(0~N-1),用英文逗号分隔。如果没有等值数列段,则输出NO

  说明:

  如果有多个同等长度的等值数列,只输出第一个等值数列的起止下标。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main()
{
	int n, a[50];
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &a[i]);
	}
	int t = 0, pre = 0, j = 0;
	for (int i = 0; i < n; i =i+ t+1)//比较等值数列段元素个数
	{
		
		t = 0;
		for (int k = i + 1; a[k]==a[i]; k++)
		{
			t++;
		}
		if (t > j)
		{
			pre = i;//保留较大等值段起始下标
			j = t;//较大等值段元素个数
		}
	}
	if (j == 0)
	{
		printf("NO\n");
	}
	else {
		printf("%d,%d\n", pre, pre + j);
	}
	
	return 0;
}

8.

一个球从100米高度自由落下,每次落地后反弹回原高度的一半,再落下,再反弹。求其到第n次落地(不考虑第n次反弹),共经过了多少米?第n次反弹高度是多少米?

输入:n值。n为整数,取值范围:0<n<=20

输出:分2行输出。第一行为小球到第n次落地经历的路程长度,第二行为小球第n次反弹的高度。长度值和高度值均为实数。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main()
{
	int n;
	do
	{
		scanf("%d", &n);
	} while (n <= 0 || n > 20);
	double s=0, h=0;
	double H = 100;
	for (int i = 0; i < n; i++)
	{
		if (i == 0)
		{
			s = s + H;
		}
		else
		{
			s = s + 2 * H;
		}
		h = H / 2;
		H = h;
	}
	printf("%llf\n", s);
	printf("%llf\n", h);
	return 0;
}

9.

某城市最高的楼有一部电梯,该电梯依照输入楼层数的先后次序运行。电梯最初在0层。运行完一个输入序列后就停止在该楼层,不返回0层。编写程序计算电梯运行一个序列的时间。电梯每上1层需要6秒。每下1层需要4秒。如在某层停留,无论上下人多少,均停留5秒。楼层值大于等于1,小于100 , 0在序列中表示结束序列输入。

输入:电梯运行序列(即:需要停靠的各楼层),用1个空格分隔,以0表示结束;

输出:电梯运行时间(秒)。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main()
{
	int f[100];
	int n = 0;
	do
	{
		scanf("%d", &f[n]);
		n++;
	} while (f[n - 1] != 0);
	int time;
	time = (n-1) * 5 + f[0] * 6;//所有停止时间与上第一个楼层时间
	for (int i = 1; i < n-1; i++)
	{
		if (f[i] > f[i - 1])
		{
			time = time + (f[i] - f[i - 1]) * 6;//上楼
		}
		else
		{
			time = time + (f[i - 1] - f[i]) * 4;//下楼
		}
	}
	printf("%d\n", time);
	return 0;
}

10.

叛逆期的小明什么都喜欢反着做,连看数字也是如此(负号除外),比如:小明会把1234它看成4321;把-1234看成-4321;把230看成032 (032=32);把-230看成-032(-032=-32)。现在,小明做了一些a+b和a-b的题目(a, b为整数且不含前导0),如果给你这些题目的正确答案,你能猜出小明会得到什么答案吗?

输入:

两个整数x,y(-100000 < = x, y < =100000), x表示a+b的正确答案,y表示a-b的正确答案。输入保证合法,且不需考虑a或b是小数的情况。

输出:

输出两个整数s和t,两数之间用1个空格分开。其中:s表示小明将得到的a+b答案,t表示小明将得到的a-b答案。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
int main()
{
	int x, y, a, b, s, t;
	scanf("%d%d", &x, &y);
	a = (x + y) / 2;//正确的ab
	b = x - a;
	int a1[6], b1[6];
	
	int ia=0;
	for (ia ; a != 0; ia++)//按位储存入数组
	{
		a1[ia] = a % 10;
		a = a / 10;
	}
	
	int ib = 0;
	for (ib; b != 0; ib++)
	{
		b1[ib] = b % 10;
		b = b / 10;
	}
	int ma, mb; ma = mb = 0; int la, lb;
	la = ia - 1; lb = ib - 1;
	for (ia; ia > 0; ia--)//小明脑子里的ab
	{
		if (ia-1>= 0)
		{
			ma = ma + a1[ia - 1] * pow(10, (la - (ia - 1)));
		}
		else
		{
			ma = ma + a1[ia - 1];
		}

	}
	for (ib; ib > 0; ib--)
	{
		if (ib-1 >= 0)
		{
			mb = mb + b1[ib - 1] * pow(10, (lb - (ib - 1)));
		}
		else
		{
			mb = mb + b1[ib - 1];
		}
	}
	
	s = ma + mb;
	t = ma - mb;
	printf("%d %d\n", s, t);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值