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