目录
请按下列要求编写程序:(三个函数均在一个C语言源程序)
有一个四位整数,它的9倍恰好是其反序数(反序数例:1234与4321互为反序数)。
有3个非零十进制数字,用它们可以组合出6个不同的三位数,这些三位数的和是2886。如果将这3个数字按从大到小和从小到大的顺序依次排列成两个三位数,它们的差是396。
目的是找到一个三位数组合,这个组合满足两个条件:
用一组整数验证命题:“任意一个百位数字与个位数字不同的三位正整数n1在经过以下操作后一定会变换到1089:将n1的百位数字与个位数字交换得到n2;求n1与n2差的绝对值得到n3;将n3的百位数字与个位数字交换得到n4;求n3与n4的和得到n5,n5一定是1089。若n1、n3是一位数或两位数,则在高位补0使其成为三位数。”
(改错题)给定函数fun的功能是:用递归算法计算斐波那契数列中第n项的值。从第1项起,斐波那契数列为:1、1、2、3、5、8、13、21、……。
输入测试数据:6
程序运行结果:8
问题解释与修正
请按下列要求编写程序:(三个函数均在一个C语言源程序)
【要求】
1)编写函数int add(int a,int b),其功能是求出a和b的和并返回。
2)编写函数int sub(int a,int b),其功能是求出a和b的差并返回。
3)编写主函数,输入x,y,然后分别调用add函数、sub函数求出x和y的和、差并输出。
输入测试数据:40 30
程序运行结果:40+30=70
40-30=10这行代码引入了标准输入输出库,使得程序可以使用
printf
和scanf
等函数。
#include <stdio.h>
int add(int a, int b) {return a + b;
}
int sub(int a, int b) {return a - b;
}
int main() {int x, y;printf("请输入两个整数 x 和 y:");scanf("%d %d", &x, &y);int sum = add(x, y);printf("x 和 y 的和为:%d\n", sum);int difference = sub(x, y);printf("x 和 y 的差为:%d\n", difference);return 0;
}
加法函数
int add(int a, int b) {
return a + b;
}
这是一个名为
add
的函数,它接收两个整数参数a
和b
,并返回它们的和。减法函数
int sub(int a, int b) {
return a - b;
}
这是一个名为
sub
的函数,它接收两个整数参数a
和b
,并返回它们的差(即a
减去b
)。主函数
int main() {
...
return 0;
}
主函数是C程序的入口点。当程序运行时,它首先执行
main
函数中的代码。变量声明
int x, y;
在主函数中,我们声明了两个整数变量
x
和y
,用于存储用户输入的两个整数。接收用户输入
printf("请输入两个整数 x 和 y:");
scanf("%d %d", &x, &y);
使用
printf
函数,我们向用户显示一个提示消息,告诉他们应该输入两个整数。然后,使用scanf
函数,我们读取用户输入的两个整数,并将它们存储在变量x
和y
中。计算和与差
int sum = add(x, y);
printf("x 和 y 的和为:%d\n", sum);
int difference = sub(x, y);
printf("x 和 y 的差为:%d\n", difference);
首先,我们调用
add
函数来计算x
和y
的和,并将结果存储在变量sum
中。然后,我们使用printf
函数将结果打印到屏幕上。接着,我们调用
sub
函数来计算x
和y
的差,并将结果存储在变量difference
中。然后,我们再次使用printf
函数将结果打印到屏幕上。
主函数最后返回0,表示程序成功执行。在C语言中,main
函数返回0通常表示程序正常结束,而非零值表示发生了某种错误。允许用户输入两个整数,并计算这两个整数的和与差,然后将结果打印到屏幕上。
第二个
有一个四位整数,它的9倍恰好是其反序数(反序数例:1234与4321互为反序数)。
【要求】
1)编写函数首部为int find(int n)的子函数,其功能是判断整数n的9倍是否为n的反序数,若是则函数返回这个反序数,否则返回0(用if语句)。
2)编写主函数,穷举(用循环)所有的四位数并调用函数find,找出满足上述条件的四位数,将找到的数及其反序数输出。
程序运行结果:1089--> 9801
#include <stdio.h> int find(int n){int reverse = 0;int original = n;while (n != 0) {reverse = reverse * 10 + n % 10;n /= 10;}if (9 * original == reverse) {return reverse;} else{return 0;} }int main() {printf("其中满足条件的四位数及其反序数为:\n");int i;for (i = 1000; i <= 9999; i++) {int result = find(i);if (result != 0) {printf("%d 和 %d\n", i, result);}}return 0; }
用于找出所有满足以下条件的四位数:其数字的反序数(即将数字翻转后得到的数)是原数的9倍。
逐步解释这个程序:
find 函数
int find(int n)
{
int reverse = 0;
int original = n;
// ...
}
此函数接受一个整数
n
作为参数,并试图找出其反序数。
- 使用
reverse
来保存反序数的值。- 使用
original
来保存原始数(因为n
在循环中会被修改)。在
while
循环中,程序通过取n
的个位数(n % 10
)并将其添加到reverse
的末尾(通过乘以10并加上新的个位数)来反转数字。然后,它更新n
以移除其最后一位。
reverse = reverse * 10 + n % 10; // 每次循环,将n的最后一位加到reverse的末尾
最后,函数检查反序数是否是原始数的9倍。如果是,则返回反序数;否则,返回0。
main 函数
int main()
{
// ...
for (i = 1000; i <= 9999; i++) {
int result = find(i);
if (result != 0) {
printf("%d 和 %d\n", i, result);
}
}
// ...
}
在
main
函数中,程序遍历从1000到9999的所有整数(即所有的四位数)。对于每个数,它调用find
函数来检查是否满足条件。如果find
函数返回非零值(即找到了一个满足条件的反序数),则打印该数和其反序数。总结:该程序会打印出所有满足条件的四位数及其反序数,其中反序数是原数的9倍。例如,数字
1089
满足这个条件,因为它的反序数是9801
,而9801
是1089
的9倍。
有3个非零十进制数字,用它们可以组合出6个不同的三位数,这些三位数的和是2886。如果将这3个数字按从大到小和从小到大的顺序依次排列成两个三位数,它们的差是396。
【要求】
1) 试编写函数首部为void func(int a[])的子函数,找出这三个数字,并存放在数组a中;
2) 在主函数中调用函数func,并将结果数组中每个元素的值输出
程序运行结果:2 5 6
#include <stdio.h>
main()
{int func(int a[3]);int i,a[3];func(a);for(i=0;i<3;i++)printf("%d ",a[i]);
}
int func(int a[3])
{int x,y,z;for (x=1;x<=9;x++)for(y=x+1;y<=9;y++)for(z=y+1;z<=9;z++)if((x+y+z)*222==2886&&((z*100+y*10+x)-(x*100+y*10+z)==396)){a[0]=x; a[1]=y; a[2]=z;}
}
目的是找到一个三位数组合,这个组合满足两个条件:
- 这三个数字(设为x, y, z)的和乘以222等于2886。
- 这三个数字组成的一个三位数(zxy)与另一个三位数(xyz)的差是396。
修改后的代码:
#include <stdio.h>
#include <math.h>
#define N 10
这里引入了
stdio.h
用于输入输出,但实际上math.h
并没有在程序中用到。#define N 10
定义了一个宏,表示数组的大小。函数
fun
int fun(int a[], int b[], int n) {
...
}
这个函数接受三个参数:一个整数数组
a
,一个整数数组b
用于存储满足条件的元素的索引,以及一个整数n
表示数组a
的大小。
- 它遍历数组
a
中的每个元素。- 对于每个元素,如果它大于999,则跳过它(因为大于999的数字在反转和相减后不可能得到1089)。
- 如果元素小于或等于999,它首先反转该数字,然后计算原始数字与反转数字之间的差的绝对值,再反转这个差,最后将差的绝对值与反转的差相加。
- 如果这个和等于1089,那么该元素的索引就被存储在数组
b
中。- 函数返回满足条件的元素的数量。
- 主函数
main
void main() {
...
}
- 它定义了两个整数数组
a
和b
,以及一个整数n
。- 数组
a
被初始化为10个整数。- 调用
fun
函数,将数组a
、b
和N
作为参数传递,并将返回值存储在n
中。- 使用一个循环遍历数组
b
的前n
个元素,并使用这些索引从数组a
中打印出相应的元素。
用一组整数验证命题:“任意一个百位数字与个位数字不同的三位正整数n1在经过以下操作后一定会变换到1089:将n1的百位数字与个位数字交换得到n2;求n1与n2差的绝对值得到n3;将n3的百位数字与个位数字交换得到n4;求n3与n4的和得到n5,n5一定是1089。若n1、n3是一位数或两位数,则在高位补0使其成为三位数。”
例如:n1:123,n2:321,n3:198(321-123),n4:891,n5:1089(198+891)
【要求】
(1)编写函数首部为int fun(int a[],int b[],int n)的子函数,其功能是用a指向数组的前n个整数验证上述命题,将所有符合命题的整数所在数组元素的下标依次保存到b指向的数组中,函数返回b数组中数据的个数。
(2)编写main函数,声明a数组并用测试数据初始化,用a数组作为实参调用fun函数,输出a数组中所有符合命题的整数。
输入测试数据:123 765 1 45 121 1345 131 67 696 3689
程序运行结果:123 765 1 45 67
#include <stdio.h> #include<math.h> #define N 10 int fun(int a[], int b[], int n) {int i,n1,n2,n3,n4,n5,s=0;for (i = 0; i < n; i++) {if (a[i]>999) continue;else {n1=a[i];n2 = (n1 % 10) * 100 + (n1 / 10 % 10) * 10 + (n1 / 100);n3 = fabs (n2 - n1);n4 = (n3 % 10) * 100 + (n3 / 10 % 10) * 10 + (n3 / 100);n5 = n3 + n4;if (n5 == 1089) {b[s] = i; s++; }}}return(s); }void main() {int a[N] = {123, 765, 1, 45, 121, 1345, 131, 67, 696, 3689};int i,n,b[N]; n=fun(a,b,N);for (i = 0; i < n; i++) {printf("%5d ", a[b[i]]);} }
(改错题)给定函数fun的功能是:用递归算法计算斐波那契数列中第n项的值。从第1项起,斐波那契数列为:1、1、2、3、5、8、13、21、……。
输入测试数据:6
程序运行结果:8
【要求】
- 将上述程序录入到文件115.c中,根据题目要求及程序中语句之间的逻辑关系对程序中的错误进行修改。
- 题中用“/******found******/”来提示在下一行有错。
- 改错时,可以修改语句中的一部分内容,调整语句次序,增加少量的声明或编译预处理命令,但不能增加其他语句,也不能删去整条语句。
【含有错误的源程序】:
#include <stdio.h>
long fun(int m)
{
/******found******/
switch(m);
{ case 0: return 0;
/******found******/
case 1; case 2 : return 1 ;
}
/******found******/
fun(m-1)+fun(m-2) ;
}
void main()
{ long fib;
int n;
scanf("%d",&n);
printf("n = %d\n",n);
fib=fun(n);
printf("fib = %d\n",fib);
}
#include <stdio.h>
long fun(int m)
{switch(m) /******found******/{ case 0: return 0;/******found******/case 1: case 2: return 1 ; }return fun(m-1) + fun(m-2) ; /******found******/
}
void main()
{ long fib; int n;scanf("%d",&n);printf("n = %d\n",n);fib = fun(n);printf("fib = %ld\n",fib); /******found******/
}
试图实现一个计算斐波那契数列(Fibonacci sequence)的函数,但是有几个问题需要修正。斐波那契数列是这样一个数列:0, 1, 1, 2, 3, 5, 8, 13, ...,其中每个数字(从第三个开始)都是前两个数字的和。
问题解释与修正
switch语句中的case 1和case 2
case 1: case 2: return 1;
这行代码意味着当m
为1或2时,函数都返回1。这是正确的,因为斐波那契数列的第1项和第2项都是1。递归终止条件
尽管switch
语句已经处理了m
为0、1和2的情况,但是代码中没有直接退出递归的逻辑。如果m
大于2,则switch
语句结束后,会执行return fun(m-1) + fun(m-2);
进行递归调用。这是正确的逻辑。
main
函数的返回类型
在C语言中,main
函数的返回类型应该是int
,而不是void
。因此,应该将void main()
改为int main()
,并在函数末尾返回0,表示程序正常结束。代码风格
虽然这不是一个错误,但为了提高代码的可读性,最好在case 1:
和case 2:
后面加上break;
,尽管在这个特定的例子中,由于return
语句的存在,break;
是多余的。但通常,在switch
语句中,除了最后一个case
分支(如果需要的话),其他分支后都应该加上break;
。
OK了,老哥们
(✪ω✪)┗( ▔, ▔ )┛