【C/PTA】循环结构进阶练习(二)

本文结合PTA专项练习带领读者掌握循环结构,刷题为主注释为辅,在代码中理解思路,其它不做过多叙述。

7-1 二分法求多项式单根

二分法求函数根的原理为:如果连续函数f(x)在区间[a,b]的两个端点取值异号,即f(a)f(b)<0,则它在这个区间内至少存在1个根r,即f®=0。

二分法的步骤为:

  • 检查区间长度,如果小于给定阈值,则停止,输出区间中点(a+b)/2;否则
  • 如果f(a)f(b)<0,则计算中点的值f((a+b)/2);
  • 如果f((a+b)/2)正好为0,则(a+b)/2就是要求的根;否则
  • 如果f((a+b)/2)与f(a)同号,则说明根在区间[(a+b)/2,b],令a=(a+b)/2,重复循环;
  • 如果f((a+b)/2)与f(b)同号,则说明根在区间[a,(a+b)/2],令b=(a+b)/2,重复循环。

本题目要求编写程序,计算给定3阶多项式f(x)=a3x3+a2x2+a1x+a0在给定区间[a,b]内的根。

输入格式:

输入在第1行中顺序给出多项式的4个系数a3、a2、a1、a0,在第2行中顺序给出区间端点a和b。题目保证多项式在给定区间内存在唯一单根。

输出格式:

在一行中输出该多项式在该区间内的根,精确到小数点后2位。

输入样例:

3 -1 -3 1
-0.5 0.5

输出样例:

0.33
#include <stdio.h>  
double a3, a2, a1, a0;  

double f(double x)  
{  
    double result;  
    result=a3*x*x*x+a2*x*x+a1*x+a0;  
    return result;  
}
  
int main()  
{  
    double a, b;  
    scanf("%lf%lf%lf%lf",&a3,&a2,&a1,&a0);  
    scanf("%lf%lf",&a,&b);  
    
    double left,mid,right;  
    left=a;  
    right=b;  
    
    ///大于阈值时使用二分法求出单根,程序结束
    while(right-left>=0.001&&f(left)*f(right)<=0)  
    {  
        if(f(left)==0)  
        {  
            printf("%.2f",left);  
            return 0;  
        }  
        if(f(right)==0)  
        {  
            printf("%.2f",right);  
            return 0;  
        }  
        
        mid=(left+right)/2;  
        if (f(mid)*f(left)>0)  
        {  
            left=mid;  
        }  
        else  //由于先决条件为f(left)*f(right)<0,因此此时else语句等价于f(mid)与f(left)异号,即与f(right)同号
        {  
            right=mid;  
        }  
    }  
    
    
    不大于阈值时输出中点
    printf("%.2f",mid);  
    return 0;  
}  

7-2 循环-十进制转化

小白龙新学了十进制的转换。现在他想把十进制数转化成其他进制的数,聪明的学弟学
妹们能帮帮他吗?因为小白龙还没有学习到数组,所以他希望这道题能够不用数组的相关知
识就可以解决。

输入格式:

输入只有两个整数N,M。 N ( 0 < N <= 100 ) 表示十进制数N。M( 2 <= M <= 9 )表示转换成M进制。

输出格式:

将N转化为M进制后然后输出。

输入样例:

在这里给出一组输入。例如:

50 4

输出样例:

在这里给出相应的输出。例如:

302
//题目暗示数组可以实现
#include <stdio.h>

int main() {
    int n,m,a[100],i=0;
    scanf("%d%d",&n,&m);
    
	while(n){
        a[i++] =n%m;  //从a[0]开始赋值
        n/=m;
    }
    
    while(i--){//逆序输出
        printf("%d",a[i]);
    }
}

7-3 梅森数

形如2n−1的素数称为梅森数(Mersenne Number)。例如2^2−1=3、23−1=7都是梅森数。1722年,双目失明的瑞士数学大师欧拉证明了231−1=2147483647是一个素数,堪称当时世界上“已知最大素数”的一个记录。

本题要求编写程序,对任一正整数n(n<20),输出所有不超过2n−1的梅森数。

输入格式:

输入在一行中给出正整数n(n<20)。

输出格式:

按从小到大的顺序输出所有不超过2n−1的梅森数,每行一个。如果完全没有,则输出“None”。

输入样例:

6

输出样例:

3
7
31
#include <stdio.h>
#include <math.h>

int f(int x)//判断素数的函数
{
	for(int i=2;i<=sqrt(x);i++)
	{
		if(x%i==0)
		return 0;//不是素数则返回0
	}
	return 1;
}


int main()
{
	int n;
	scanf("%d",&n);
	
	if(n<=1)//n<=1时一定不存在梅森数
	printf("None");  
	
	else//n>=2时一定存在梅森数
	{
		for(int i=2;i<=n;i++)
		{//对每一个2^i进行素数的判断
			int a=pow(2,i)-1;
			if(f(a))
			{
				printf("%d\n",a);
			}
		}
    }
}

7-4 单词长度

你的程序要读入一行文本,其中以空格分隔为若干个单词,以.结束。你要输出每个单词的长度。这里的单词与语言无关,可以包括各种符号,比如it's算一个单词,长度为4。注意,行中可能出现连续的空格;最后的.不计算在内。

输入格式:

输入在一行中给出一行文本,以.结束

**提示:**用scanf("%c",...);来读入一个字符,直到读到.为止。

输出格式:

在一行中输出这行文本对应的单词的长度,每个长度之间以空格隔开,行末没有最后的空格。

输入样例:

It's great to see you here.

输出样例:

4 5 2 3 3 4

如果题目要求不能出现连续的空格,以下代码是可行的:

#include <stdio.h>
int main()
{
	char c;
	int a=0;
	
	while((c=getchar())!='.')
	{
		if(c==' ')
		{
		printf("%d ",a);
		a=0;
		}
		else
		a++;
	}
	printf("%d",a);
}

但行中可能出现连续的空格,所以需要用一个标志变量来跟踪当前是否处于单词中的状态。

逻辑如下:

设count用于统计某单词的字符个数,mark用于标记是否遇到第一个空格,sum用于记录已经输出的单词个数。
如果当前字符不是空格,则将count加1
如果当前字符是空格并且count大于0,表示遇到一个单词的结束。
    如果mark大于0,说明不是第一个单词,先输出一个空格。
    输出统计得到的单词字符个数count。
    将sum加1,表示已经输出一个单词。
    将count重置为0,开始统计下一个单词的字符个数。
    将mark加1,表示已经遇到第一个空格。
循环结束后,判断最后一个单词是否有字符,如果有且sum大于0,输出最后一个单词的字符个数。

It's great to see you here.举例

初始状态:

  • count = 0
  • sum = 0
  • mark = 0

字符 ‘I’:

  • count = 1

字符 ‘t’:

  • count = 2

字符 ‘’':

  • count = 3

字符 ‘s’:

  • count = 4

字符 ’ ':

输出4

  • sgn=1

  • cnt = 0

  • mark = 1

字符 ‘g’:

  • cnt = 1

字符 ‘r’:

  • cnt = 2

字符 ‘e’:

  • cnt = 3

字符 ‘a’:

  • cnt = 4

字符 ‘t’:

  • cnt = 5

字符 ’ ':

输出空格再输出5

  • sgn=2

  • cnt = 0

  • mark = 2

字符 ‘t’:

  • cnt = 1

字符 ‘o’:

  • cnt = 2

字符 ’ ':

输出空格再输出2

  • sgn=3

  • cnt = 0

  • mark = 3

字符 ‘s’:

  • cnt = 1

字符 ‘e’:

  • cnt = 2

字符 ‘e’:

  • cnt = 3

字符 ’ ':

输出空格再输出3

  • sgn=4

  • cnt =0

  • mark = 4

字符 ‘y’:

  • cnt = 1

字符 ‘o’:

  • cnt = 2

字符 ‘u’:

  • cnt = 3

字符 ’ ':

输出空格再输出3

  • sgn=5

  • cnt = 0

  • mark = 5

字符 ‘h’:

  • cnt = 1

字符 ‘e’:

  • cnt = 2

字符 ‘r’:

  • cnt = 3

字符 ‘e’:

  • cnt = 4

字符 ‘.’:

此时cnt > 0 && sgn > 0,输出4

最终程序输出的结果是:4 5 2 3 3 4

#include <stdio.h>

int main()
{
    char c;
    int count=0,mark=0,sum=0;

    while((c=getchar())!='.')
    {
        if(c!=' ')
            count++;
        else if(c==' '&&count>0)
        {
            if(mark>0)
            {
                printf(" ");
            }
            printf("%d",count);
            sum++;
            count=0;
            mark++;
        }
    }

    if(count>0&&sum>0)
    {
        printf(" %d",count);
    }
    else if(count>0&&sum==0)
    {
        printf("%d",count);
    }
    return 0;
}

7-5 21循环-求和3

sxtc爱做数学题,今天他又拿到一道数学题:

在这里插入图片描述

注意答案有可能很大,请对114514取模。

他希望擅长求和的你帮他解出这个求和问题。

输入格式:

读入两个数n,k。

输出格式:

输出求和结果,请对答案取模114514。

输入样例:

在这里给出一组输入。例如:

11451 4

输出样例:

在这里给出相应的输出。例如:

113968

思路:

1.使用两个嵌套的for循环,外层循环控制1到n的遍历,内层循环控制1到k的遍历。

2.在内层循环中,每次将total乘以当前外层循环的迭代变量i,并取结果对114514取模(%)。

3.在外层循环中,将计算得到的total累加到sum上,并将结果对114514取模,再重新将total置为1。

#include <stdio.h>
int main() {
    int n, k;
    scanf("%d%d", &n, &k);

    int total=1;
    int sum=0;

    for (int i=1;i<=n;i++) 
	{
        for (int j=1;j<=k;j++) 
		{
            total=(total*i)%114514;
        }
        sum =(sum+total)%114514;
        total=1;
    }
    printf("%d", sum);
}

7-6 21循环-金字塔

SeraphJACK正在摆积木。他想用这些积木垒成一座金字塔。同时摆好金字塔之后,他为每层积木涂上不同的颜色,这些颜色用从1开始的正整数表示,从最底层开始涂色。现在告诉你SeraphJACK有n块积木,请输出他用这些积木能摆出并涂色的最大金字塔。(金字塔形状详见样例,0表示这个位置没有积木)

输入格式:

一个整数n,1<=n<=1000

输出格式:

涂色后的金字塔

输入样例1:

在这里给出一组输入。例如:

11

输出样例1:

在这里给出相应的输出。例如:

0004000
0030300
0202020
1010101

输入样例2:

在这里给出一组输入。例如:

1

输出样例2:

在这里给出相应的输出。例如:

1
#include<stdio.h>
int main()
{
    int sum,n,c=1,d;
    scanf("%d",&sum);
    
    for(n=1;n*(n+1)/2<=sum;n++);
    
    while(c<=(n-1))//外层循环控制层数
    {
        d=1;
        while(d<=2*n-3)//内层循环控制涂色及编号
        {
            if(d<=(n-1-c)||d>n-2+c)
                printf("0");
            //如果位置d小于等于(n-1-c),或者大于n-2+c,则打印0。
            else if((d-n+1+c)%2==1)
                printf("%d",n-c);
            //否则,如果(d-n+1+c)除以2的余数为1,则打印n-c,表示涂上对应颜色的编号。
            else 
			printf("0");
            //否则,打印0。
            d++;
        }
        printf("\n");
        c++;
    }
    return 0;
}

7-7 循环-杨辉三角

Little VayH_E带着他的小伙伴玩起了杨辉三角的游戏…

在这里插入图片描述

输入格式:

输入包含两个正整数n和m(1<=n,m<=20),两个数之间用空格分开。

输出格式:

输出杨辉三角的第n行与第m行之间(包含第n,m行)的部分,输出时注意:

倒数第一行的第一个数字前有0个空格…倒数第k行(如果有的话)的第一个数字前有k-1个空格…以此类推

每一行的每两个数字(如果有的话)之间有1个空格

每一行的最后一个数字后没有空格,在每一行的最后一个数字后输出一个换行符

对于所求的杨辉三角,每一个数字都只取最后一位,例如,若所求的杨辉三角上某个数字为10,则应输出0

输入样例:

在这里给出一组输入。例如:

1 4

输出样例:

在这里给出相应的输出。例如:

   1
  1 1
 1 2 1
1 3 3 1
#include <stdio.h>
int main()
{
	long int n,m,i,k,a,b,c,d,e,f,t;
	scanf("%ld %ld",&n,&m);
	if(n>m)
	{
		t=n;
		n=m;
		m=t;
	}
	
	for(i=n;i<=m;i++)//对于每行而言
	{
		for(k=m-i+1;k>1;k--)
		{
			printf(" ");//循环输出每行前面的空格
		}
		printf("1");
		for(a=1;a<=i-2;a++)//输出第i行的第二个到倒数第二个数
		{
			c=1;
			e=1;
			for(b=i-1;b>=i-a;b--)
			{
				c=c*b;
			}
			for(d=a;d>=1;d--)
			{
				e=e*d;
			}
			f=(c/e)%10;
			printf(" %ld",f);
		}
		if(i==1)
		printf("\n");//第一行输出回车
		else
		printf(" 1\n");//输出每行的最后一个1和回车
	}
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AR眼镜硬件解决方案_AR/VR智能眼镜安卓主板芯片方案介绍

随着近两年来增强现实(AR)技术的逐渐成熟&#xff0c;采用MT8788芯片解决方案的AR眼镜已经问世。众所周知&#xff0c;AR技术可以帮助开发者打造一个既强大而又实用的混合现实世界&#xff0c;将虚拟与真实世界相结合。 据了解&#xff0c;MT8788芯片采用了多芯片分布式处理系统…

卡牌游戏类型定制开发微信卡牌小程序游戏

卡牌类型的游戏开发具有一些独特的特点和挑战&#xff0c;以下是一些主要的特点&#xff1a; 卡牌设计和平衡&#xff1a;卡牌游戏的核心是卡牌设计和平衡。开发团队需要设计各种卡牌&#xff0c;确保它们在游戏中相互平衡&#xff0c;以便提供有趣的游戏体验。卡牌的特性、效…

C语言,数据结构指针,结构构体操作符 •,->,*的区别,看这篇就够了

在朋友们学习指针和数据结构这一章的时候&#xff0c;对各种操作符云里雾里。当你看到这么文章之后你就会明白了。 一 • 和 ->运算符 • 运算符&#xff1a;是结构变量访问结构体成员时用的操作符 -> 运算符&#xff1a;这是结构体指针访问结构体成员时调用的运算符。 …

04-react基础知识-路由

一、react路由环境安装 使用指令&#xff1a;npm i --save react-router-dom type/react-router-dom进行react路由环境安装 二、引入路由 在main.jsx文件中引入该语句&#xff1a; import { createBrowserRouter, RouterProvider } from react-router-dom 定义一个变量rou…

借助 DevChat AI 之力,成就我之全栈梦想

何为 DevChat &#xff1f; DevChat 是集好多种 AI 大模型的智能编程工具,可以大大增加我们上班摸鱼的时间。 整合了如 ChatGPT、Codex等热门 AI 模型支持自然语言编程、代码生成与编写、代码补全等功能因其集成热门 AI 智能&#xff0c;相当于站在了巨人的肩膀上&#xff0c…

节省服务器资源、实现双向数据传输——深度解析WebSocket协议

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 ⭐ 专栏简介 &#x1f4d8; 文章引言 一、W…

MinIO 分布式文件(对象)存储

简介 MinIO是高性能、可扩展、云原生支持、操作简单、开源的分布式对象存储产品。 在中国&#xff1a;阿里巴巴、腾讯、百度、中国联通、华为、中国移动等等9000多家企业也都在使用MinIO产品 官网地址&#xff1a;http://www.minio.org.cn/ 下载 官网下载(8.4.3版本)&#x…

简述SVM

概述 SVM&#xff0c;即支持向量机&#xff08;Support Vector Machine&#xff09;&#xff0c;是一种常见的监督学习算法&#xff0c;用于分类和回归问题。它是一种基于统计学习理论和结构风险最小化原则的机器学习方法。 SVM的主要思想是在特征空间中找到一个最优的超平面…

网络的地址簿:Linux DNS服务的全面指南

1 dns 1.1 dns&#xff08;域名解析服务&#xff09;介绍 当访问 www.baidu.com 首先查询/etc/hosts&#xff0c;如果没有再去查询/etc/resolv.conf&#xff0c;还是没有就去查询域名服务器 关于客户端: /etc/resolv.conf ##dns指向文件 nameserver 172.25.254.20测试&…

C语言实现将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5

完整代码&#xff1a; // 将一个正整数分解质因数。例如&#xff1a;输入90,打印出902*3*3*5 #include<stdio.h> //定义全局变量&#xff0c;使i可以作用于函数的递归调用中 int i2;void func(int num){//递归结束条件&#xff0c;当这个数除以最后一个它的因子时&#…

Halcon如何使用SaperaLT库连接dalsa相机

halcon安装好的时候&#xff0c;没有带SaperaLT的采集库&#xff0c;需要额外在Halcon官网下载此库。 以下是halcon官网下载此库的链接。官网需要注册才可以下载。 https://www.mvtec.com/downloads/interfaces?tx_mvtecproduct_extensiondownloadlist%5Bfilter%5D%5B0%5Dma…

Linux认识协议

目录 TCP协议通信流程TCP三次握手数据传输过程四次挥手过程TCP 和 UDP 对比 认识协议协议的概念结构化数据的传输序列化和反序列化 网络版计算器服务端代码面向字节流 协议定制客户端代码编写代码测试守护进程守护进程创建 关于协议制定中使用现成方法实现 TCP协议通信流程 下…

【JVM】JDBC案例打破双亲委派机制

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 Redis 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 JVM 打破双亲委派机制&#xff08;JDBC案例…

开发直播带货系统源码的技术要点

直播带货系统是一个复杂的技术项目&#xff0c;通常包括前端应用、后端服务器、数据库、支付集成、实时通信以及直播流处理等多个关键组件。以下是开发直播带货系统源码的技术要点&#xff1a; 实时视频流处理 一个成功的直播带货系统需要支持实时视频流的传输和处理。可以使…

【云原生】使用nginx反向代理后台多服务器

背景 随着业务发展&#xff0c; 用户访问量激增&#xff0c;单台服务器已经无法满足现有的访问压力&#xff0c;研究后需要将后台服务从原来的单台升级为多台服务器&#xff0c;那么原来的访问方式无法满足&#xff0c;所以引入nginx来代理多台服务器&#xff0c;统一请求入口…

TCP编程及基础知识

一、端口号 为了区分一台主机接收到的数据包应该转交给哪个进程来进行处理&#xff0c;使用端口号来区分TCP端口号与UDP端口号独立端口用两个字节来表示 2byte&#xff08;65535个&#xff09; 众所周知端口&#xff1a;1~1023&#xff08;1~255之间为众所周知端口&#xff…

Ubuntu网络IP地址一直显示127.0.0.1

问题描述&#xff1a; 终端输入ip a显示127.0.0.1&#xff0c;原来类似192.168.231.1的地址不见了。 ip a 点击网络配置&#xff08;ubuntu桌面版&#xff09;&#xff0c;发现无线网络模块看不见了 正常情况应该有wired 模块&#xff0c;就是下面标红的 解决方案&#xff1a…

学为贵雅思写作备考

准确通顺&#xff0c;言之有物 两次读不懂&#xff0c;6分以下&#xff0c; 6分没有印象&#xff0c;味同嚼蜡&#xff0c;但是没错&#xff08;书面语过关&#xff09; 英语比较过关 8-9分&#xff0c;很有见地 6-7单个的句子读得懂&#xff0c;前后是贯通的、逻辑是通顺…

发现一款PDF转换成翻页电子书的网站

​随着科技的发展&#xff0c;电子书越来越受到人们的喜爱。而PDF格式的文件也越来越多地被人们使用。那么&#xff0c;如何将PDF文件转换成翻页电子书呢&#xff1f;今天就为大家推荐一款好用的PDF转翻页电子书网站。 一、网站介绍 这款网站是一款非常实用的在线转换工具&…

Devchat AI尝鲜试用:程序员开发提效利器,告别脏活累活

DevChat 简介 在当今的软件开发领域&#xff0c;程序员们每天都要面对海量的代码和复杂的任务。尽管技术不断发展&#xff0c;但程序员们依然需要花费大量时间进行重复性工作&#xff0c;如代码审查、错误排查、文档编写等。这些脏活累活不仅消耗了程序员们大量的时间和精力&am…