编写C语言程序解决多个数学问题及修正斐波那契数列递归函数

news2024/11/17 16:21:37

 

目录

请按下列要求编写程序:(三个函数均在一个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这行代码引入了标准输入输出库,使得程序可以使用printfscanf等函数。

#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的函数,它接收两个整数参数ab,并返回它们的和。

减法函数

int sub(int a, int b) {
return a - b;
}

这是一个名为sub的函数,它接收两个整数参数ab,并返回它们的差(即a减去b)。

主函数

int main() {
...
return 0;
}

主函数是C程序的入口点。当程序运行时,它首先执行main函数中的代码。

变量声明

int x, y;

在主函数中,我们声明了两个整数变量xy,用于存储用户输入的两个整数。

接收用户输入

printf("请输入两个整数 x 和 y:");
scanf("%d %d", &x, &y);

使用printf函数,我们向用户显示一个提示消息,告诉他们应该输入两个整数。然后,使用scanf函数,我们读取用户输入的两个整数,并将它们存储在变量xy中。

计算和与差

int sum = add(x, y);
printf("x 和 y 的和为:%d\n", sum);
int difference = sub(x, y);
printf("x 和 y 的差为:%d\n", difference);

首先,我们调用add函数来计算xy的和,并将结果存储在变量sum中。然后,我们使用printf函数将结果打印到屏幕上。

接着,我们调用sub函数来计算xy的差,并将结果存储在变量difference中。然后,我们再次使用printf函数将结果打印到屏幕上。


主函数最后返回0,表示程序成功执行。在C语言中,main函数返回0通常表示程序正常结束,而非零值表示发生了某种错误。

允许用户输入两个整数,并计算这两个整数的和与差,然后将结果打印到屏幕上。

 第二个

有一个四位整数,它的9倍恰好是其反序数(反序数例:12344321互为反序数)。

【要求】

1)编写函数首部为int findint n)的子函数,其功能是判断整数n9倍是否为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,而98011089的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;}
}

目的是找到一个三位数组合,这个组合满足两个条件:

  1. 这三个数字(设为x, y, z)的和乘以222等于2886。
  2. 这三个数字组成的一个三位数(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() {
...
}
  • 它定义了两个整数数组ab,以及一个整数n
  • 数组a被初始化为10个整数。
  • 调用fun函数,将数组abN作为参数传递,并将返回值存储在n中。
  • 使用一个循环遍历数组b的前n个元素,并使用这些索引从数组a中打印出相应的元素。

用一组整数验证命题:“任意一个百位数字与个位数字不同的三位正整数n1在经过以下操作后一定会变换到1089:将n1的百位数字与个位数字交换得到n2;求n1n2差的绝对值得到n3;将n3的百位数字与个位数字交换得到n4;求n3n4的和得到n5n5一定是1089。若n1n3是一位数或两位数,则在高位补0使其成为三位数。”

例如:n1123n2321n3198321123),n4891n51089198891

【要求】

(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项起,斐波那契数列为:1123581321……

输入测试数据:6

程序运行结果:8

【要求】

  1. 将上述程序录入到文件115.c中,根据题目要求及程序中语句之间的逻辑关系对程序中的错误进行修改。
  2. 题中用“/******found******/”来提示在下一行有错。
  3. 改错时,可以修改语句中的一部分内容,调整语句次序,增加少量的声明或编译预处理命令,但不能增加其他语句,也不能删去整条语句。

【含有错误的源程序】:

#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, ...,其中每个数字(从第三个开始)都是前两个数字的和。

问题解释与修正

  1. switch语句中的case 1和case 2
    case 1: case 2: return 1; 这行代码意味着当m为1或2时,函数都返回1。这是正确的,因为斐波那契数列的第1项和第2项都是1。

  2. 递归终止条件
    尽管switch语句已经处理了m为0、1和2的情况,但是代码中没有直接退出递归的逻辑。如果m大于2,则switch语句结束后,会执行return fun(m-1) + fun(m-2);进行递归调用。这是正确的逻辑。

  3. main函数的返回类型
    在C语言中,main函数的返回类型应该是int,而不是void。因此,应该将void main()改为int main(),并在函数末尾返回0,表示程序正常结束。

  4. 代码风格
    虽然这不是一个错误,但为了提高代码的可读性,最好在case 1:case 2:后面加上break;,尽管在这个特定的例子中,由于return语句的存在,break;是多余的。但通常,在switch语句中,除了最后一个case分支(如果需要的话),其他分支后都应该加上break;

 OK了,老哥们

(✪ω✪)┗( ▔, ▔ )┛

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1838938.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python8 使用结巴(jieba)分词并展示词云

Python的结巴&#xff08;jieba&#xff09;库是一个中文分词工具&#xff0c;主要用于对中文文本进行分词处理。它可以将输入的中文文本切分成一个个独立的词语&#xff0c;为后续的文本处理、分析、挖掘等任务提供基础支持。结巴库具有以下功能和特点&#xff1a; 中文分词&a…

【原创】springboot+mysql小区用水监控管理系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

视频怎么旋转方向?3种旋转视频方法分享

视频怎么旋转方向&#xff1f;视频旋转方向&#xff0c;在视频编辑过程中&#xff0c;扮演着至关重要的角色。这一操作不仅能有效调整视频的视觉呈现&#xff0c;使之更加符合我们的预期&#xff0c;还能解决由于拍摄角度不当导致的画面倾斜问题。通过简单的旋转调整&#xff0…

从网络配置文件中提取PEAP凭据

我的一位同事最近遇到了这样一种情况&#xff1a;他可以物理访问使用802.1X连接到有线网络的Windows计算机&#xff0c;同时保存了用于身份验证的用户凭据&#xff0c;随后他想提取这些凭据&#xff0c;您可能认为这没什么特别的&#xff0c;但是事情却有点崎岖波折…… 如何开…

shell脚本监控docker容器和supervisor 运行情况

1.ASR服务 需求: 在ASR服务器中 docker 以下操作中 忽略容器名字叫 nls-cloud-mongodb 的容器 在ASR服务器中 docker ps 查看正在运行的容器 docker stats -a --no-stream 可以监控容器所占资源 确认是否有pid且不等于0 docker inspect -f “{{.RestartCount}}” 容器名称 可…

llama-factory微调工具使用入门

一、定义 环境配置案例&#xff1a; https://zhuanlan.zhihu.com/p/695287607chatglm3 案例多卡训练deepspeedllama factory 案例Qwen1.5报错 二、实现 环境配置 git clone https://github.com/hiyouga/LLaMA-Factory.git conda create -n llama_factory python3.10 conda …

百元内平价蓝牙耳机推荐,四款高热度平价耳机推荐!

在追求高品质音乐体验的同时&#xff0c;我们也不得不考虑预算的限制&#xff0c;不过市面上有不少百元内平价蓝牙耳机&#xff0c;它们在保证音质和舒适度的同时&#xff0c;也兼顾了价格的亲民性&#xff0c;身蓝牙耳机测评的达人&#xff0c;经手过不少的百元蓝牙耳机&#…

CleanMyMac for Mac系统优化垃圾清理软件卸载 工具(小白轻松上手,简单易学)

Mac分享吧 文章目录 效果一、准备工作二、开始安装1、双击运行软件&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、启动台显示软件图标&#xff0c;表示安装成功 三、运行测试1、打开软件&#xff0c;配置2、授权&#xff0c;允许完全磁盘访问 安装完成&a…

.NET 分享一个强大的内网渗透工具集合|果断收藏

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…

15天搭建ETF量化交易系统Day8—强化自动交易模块

搭建过程 每个交易者都应该形成一套自己的交易系统。 很多交易者也清楚知道&#xff0c;搭建自己交易系统的重要性。现实中&#xff0c;从&#xff10;到&#xff11;往往是最难跨越的一步。 授人鱼不如授人以渔&#xff0c;为了帮助大家跨出搭建量化系统的第一步&#xff0c;我…

硬盘分区无法访问:深度解析与解决之道

一、硬盘分区无法访问的现象描述 在日常使用电脑的过程中&#xff0c;有时会遇到硬盘分区无法访问的情况。这通常表现为双击分区时系统提示“无法访问”、“磁盘未格式化”或“需要格式化”等错误消息&#xff0c;导致分区内的文件无法读取或操作。这种情况可能会给用户带来极…

echarts dataZoom用按钮代替鼠标滚轮实现同样效果

2024.06.19今天我学习了echarts dataZoom如何用按钮来控制放大缩小的功能&#xff0c; 效果如下&#xff1a; 通过控制按钮来实现图表放大缩小数据的效果。 步骤如下&#xff1a; 一、写缩放按钮&#xff0c;以及图表数据。 二、设置初始位置的变量&#xff0c;我这边是七个…

【前端项目笔记】3 用户管理

用户管理相关功能实现 涉及表单、对话框、Ajax数据请求 基本页面 用户列表开发 在router.js中导入Users.vue 解决用户列表小问题 选中&#xff08;激活&#xff09;子菜单后刷新不显示高亮 给二级菜单绑定单击事件&#xff0c;点击链接时把对应的地址保存到sessionSto…

WPS相同字体但是部分文字样式不一样解决办法

如下图&#xff0c;在使用wps编辑文档的时候发现有些电脑的文字字体很奇怪&#xff0c;但是把鼠标移到这个文字的位置&#xff0c;发现它和其他正常文字的字体是一样的&#xff0c;都是仿宋_GB2312 正常电脑的文字如下图所示 打开C:\Windows找到Fonts这个文件夹 把仿宋_GB2312这…

【免费API推荐】:解锁无限创意,让您的应用更具竞争力(8)

热门高效的免费实用类API是当今开发者们追逐的宝藏。这些API提供了各种热门功能和服务&#xff0c;能够帮助开发者轻松地为应用程序增添实用性和吸引力。无论是人脸识别、自然语言处理、机器学习还是图像处理&#xff0c;这些热门高效的免费API提供了强大的功能和高效的性能&am…

格雷母线技术革新:推动斗轮堆取料机进入精准操作时代

随着工业4.0时代的到来&#xff0c;智能化、自动化已成为工业发展的必然趋势。特别是在港口、电力、冶金等行业中&#xff0c;散料装卸机械的智能化水平直接关系到整个生产流程的效率与安全。斗轮堆取料机作为这些行业中的关键设备&#xff0c;其操作方式的革新显得尤为重要。 …

Apple Watch开发入门知识,还是很有必要的

随着现在 Apple 生态圈的发展&#xff0c;越来越多的 App 会把自己的简化版从 iOS 迁移至 WatchOS&#xff08;支付宝、微信、手Q、头条、QQ音乐、网易云音乐等等&#xff0c;都有Watch版App&#xff09;。官方开发文档&#xff1a;Setting up a watchOS project | Apple Devel…

NPDP含金量、考试内容、报考要求、适合人群?

01.NPDP核心价值解读 NPDP认证的核心价值在于整合产品开发管理的理论与实践&#xff0c;包含新产品开发策略、研发流程管理、市场研究、销规划、团队管理、项目管理等等&#xff0c;理论体系和知识内容穿插在产品发展的全过程。 对于职场打工人来说&#xff0c;拥有NPDP证书证…

csrf+xss组合拳

csrfxss组合拳 一、环境搭建 靶场cms文章管理系统 二、流程开始 这是系统前端 系统管理后台 而我们要打到后台管理员的cookie&#xff0c;结合前端存储型的xss完全可以实现&#xff0c;那后端怎么被打到cookie呢&#xff0c;我们来从这里添加用户开始分析数据包来说明 看看…

【CT】LeetCode手撕—手撕快排

目录 题目1-思路-快排1-1 快排的核心思想快速排序算法步骤优美的调整区间 1-2 ⭐快排的实现 2- 实现⭐912. 排序数组——题解思路 3- ACM 实现 题目 原题连接&#xff1a;912. 排序数组 1-思路-快排 1-1 快排的核心思想 选择一个基准 基准左侧的元素都小于该元素基准右侧的元…