第十周作业记录
(。_。)
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才得原数。