第十周作业

设数组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


样例输入:

1 1
1

样例输出:

1
//时间来不及了,看答案后自己把答案写出来
#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>

int main()
{
	int n, m;//n 个数,移动m次
	scanf("%d %d", &n, &m);

	//读入数组
	int a[100];
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &a[i]);
	}
	//循环移动
	for (int i = 0; i < m; i++)
	{
		int x = a[n - 1];
		for (int j = n - 2; j >= 0; j--)
		{
			a[j + 1] = a[j];
		}
		a[0] = x;
	}
	//输出数组
	for (int i = 0; i < n; i++)
	{
		i == 0 ? printf("%d", a[i]) : printf(" %d", a[i]);
	}
	return 0;

}

编程计算函数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))


样例输入:

3 6

样例输出:

ack(3,6)=509
//函数的递归调用
#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
int ack(int m, int n);

int main()
{
	int m, n;
	scanf("%d%d", &m, &n);
	int s = ack(m, n);
	printf("ack(%d,%d)=%d",m,n, s );
	return 0;
}
int ack(int m, int n)
{
	int c = 0;
	if (m == 0) { c = n+1; }
	else if (n == 0) { c = ack(m - 1, 1); }
	else
	{
		c =  ack(m - 1, ack(m, n - 1));
	}
	return c;
}
/*
* 崔神的代码还是如此清新脱俗
 int Ack(int m, int n);

int main()
{
	int m, n;
	(void)scanf("%d%d", &m, &n);
	printf("ack(%d,%d)=%d\r\n", m, n, Ack(m, n));
	return 1;
}

int Ack(int m, int n)
{
	if (m == 0)
	{
		return n + 1;
	}
	if (n == 0)
	{
		return Ack(m - 1, 1);
	}
	return Ack(m - 1, Ack(m, n - 1));
}

*/

求n个数的最大公约数。其中:2<=n<50

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

输出:分两行显示。分别显示最大公约数和这n个数,n个数用1个空格隔开(第一个数前及最后一个数之后无空格)。

注:输入中,输入数的个数不确定,但最多不超过50,不小于2,最后的0是结束标志。输出中,第1行是它们的最大公约数,第2行是输入的n个数,中间用1个空格隔开。


样例输入:

4928 4160 6144  0

样例输出:

64
4928 4160 6144
#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>

int main()
{
	int a[50] = { 0 };
	//输入这n个数并记下其个数
	int n = 0;
	scanf("%d", &a[0]);
	while (a[n] != 0) { n++; scanf("%d", &a[n]); }

	//求最大公约数
	int gcd = a[0];
	int flag = 1;
	while (flag)
	{
		flag = 0;
		for (int i = 0; i < n; i++)
		{
			if (a[i] % gcd)
			{
				flag = 1;
				break;
			}
		}
		if (flag)//flag!=0时,说明gcd不是最大公约数,只能更小
		{
			gcd--;
		}
	}
	printf("%d\n", gcd);
	
	//输出数组
	for (int i = 0; i < n; i++)
	{
		i == 0 ? printf("%d", a[0]) : printf(" %d", a[i]);
	}
	return 0;
}

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

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"。


样例输入:

0 12.5

样例输出:

1.000000
//额滴神,保佑我考试抽到这样的题
#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
double poly(int n, double x);

int main()
{
	int n;
	double x;
	scanf(" %d%lf", &n, &x);
	printf("%lf\n", poly(n, x));
	return 0;

}
double poly(int n, double x)
{
	if (n == 0) { return 1; }
	else if (n == 1) { return x;}
	else { return ((2 * n - 1) * x * poly(n - 1, x) - (n - 1) * poly(n - 2, x)) / n; }
	
}

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

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

输入:一个正整数

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

样例:1234

617 gbh


样例输入:

2

样例输出:

1 b
//这几题都挺简单
#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>

int main()
{
	int n;
	scanf("%d", &n);
	int a = n / 2;
	printf("%d ", a);
	int b = (int)log10(a) + 1;
	int c = a,i=b-1;
	char str[200] = {0};
	while (c)
	{
		str[i] = 'a' + c % 10;
		c /= 10;
		i--;
	}
	printf("%s", str);


	return 0;
}

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

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


样例输入:

4
1 2 3 1
5
1 3 5 7 9

样例输出:

1 3
#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>

int main()
{
	int na;
	scanf("%d", &na);
	int a[50];
	for (int i = 0; i < na; i++)
	{
		scanf("%d", &a[i]);
	}

	int nb;
	scanf("%d", &nb);
	int b[50];
	for (int i = 0; i < nb; i++)
	{
		scanf("%d", &b[i]);
	}

	//查找共同元素,同时有些元素之前已经出现过,要排除掉
	//先找出共同元素
	int cut = 0;
	int c[200];
	for(int i=0;i<na;i++)
		for (int j = 0; j < nb; j++)
		{
			if (b[j] == a[i]) 
			{ 
				c[cut] = a[i]; cut++;
			}
     //输出即可,重复的就不输出了,下面做不到这个功能,以后再改吧
			printf("%d", c[0]);
			for (int i = 1; i < cut; i++)
			{
				int n = 0;
				for (int m = 0; m < i; m++)
				{
					if (c[m] != c[i])
					{
						n++;
					}
								}
				if (n == i) { printf(" %d", c[i]); }
			}

	return 0;
}

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

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

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

  说明:

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


样例输入:

7
3 1 2 1 1 2 2
#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>

int  main()
{
	int n;
	int a[100];
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &a[i]);
	}
//找等值数段
	int start=0;
	int end=0;
	int lenth = 0;
	int cstart, cend, clenth = 0;
	int i=0;
	while (i < n)
	{
		cstart = i; 
		cend = i + 1;
		while (a[cstart] == a[cend] && cend < n)
		{
			cend++;
		}
		if (cend - cstart > 1)
		{
			clenth = cend - cstart;
			if (clenth > lenth)
			{
				end = cend-1;
				start = cstart;
				lenth = cend - cstart;
			}
		}
		i = cend;
	}
	lenth == 0 ? printf("NO") : printf("%d,%d", start, end);

	
	return 0;
}

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

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

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


样例输入:

1

样例输出:

100.000000
50.000000
#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>

int main()
{
	int n;
	scanf("%d", &n);
	double s=0, x=100;
	for (int i = 1; i <= n; i++)
	{
		x = 0.5 * x;
		if (i == 1)
		{
			s = 100;
		}
		else { s = s + 4.0 * x; }
	}
	printf("%lf\n%lf", s, x);
	return 0;
}

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

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

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


样例输入:

2 1 0

样例输出:

26
#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
//依旧是个有问题的代码,以后再来修改了
/*
int main()
{
	int a[100] = {0};
	int i;
	for (i = 0;; i++)
	{
		scanf("%d", &a[i]);
		if (a[i] == 0) { break; }
	}
	int t=0;
	for (int m = 0; m < i ; m++)
	{
		if (m == 0) { t = 6 * a[0]; }
		if (a[m] > a[m + 1] && m + 1 <= i )
		{
			t = t + 4 * (a[m] - a[m+1]);
		}
		if (a[m] < a[m + 1]&& m+1<=i)
		{
			t = t + 6 * (a[m + 1] - a[m]);
		}
	}
	t =t+ 5 * i;
	printf("%d", t);
	return 0;
}*/

//正确代码如下
int main()
{
	int floor = 0, t=0;
	int nextfloor;
	scanf("&d", &nextfloor);
	while (nextfloor)
	{
		int a = nextfloor - floor;
		t = t + 5 + (a > 0 ? 6 * a : -4 * a);
	
		floor = nextfloor;
		scanf("%d", &nextfloor);
	}
	printf("%d", t);
	return 0;
}

叛逆期的小明什么都喜欢反着做,连看数字也是如此(负号除外),比如:小明会把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答案。


样例输入:

20 6

样例输出:

38 24
#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<math.h>
int fz(int x);

int main()
{
	int x, y;
	scanf("%d%d", &x, &y);
	int a = (x + y) / 2;
	int b = (x - y) / 2;
	printf("%d %d", fz(a) + fz(b), fz(a) - fz(b));
	return 0;
}
int fz(int n)
{
	if (n < 0)
	{
		n = -n;

		int m = n, s = 0, i;
		i = log10(n) + 1;
		while (m)
		{
			s += (m % 10) * (int)pow(10, i - 1);
			i--;
			m = m / 10;
		}
		return -s;
	}
	int m = n, s = 0, i;
	i = log10(n) + 1;
	while (m)
	{
		s += (m % 10) * (int)pow(10, i - 1);
		i--;
		m = m / 10;
	}
	return s;


}

  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值