1.
小明的加减法【用函数实现】
________________________________________
叛逆期的小明什么都喜欢反着做,连看数字也是如此(负号除外),比如:
小明会把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答案。
________________________________________
样例输入:
20 6
样例输出:
38 24
#include<stdio.h>
int resum(int a);//先声明函数,后面再定义;
int main()
{
int a, b, x, y, s, t;
scanf_s("%d %d", &x, &y);
a = resum((x + y) / 2);
b = resum((x - y) / 2);
s = a + b;
t = a - b;
printf("%d %d", s, t);
return 0;
}
int resum(int a)
{
int m;
int o = 0, i = 1;
if (a < 0)
{
a = -a;
i = -1;
}
while (a >= 1)//o从0开始,逐个接受a中的数,实现翻转;
{
m = a % 10;
a = a / 10;
o = o * 10 + m;
}
a = i * (o + a);//保持符号不改变;
}
2.
递归问题
________________________________________
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
________________________________________
样例输入:
3,2
样例输出:
29
#include<stdio.h>
int ack(int m, int n);
int main()
{
int m, n, A;
scanf_s("%d,%d", &m, &n);
A = ack(m, n);
printf("%d", A);
}
int ack(int m, int n)
{
if (m == 0)
return (n+1);//递归定义函数,m==0作为调节条件;
else if (n == 0)
return (ack(m - 1, 1));
else
return (ack(m - 1, ack(m, n - 1)));
}
3.
分数序列求和【选做】
________________________________________
题目描述:
有一分数序列如下: 2/1, 3/2, 5/3, 8/5, 13/8, 21/13, … 即后一项的分母为前一项的分子,后项的分子为前一项分子与分母之和,求其前n项之和。
输入输出格式:
输入:项数n(整数)
输出:前n项之和(实数,注:保留4位小数)
样例:
6
10.0071
________________________________________
样例输入:
6
样例输出:
10.0071
#include<stdio.h>
int main()
{
int n, i;
float a=2,b=1,c;//这里的a b c 也都要是浮点数,否则在计算过程中数值会折损;
float sum=0;
scanf_s("%d", &n);
for (i = 1; i <= n; i++)
{
sum = sum + a / b;
c = b;
b = a;
a = c + a;
}
printf("%.4f", sum);//输出四位小数
return 0;
}
4.
求单词的最大和最小
________________________________________
题目描述:
定义包含5个英文单词的字符数组(即二维字符数组),键盘输入5个单词,按字典顺序寻找最大和最小单词并输出。
________________________________________
样例输入:
this
is
a
book
end
样例输出:
max:this
min:a
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
char word[5][10];//定义一个五行十列的数组,表示5个单词(10个字母以内);
char min[10],max[10];
int i;
for(i=0;i<5;i++)
{
gets(word[i]);//用gets来赋值,可以无视空格;
}
strcpy(min,word[0]);//word[0]就表示word的第一行,即第一个函数;
strcpy(max,word[0]);
for(i=1;i<5;i++)
{
if(strcmp(max,word[i])<=0)//用strcmp函数来比较(引用<string.h>文件),直接将两个单词按词典顺序比较,>则输出正数,<则输出负数,完全相同输出0;
{
strcpy(max,word[i]);//把word[i]赋给max时,不可以直接用=,必须用strcpy函数;
}
else if(strcmp(min,word[i])>0)
{
strcpy(min,word[i]);
}
}
printf("max:%s\nmin:%s\n",max,min);
return 0;
}
5.
编写一个求数组中最小值元素及该元素位置的函数
________________________________________
题目描述:
编写一个求数组中最小值元素及该元素位置的函数,并编写主函数调用。要求:由键盘输入10个数,并存放于整型数组中。
提示:需要定义含整型数组,最小元素值和该元素位置的结构体变量。以保证函数能同时返回最小元素值和该元素位置两个变量。
输入输出格式:
输入:用户输入的10个数
输出:第一个数字为数组中的最小元素值 第二个数字为该元素在数组中的下标位置(两个数用空格分开)
样例:
________________________________________
样例输入:
11 22 33 4 5 66 7 8 9 10
样例输出:
4 3
/*没有采用函数!!!
不太会定义新的数组*/😥
#include<stdio.h>
#include<string.h>
int main()
{
int a[10];
for (int i = 0; i < 10; i++)
scanf_s("%d", &a[i]);
int min = a[0];
int num = 0;
for (int i = 1; i < 10; i++)
{
if (min >a[i])
{
min = a[i];
num = i;
}
}
printf("%d %d", min, num+1);
return 0;
}
6.
编写函数实现数字逆序排列
________________________________________
编写函数,函数原型如下:
void fun(int n,char res[]);
函数功能是将整数n的各位数字逆序排列,存放到res字符数组中。
例如整数1035,逆序后为5301
程序测试举例,如输入:
9680200
则输出:
0020869
________________________________________
样例输入:
123456
样例输出:
654321
#include<stdio.h>
void fun(int n, char res[]);//先声明fun函数,后面再进行定义;
int main()
{
int n;
char res[10] = "";
scanf_s("%d", &n);
fun(n,res);
printf("%s", res);//可以一次性打印
return 0;
}
void fun(int n, char res[])
{
for (int i = 0; i < 10; i++)
{
if (n/10== 0)//当n除以10等于0时,说明n此时是个位数,这个个位数还需要被res[i]接收;
{
res[i] = n+'0';//res[i]是字符串,而n是整数,采用+'0',使左右形式一致;
break;
}
else
{
res[i] = n % 10+'0';
n = n / 10;
}
}
}
7.
编写进制转换函数
________________________________________
编写进制转换函数,函数原型如下:
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
________________________________________
样例输入:
2018,2
样例输出:
11111100010
#include<stdio.h>
#include<string.h>
void dtoboh(int n, int t, char res[]);
int main()
{
int n, t,m;
char res[16] = "";
scanf_s("%d,%d", &n, &t);
dtoboh(n, t, res);
m = strlen(res)-1;//这里要减去1,否则结尾处的一个空格会被打印在最前面(but why?);
for(m;m>=0;m--)
printf("%c",res[m]);
return 0;
}
void dtoboh(int n, int t, char res[])
{
int i;
if (t <10)
{
for (i = 0;; i++)
{
if (n == 0)
{
break;
}
res[i] = n % t+'0';
n = n / t;
}
}
else
{
for (i = 0; ; i++, n = n / t)
{
if (n == 0)
{
break;
}
else if (n % t < 10)
res[i] = n % t + '0';//res[i]是一个字符!
else
res[i] = n % t- 10+'A'; //对于16进制,这里的方法是:res[i]是一个字符,'A'-10表示将这个数字转换为16进制的字母表示;
}
}
}
Q:
1.第七题无论如何都有一个试例不能通过😭😭
2.第七题为什么总是会有一个空格挡在在前面?为什么对strlen减去一就可以省区呢?😨🙁
3.第五题如何用函数方式解决?为什么我在做的时候总是说:“形参和实参 2 的类型不同”,应该如何定义和使用一个新的数组?