大计基编程题(第十周)

第一题

叛逆期的小明什么都喜欢反着做,连看数字也是如此(负号除外),比如:

小明会把1234它看成4321;把-1234看成-4321;把230看成032 (032=32);把-230看成-032(-032=-32)。
现在,小明做了一些a+b和a-b的题目(a, b为整数且不含前导0),如果给你这些题目正确的答案,你能猜出小明会做得到什么答案吗?
输入:

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

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

题解

#include<stdio.h>
#include<math.h>

void how(int x, int y);//定义函数how()原型
int main()
{
	int x, y;
	scanf_s("%d%d", &x, &y);//输入x(a+b),y(a-b)
	how(x, y);
	return 0;
}
void how(int x, int y) {
	int x1 = x, y1 = y;
  /*先求出对应a,b值储存在x,y中*/
	x = (x1 + y1) / 2;
	y = (x1 - y1) / 2;
	int a[9];
	int b[9];
	int i = 0 ;
	int j = 0;
	int c = 0;
	int d = 0;
	while (x!=0)
	{
		a[i] = x % 10;
		(int) x /= 10;
		i++;
	}//将不同位数上的数保存
	int f = i-1;
	for ( f ; f >= 0; f--)
	{
		c += (a[f]*pow(10, (i-1) - f));
	}//取反
	
	while (y != 0)
	{
		b[j] = y % 10;
		(int) y /= 10;
		j++;
	}
	int g = j-1;
	for (g; g >=0; g--)
	{
		d += (b[g]*pow(10, (j-1) - g));
	}
	printf("%d %d", c + d, c - d);
}

第二题

Ackermann函数ack(m,n)采用以下递归式定义:
ack(0,n)=n+1
ack(m,0)=ack(m-1,1)
ack(m,n)=ack(m-1,ack(m,n-1))
其中,m>0,n>0
编写一个计算此函数的递归函数。
测试用例:
如输入:
1,1
则输出:
3

题解

直接按照题目意思来,没啥技巧

#include<stdio.h>
int ack(int m, int n)
{
	if (m == 0)
	{
		return n + 1;
	}
	else if (n == 0)
	{
		return ack(m - 1, 1);
	}
	else //if (m > 0 && n > 0)
	{
		return ack(m - 1, ack(m, n - 1));
	}
 
}
 
int main()
{
	int m,n ;
	scanf_s("%d,%d",&m,&n);  //题目中有逗号
	printf("%d", ack(m, n));
 
	return 0;
}

第三题

题目描述:

有一分数序列如下: 2/1, 3/2, 5/3, 8/5, 13/8, 21/13, … 即后一项的分母为前一项的分子,后项的分子为前一项分子与分母之和,求其前n项之和。

输入输出格式:
输入:项数n(整数)
输出:前n项之和(实数,注:保留4位小数)
样例
6
10.0071

题解

#include<stdio.h>
int main() {
	int n;
	scanf_s("%d", &n);
	double mole = 2.0, deno = 1.0;
	double sumn = 0.0;
	for (int i = 0; i < n; i++)
	{

		sumn += (mole / deno);
		double m = mole;
		mole = m + deno;//分子为前一项分子与分母之和
		deno = m;//分母为前一项的分子
	}
	printf("%g", sumn);//注意这里要用%g,不然用例可能没办法通过,问就是系统要求
}

第四题

题目描述:

定义包含5个英文单词的字符数组(即二维字符数组),键盘输入5个单词,按字典顺序寻找最大和最小单词并输出。

输入输出格式:
输入:5个单词

输出:最大和最小单词(按字典序)

样例:

输入:

monday

tuesday

thursday

friday

Januar

输出:

max:tuesday

min:friday

题解

#include<stdio.h>
#include<string.h>
int main()
{
 char ch[5][10];//储存五个单词
 char min[10],max[10];//声明长度最大最小的单词
 int i;
 for(i=0;i<5;i++)
 {
  gets(ch[i]);
 }
  
 strcpy(min,ch[0]);
 strcpy(max,ch[0]);
 for(i=1;i<5;i++)
 {
  if(strcmp(max,ch[i])<=0)//strcmp(s1, s2);如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回小于 0;如果 s1>s2 则返回大于 0。
  {
   strcpy(max,ch[i]);
    
  }
  else if(strcmp(min,ch[i])>0)
  {
   strcpy(min,ch[i]);
  }
 }
 printf("max:%s\nmin:%s\n",max,min);
  
 }

第五题

题目描述:

编写一个求数组中最小值元素及该元素位置的函数,并编写主函数调用。要求:由键盘输入10个数,并存放于整型数组中。

提示:需要定义含整型数组,最小元素值和该元素位置的结构体变量。以保证函数能同时返回最小元素值和该元素位置两个变量。

输入输出格式:

**输入:**用户输入的10个数

**输出:**第一个数字为数组中的最小元素值 第二个数字为该元素在数组中的下标位置(两个数用空格分开)

题解

#include<stdio.h>
struct MyStruct//定义结构体储存i和MIN
{
	int min;
	int i;
};
struct MyStruct where(int a[10]);
int main() {
	
	int b[10];
	for (size_t i = 0; i < 10; i++)
	{
		scanf_s("%d", &b[i]);
	}
	struct MyStruct tol = where(b);
	printf("%d %d", tol.min, tol.i);
	return 0;
}
struct MyStruct where(const int *a) {
	struct MyStruct tol;
	tol.min = a[0];
	tol.i = 0;
	for (size_t i = 0; i < 10; i++)//遍历储存最小值及其对应的i
	{
		if (tol.min > a[i]) {
			tol.min = a[i];
			tol.i = i;
		}
	}
	return tol;
}

第六题

编写函数,函数原型如下:

void fun(int n,char res[]);

函数功能是将整数n的各位数字逆序排列,存放到res字符数组中。

例如整数1035,逆序后为5301

程序测试举例,如输入:

9680200

则输出:

0020869

题解

#include<stdio.h>
void fun(int n, char res[]);
int main() {
	int n;
	char res[10];
	scanf_s("%d", &n);
	fun(n, res);
}
void fun(int n, char res[]){
	int i = 0;
	int c = 0;
	int a[100];
	while (n != 0)
	{
		a[i] = n % 10;
		(int)n /= 10;
		i++;
	}//将不同位数上的数保存
    int f = i - 1;
	for (f; f >= 0; f--)
	{
		res[f]=a[f]+'0';
	}//保存到res中
	for (size_t j = 0; j <i ; j++)
	{
		printf("%c", res[j]);
	}//输出
}

第七题

编写进制转换函数,函数原型如下:

void dtoboh(int n,int t,char res[]);
功能是将十进制整数n(n>=0)转换为t进制数(即2、8及16进制),结果存放在res字符数组中。
并编写测试用的主函数。

如输入:

248,2

则输出:

11111000

如输入:

248,8

则输出:

370

如输入:

248,16

则输出:

F8

题解

#include<stdio.h>
void dtoboh(int n, int t, char res[])
{
    int i;
    if (t < 10)  //转换进制为十以下
    {
        for (i = 0; n != 0; i++)
        {
            res[i] = n % t + '0', n = n / t;
        }
    }
    else   //转换进制为十以上
    {
        for (i = 0; n != 0; i++, n = n / t)
        {
            if (n % t < 10)
                res[i] = n % t + '0';
            else
                res[i] = n % t + 'A' - 10;  //由于10代表A,故先减去10,然后加A
        }
    }
    res[i++] = '!';  //用于下方主函数来判断是否结束输出
}
int main()
{
    int a, b, i;
    char res[100];
    scanf_s("%d,%d", &a, &b);
    if (a == 0) {
        printf("0");
        return 0;
    }
    dtoboh(a, b, res);
    for (i = 0; res[i] != '!'; i++)
        ;
    for (i--; i >= 0; i--)
        printf("%c", res[i]);   //倒序输出
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_45738090/article/details/105676965