大计基作业记录(5)

第十周作业记录

(。_。)


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
*///采用两种方法
//方法一:把数组A分成两截,先输出后半截,在输出前半截
#include<stdio.h>
int main()
{
	int n, m, space = 0;
    scanf("%d %d", &n, &m);
	int A[100];
	for (int i = 0; i < n; i++)  scanf("%d", &A[i]);   //输入数组A
	for (int j = n - m; j <= n - 1; j++)   //输出后半截数组(后半截是经过循环移动到前边去的数)
	{
		if (space != 0)  printf(" ");
		printf("%d", A[j]);
		space++;
	}
	for (int k = 0; k < n - m; k++)
	{
		if (space != 0)  printf(" ");
		printf("%d", A[k]);   //输出前半截数组
		space++;
	}
	return 0;
}
/*方法二:移动m次,每次只移动一位,并且从最后一个数开始移动,可以减少储存变量
#include<stdio.h>
int main()
{
	int n, m, space = 0;
	scanf("%d %d", &n, &m);
	int A[100];
	for (int i = 0; i < n; i++)  scanf("%d", &A[i]);
	for (int count = 1; count <= m; count++)   //用count计数,移动m次,每次挪一位
	{
		int temp = A[n - 1];   //储存最后一位数
		for (int j = n - 1; j > 0; j--)  A[j] = A[j - 1];   //向前移动一位
		A[0] = temp;
	}
	for (int x = 0; x < n; x++)   //输出移动后的数组
	{
		if (space!= 0) printf(" ");
		printf("%d", A[x]);
		space++;
	}
}
*/

2.计算函数ack(m,n)的值

代码示例

/*编程计算函数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))
*/
#include<stdio.h>
int ack(int m, int n)
{
	int result;
	if (m == 0)  result= n+ 1;
	else if (n == 0) result=ack(m - 1, 1);
	else result=ack(m - 1, ack(m, n - 1));
	return result;
}
int main()
{
	int a, b;
	scanf("%d %d", &a, &b);
	printf("ack(%d,%d)=%d",a,b, ack(a, b));
	return 0;
}

3.最大公约数

代码示例

#include<stdio.h>
int gcd(int a, int b)   //辗转相除法求两个数的最大公约数
{
	int t;
	while (b != 0)
	{
		t = a % b;
		a = b;
		b = t;
	}
	return a;
}
int main()
{
	int p[50], t0,space=0;
	for (int i = 0; p[i - 1] != 0; i++)
		scanf("%d", &p[i]);   //输入
	t0 = p[0];   
	for (int j = 0; p[j + 2] != 0; j++)  t0 = gcd(t0, p[j + 1]);   //挨个找最大公约数,t0
	printf("%d\n", t0);    //输出
	for (int i = 0; p[i] != 0; i++)
	{
		if (space != 0)  printf(" ");
		printf("%d", p[i]);
		space++;
	}
	return 0;
}

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"。
 */
#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
*/
#include<stdio.h>
#include<stdlib.h>
int main()
{
	int x;
	char a[50];
	scanf("%d", &x);
	x = x / 2;
	itoa(x, a, 10);   //整数转字符串
	for (int i = 0; a[i] != '\0'; i++)  a[i] = 'a' + ((int)a[i]-48);   //加密,数字强制取整后的ascall码要减48
	printf("%d %s", x,a);
	return 0;
}

6.求数组交集

代码示例

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

首先输入数组a的元素个数,再输入数组a每个元素的值;接着输入数组b的元素个数,再输入数组b中各元素的值。输出同时在两个数组的全部元素,各元素间用空格隔开(第1个元素前和最后1个元素后无空格)。*/
#include<stdio.h>
int main()
{
	int a[50], b[50], m, n, space = 0;
	//输入
	scanf("%d", &m);
	for (int i = 0; i < m; i++) scanf("%d", &a[i]);
	scanf("%d", &n);
	for (int j = 0; j < n; j++)  scanf("%d",&b[j]);
	//用两个循环寻找交集
	for (int i = 0; i < m; i++)
	{   //排除之前已经找过的数
		int rep = 0;
		for (int x = i - 1; x >= 0; x--)
			if (a[i] == a[x]) rep = -1;
		if (rep == -1) break;
		for (int j = 0; j < n; j++)
		{
			if (a[i] == b[j])
			{
				if (space != 0) printf(" ");
				printf("%d", a[i]);
				space++;
				break;
			}
		}
	}
	return 0;
}

7.输出数组中长度最大的等值数列段的始末下标

代码示例

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

  输入: 分两行输入序列长度N和N个整数(其中1<=N<=50), N个整数的每个数之间以空格隔开。
  输出: 数组中长度最大的等值数列段的始末下标(0~N-1),用英文逗号分隔。如果没有等值数列段,则输出NO

  说明:
  如果有多个同等长度的等值数列,只输出第一个等值数列的起止下标。
*/
#include<stdio.h>
int main()
{
	int n, a[50], sub = 0, count = 1, countm = 0, cm,judge=0,j;
	scanf ( "%d", &n);
	for (int i = 0; i < n; i++)  scanf("%d", &a[i]);
	cm = a[0];
	for (j = 1; j < n; j++)  //从第二个数开始扫描
	{
		if (a[j] == a[j - 1])  count++;
		if (a[j] != a[j - 1])   //比较前面记的数和最大数
		{
			if (count > countm)   //若大于最大数,则修改最大数
			{
				countm = count;
				cm = a[j - 1];
				sub = j - count;
			}
			//别忘了初始化数据,记录下一个数
			count = 1;
		}
	}
	//别忘了最后一个数没有参与比较
	if (count > countm) 
	{
		countm = count;
		cm = a[j - 1];
		sub = j - count;
	}
	if (countm > 1) printf("%d,%d", sub, sub + countm - 1);
	if (countm == 1) printf("NO");
	return 0;
}

8.求小球第n次落地的距离和反弹高度

代码示例

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

输入:n值。n为整数,取值范围:0<n<=20
输出:分2行输出。第一行为小球到第n次落地经历的路程长度,第二行为小球第n次反弹的高度。长度值和高度值均为实数。
*/
#include<stdio.h>
#include<math.h>
double len(int t)   //第t次落地经历长度的函数
{
	double result1=0;
	for (int i = 0; i <= t - 1; i++)  result1 = result1 + 100 / pow(2, i);   //注意这里的式子写法
	result1 =2*result1-100;
	return result1;
}
double high(int m)  //第m次反弹高度
{
	return 100 / (pow(2, m));
}
int main()
{
	int n;
	scanf("%d", &n);
	printf("%lf\n%lf", len(n), high(n));
	return 0;
}

9.电梯运行时间计算

代码示例

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

输入:电梯运行序列(即:需要停靠的各楼层),用1个空格分隔,以0表示结束;
输出:电梯运行时间(秒)。
*/
#include<stdio.h>
int main()
{
	int floor[50], t = 0,move;
	floor[0] = 0;   //这里仅仅是为了让下面输入数列好判断何时停止输入而赋给floor[0]一个非0值
	for (int i = 1; i == 1 ? i : floor[i - 1] != 0; i++) scanf("%d", &floor[i]);
	for (int j = 1; floor[j] != 0; j++)
	{
		if (floor[j] > floor[j - 1]) {
			t = t + 6 * (floor[j] - floor[j - 1])+5;   //电梯上
			move = 1;
		}
		if (floor[j] < floor[j - 1]) {
			t = t + 4 * (floor[j - 1] - floor[j])+5;   //电梯下
			move = 1;
		}
		if (floor[j] == floor[j - 1] && move == 1)
		{
			t += 5;   //若电梯超过两次不动,也只加5秒,不再多加
			move = 0;
		}
	}
	 //最后一次不停
	printf("%d", t);
}

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答案。
*/
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
int xiaoming(int x)   //定义一个反转数字的函数
{
	char y[7];
	int x1;
	itoa(abs(x), y, 10);   //整形转字符串
	strrev(y);   //反转字符串
	x1 = atoi(y);   //字符串转整形
	if (x >= 0) return x1;
	else return -x1;
}
int main()
{
	int x,y,a,b;
	scanf("%d %d", &x, &y);
	a = (x + y) / 2;
	b = (x - y) / 2;
	a = xiaoming(a);
	b = xiaoming(b);
	printf("%d %d", a + b, a - b);
	return 0;
}

总结

1.辗转相除法求最大公约数的代码(牢记)
2.数字字符用(int)强制转换的是ASCII码,要再减48才得原数。
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值