




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2023年程序设计竞赛基础实训221解不等式其中m为从键盘输入的正整数,式中符号为二个“+”号后一个“-”号,即分母能被3整除时为“-”。输入正整数m,输出满足不等式的n。测试数据:(1)m=4(2)m=7设计要点1:式中出现减运算,导致不等式的解也许分段。设立条件循环,每三项(包含二正一负)一起求和,得一个区间解。然后回过头来一项项求和,得个别离散解。为叙述方便,记通过循环知s(d+1)>m,且n=d+1为“-”,可得n=d为一个解;而n=d+2时1.0/(n+3)为“+”,可得s(d+2)>m;以后各项中,“-”项小于其前面的“+”项,可知对于n>d+2有s(n)>m成立。因而有区间解:n≥d在n<d时是否有解,逐个求和检查拟定离散解。这一步不能省,否则出现遗解。程序设计1://解不等式:m<1+1/2-1/3+1/4+1/5-1/6+...+-1/n#include<stdio.h>voidmain(){longd,n,m,k;doubles;printf("\n请输入m:");scanf("%d",&m);n=-2;s=0;while(s<=m){n=n+3;s=s+1.0/n+1.0/(n+1)-1.0/(n+2);}d=n+1;s=0;//可拟定区间解n≥d(1)for(k=1;k<=n;k++){if(k%3>0)s=s+1.0/k;elses=s-1.0/k;if(s>m)printf("n=%ld,",k);//逐个得离散解}printf("n>=%ld\n",d);}程序运营示例:请输入m:4n=10151,n=10153,n>=10154请输入m:7n=82273511,n=82273513,n>=82273514注意:要特别注意,不要把离散解遗失。思考:假如把后一个离散解写入区间解中?设计要点2:为叙述方便,记(1)通过循环累加,当加到s=s+1.0/n+1.0/(n+1)-1.0/(n+2);得s(n+2)>m,令d=n+1,可知:n≥d为解;(2)此时,s(n)有也许大于m,因而在原s基础上s-1.0/d+1.0/(d+1)得s(n):若s(n)>m,合并得区间解:n≥d-1;若s(n)<m,区间解为:n≥d;(因可肯定s(n-1)<m)但s(n-2)尚有也许大于m,因而在上s基础上s+1.0/(d-2)-1.0/(d-1),得s(n-2):若s(n-2)>m,得一个离散解:n=d-3;若s(n-2)<m,没有离散解。程序设计2://解不等式:m<1+1/2-1/3+1/4+1/5-1/6+...+-1/n#include<stdio.h>voidmain(){longd,n,m;doubles;printf("\n请输入m:");scanf("%d",&m);n=-2;s=0;while(s<=m){n=n+3;s=s+1.0/n+1.0/(n+1)-1.0/(n+2);}d=n+1;//可拟定区间解n≥d(1)s=s-1.0/d+1.0/(d+1);//得s(n)if(s>m)printf("n>=%ld\n",d-1);//输出区间解elseprintf("n>=%ld\n",d);s=s+1.0/(d-2)-1.0/(d-1);//得s(n-2)if(s>m)printf("n=%ld\n",d-3);//输出一个离散解}数据测试:请输入m:4n>=10153n=10151请输入m:7n>=82273513n=82273511程序设计3:请判断以下程序是否对的?//解不等式:m<1+1/2-1/3+1/4+1/5-1/6+...+-1/n#include<stdio.h>voidmain(){doublen,m,s;printf("\n请输入m:");scanf("%lf",&m);n=0;s=3.0/2;while(s<=m){n=n+3;s=s-1.0/n+1.0/(n+1)+1.0/(n+2);}d=n+2;printf("n=%.0f,",d);//得一个离散解(1)s=s-1.0/(n+3)+1.0/(n+4);d=n+4;if(s>m)printf("n>=%.0f\n",d);//可拟定区间解n≥d(2)elseprintf("n>=%.0f\n",d+1);//??}(1)一方面s(d)>m,n=d为一个解;而s(d-3)<=m,n=d-2为“-”项,其绝对值大于n=d-1的“+”项,可得s(d-1)<m;且知n<d时无解。同时由,可得s(d+1)<m,即n=d为一个离散解。(2)当s(n+4)>m时,以后的“-”项绝对值小于其前面的“+”项,故得区间解n≥d;当s(n+4)<=m时,因可知s(n+5)>m;但不能拟定s(n+6)>0,因而不能拟定n≥d+1为区间解!2求最大值设指定区间[a,b]内的正整数x,y,z,w满足其中a≤x<y<z<w≤b,试求s=x+y+z+w的最大值。输入正整数a,b(1≤a<b<10000),输出s的最大值。测试数据:a=500,b=1000a=1000,b=2023设计要点:对每一组满足条件的解,通过比较求得最大值。程序设计://求最大值#include<stdio.h>#include<math.h>voidmain(){longa,b,d,s,x,y,z,w,max;printf("请输入区间[a,b]的上下限a,b:");scanf("%ld,%ld",&a,&b);max=0;for(x=a;x<=sqrt(b*b/3);x++)for(y=x+1;y<=sqrt((b*b-x*x)/2);y++)for(z=y+1;z<=sqrt(b*b-x*x-y*y);z++){d=x*x+y*y+z*z;w=(int)sqrt(d);//w为x,y,z的平方和开平方if(w>b)break;if(w*w==d)//满足条件时记录{s=x+y+z+w;if(s>max)max=s;}}printf("s的最大值为:%ld\n",max);}数据测试:请输入区间[a,b]的上下限a,b:500,1000s的最大值为:2728请输入区间[a,b]的上下限a,b:1000,2023s的最大值为:54963带中转站的交通路线在某城区的完整方格交通网中,中转站(a,b)与终点(m,n)为交通网中的任意两交叉点,这里a,b,m,n为非负整数。试记录从始点(0,0)经中转点(a,b)到终点(m,n)的不同最短路线(路线中各段只能靠近目的点而不能远离目的点)的条数。(注:若a>m且b>n时,从(0,0)点至(a,b)点这一段允许通过(m,n)点)交通网格示意图输入非负整数a,b,m,n,输出从始点(0,0)经(a,b)到终点(m,n)的最短路线的条数。测试数据:a=9,b=7,m=20,n=12a=20,b=12,m=9,n=7设计要点:假如路线中没有设指定的必经点,从始点(0,0)到终点(m,n)每一条路线共m+n段,其中横向m段,纵向n段,每一条不同路线相应从m+n个元素中取m个元素(以放置横向段)的组合数,不同路线条数为今设立了路线中的必经点(a,b),须分以下两步记录。设从始点(0,0)到交叉点(a,b)的不同路线条数为y,从交叉点(a,b)到终点(m,n)的不同路线条数为z。据乘法原理,从始点(0,0)经(a,b)到终点(m,n)的最短路线的条数为yz。为了求y,分以下两种情形计算:1)若a=0或b=0,即必经点与起点在横向或纵向同线,y=1。2)若a>0且b>0,即a,b为正整数时,y=。为了求z,分以下两种情形计算:1)若m=a或n=b,即必经点与终点在横向或纵向同线,z=1。2)若m≠a且n≠b,必经点与终点在横向相差,在纵向相差,z=。程序设计://带中转站的最短路线#include<stdio.h>#include<math.h>voidmain(){doublea,b,c,d,m,n,k,y,z;printf("请输入正整数a,b:");scanf("%lf,%lf",&a,&b);printf("请输入正整数m,n:");scanf("%lf,%lf",&m,&n);y=1;if(a*b>0)for(k=1;k<=a;k++)y=y*(b+k)/k;//计算C(a+b,a)z=1;if((m-a)*(n-b)!=0){c=fabs(m-a);d=fabs(n-b);for(k=1;k<=c;k++)z=z*(d+k)/k;//计算C(|m-a|+|n-b|,|m-a|)}printf("不同最短路线条数为:%.0f\n",y*z);}数据测试:请输入正整数a,b:9,7请输入正整数m,n:20,12不同最短路线条数为:49969920请输入正整数a,b:20,12请输入正整数m,n:9,7不同最短路线条数为:附无障碍无中转站的交通路线问题程序://无障碍完整交通路线问题#include<stdio.h>voidmain(){intk,m,n,x,y,z,f[50][50];printf("请输入正整数m,n:");scanf("%d,%d",&m,&n);for(x=1;x<=m;x++)f[x][0]=1;for(y=1;y<=n;y++)f[0][y]=1;//拟定边界条件for(x=1;x<=m;x++)for(y=1;y<=n;y++)//实行递推得目的值f(m,n)f[x][y]=f[x-1][y]+f[x][y-1];printf("不同最短路线条数为:%d\n",f[m][n]);z=1;for(k=1;k<=m;k++)z=z*(n+k)/k;printf("不同最短路线组合数为:%d\n",z);}请输入正整数m,n:7,10不同最短路线条数为:194484双码二部数序列试求双码二部数升序序列的第m项。测试数据:m=2023;m=20234设计1:把双码二部数升序序列的第m项换算为n位的第m0项。注意到2位双码二部数共9*9=81个;3位双码二部数共2*9*9=2*81个;……//求双码二部数升序序列的第m项#include<stdio.h>#include<math.h>voidmain(){inta,b,a0,b0,i,n,m,m0,la,lb,la0,lb0,s;printf("请依次输入整数m:");scanf("%d",&m);s=0;n=0;while(s<m){n++;s=s+n*81;}m0=m-(s-n*81);n++;s=0;//换算为n位的第m0项for(a=1;a<=9;a++)//高部数字a从小到大枚举{for(la=1;la<=n-2;la++)//高部位数la分3环节枚举{lb=n-la;for(b=0;b<=a-1;b++){s++;//变量s记录个数if(s==m0)//记录第m个数的信息{a0=a;b0=b;la0=la;lb0=lb;}}}la=n-1;lb=1;for(b=0;b<=9;b++)if(a!=b)//当a=b时跳过{s++;if(s==m0){a0=a;b0=b;la0=la;lb0=lb;}}for(la=n-2;la>=1;la--){lb=n-la;for(b=a+1;b<=9;b++){s++;if(s==m0){a0=a;b0=b;la0=la;lb0=lb;}}}}printf("双码二部数升序序列的第%d个数为:",m);for(i=1;i<=la0;i++) printf("%d",a0);for(i=1;i<=lb0;i++)ﻩprintf("%d",b0);printf("\n");printf("(式中%d个%d,%d个%d)\n",la0,a0,lb0,b0);}设计2:从n=2位开始记录//求双码二部数从小到大排列的第m个数#include<stdio.h>voidmain(){inta,b,a0,b0,i,m,n,p,la,la0,lb0;printf("请输入整数m:");scanf("%d",&m);n=1;p=0;while(1){n++;p++;a=1;b=0;la=1;//默认n位第1个为1后n-1个0if(p==m){a0=a;b0=b;la0=la;lb0=n-la0;break;}while(la<n-1||a<9||b<8){p++;ﻩif(b==9)//此时b不能增1,有以下2种选择if(la==1){a++;b=0;}//①a增1后,b从0开始else{la--;b=a+1;}//②a段长增1后,b从a+1开始elseif(b!=a-1)b++;//a与la不变,b增1 elseif(la!=n-1){la++;b=0;}//a段长增1后,b从0开始ﻩelseif(b<8)b+=2;//b增2跳过a=b情形if(p==m) {a0=a;b0=b;la0=la;lb0=n-la0;break;}}if(p==m)break;}printf("第%d个双码二部数为:%d(%d)%d(%d)\n",m,a0,la0,b,lb0);printf("其中从小到大第%d个数为:",m);for(i=1;i<=la0;i++) printf("%d",a0);for(i=1;i<=lb0;i++)ﻩprintf("%d",b0);printf("\n");}数据测试:请依次输入整数m:2023双码二部数升序序列的第2023个数为:55999999(式中2个5,6个9)请依次输入整数m:20234双码二部数升序序列的第20234个数为:(式中4个8,19个2)5求代数和设n为正整数,求和式中各项符号为二正一负,分母符号为一正一负。正整数n从键盘输入,输出和s四舍五入精确到小数点后5位。输入n=100输出:输入n=2023输出://求代数和1#include<stdio.h>#include<math.h>voidmain(){longj,n;doublets,s;printf("请输入n:");scanf("%d",&n);j=0;ts=0;s=0;while(j<n){j=j+1;if(j%2==0)ts=ts-(double)1/j;//ts为各项的分母elsets=ts+(double)1/j;ﻩif(j%3==0)s=s-sqrt(j)/ts;//求代数和sﻩelses=s+sqrt(j)/ts;}printf("s=%.5f\n",s);}//求代数和2#include<stdio.h>#include<math.h>voidmain(){doublej,n,ts,s;printf("请输入n:");scanf("%lfd",&n);j=0;ts=0;s=0;while(j<n){j=j+1;if(fmod(j,2)==0)ts=ts-1/j;//ts为各项的分母elsets=ts+1/j; if(fmod(j,3)==0)s=s-sqrt(j)/ts;//求代数和sﻩelses=s+sqrt(j)/ts;}printf("s=%.5f\n",s);}请输入n:100s=324.74013请输入n:2023s=28924.48725请输入n:2023s=28989.22300变通:设2<n≤2023,当n为什么值时,和s最接近2023?6合数世纪探求1.问题的提出20世纪的100个年号[1901—2023]中有13个素数,而21世纪的100个年号[2023,2100]中有14个素数。那么,是否存在一个世纪的100个年号中一个素数都没有?定义一个世纪的100个年号中不存在一个素数,即100个年号全为合数的世纪称为合数世纪。设计程序探索第m(约定m<100)个合数世纪。测试数据:(1)m=1(2)m=102.设计要点应用穷举搜索,设立a世纪的的50个奇数年号(偶数年号无疑均为合数)为b,用k试商判别b是否为素数,用变量s记录这50个奇数中的合数的个数。对于a世纪,若s=50,即50个奇数都为合数,找到a世纪为合数世纪,用n记录合数世纪的个数。当n=m时打印输出a世纪。当n=m时退出循环结束。3.合数世纪程序设计//探求第1个与第m个合数世纪#include<stdio.h>#include<math.h>voidmain(){longa,b,k;intm,n,s,x;printf("请拟定m:");scanf("%d",&m);a=1;n=0;while(1){a++;s=0;//检查a世纪for(b=a*100-99;b<=a*100-1;b+=2)//穷举a世纪奇数年号b{x=0;for(k=3;k<=sqrt(b);k+=2)if(b%k==0){x=1;break;}if(x==0)break;//当前为非合数世纪时,跳出循环进行下一个世纪的探求s=s+x;//年号b为合数时,x=1,s增1}if(s==50)//s=50,即50个奇数均为合数 {n++; if(n==m)ﻩﻩprintf("第%d个合数世纪为:%ld世纪。\n",n,a);}ﻩif(n==m)break;}}4.程序运营示例请拟定m:10第1个合数世纪为:16719世纪。第10个合数世纪为:58453世纪。16719世纪尽管是最早的合数世纪,它的100个年号为[1671801,1671900]全为合数。这是一个非常漫长的年代,可谓天长地久,地老天荒!7分解质因数整数分解质因数是最基本的分解。例如,90=2*3*3*5,1960=2^3*5*7^2,前者为质因数乘积形式,后者为质因数的指数形式。把指定区间上的所有整数分解质因数,每一整数表达为质因数从小到大顺序的乘积形式。假如被分解的数自身是素数,则注明为素数。例如,92=2*2*23,91(素数!)。分解:1671861=5845271=(1)设计要点对每一个被分解的整数i,赋值给b(以保持判别运算过程中i不变),用k(从2开始递增取值)试商:若不能整除,说明该数k不是b的因数,k增1后继续试商。若能整除,说明该数k是b的因数,打印输出"k*";b除以k的商赋给b(b=b/k)后继续用k试商(注意,也许有多个k因数),直至不能整除,k增1后继续试商。按上述从小至大试商拟定的因数显然为质因数。循环取值k的终值如何拟定,一定限度上决定了程序的效率。终值定为i-1或i/2,无效循环太多。循环终值定为i的平方根sqrt(i)可大大精简试商次数,此时假如有大于sqrt(i)的因数(至多一个!),在试商循环结束后要注意补上,不要遗失。假如整个试商后b的值没有任何缩减,仍为原待分解数i,说明i是素数,作素数说明标记。(2)质因数分解乘积形式程序设计//质因数分解乘积形式#include"math.h"#include<stdio.h>voidmain(){longintb,i,k,m,n,w=0;printf("[m,n]中整数分解质因数(乘积形式).\n");printf("请输入m,n:");scanf("%ld,%ld",&m,&n);for(i=m;i<=n;i++)//i为待分解的整数{printf("%ld=",i);b=i;k=2;while(k<=sqrt(i))//k为试商因数{if(b%k==0){b=b/k;if(b>1){printf("%ld*",k);continue;//k为质因数,返回再试}if(b==1)printf("%ld\n",k);}k++;}if(b>1&&b<i)printf("%ld\n",b);//输出大于i平方根的因数if(b==i){printf("(素数!)\n");w++;}//b=i,表达i无质因数}printf("其中共%d个素数.\n",w);}1671861=3*31*179775845276=2*2*223*6553[m,n]中整数分解质因数(乘积形式)请输入m,n:1671801,1671899(验证第1个倒数世纪年号)1671801=3*23*242291671802=2*11*759911671803=7*2388291671804=2*2*3*3*464391671805=5*2392*769*10871671807=3*5572691671808=2*2*2*2*2*2*2*37*3531671809=599*27911671810=2*3*5*7*19*4191671811=137*122031671812=2*2*4179531671813=3*3*3*11*13*4331671814=2*17*491711671815=5*3343631671816=2*2*2*3*41*16991671817=7*241*9911671818=2*8359091671819=3*5572731671820=2*2*5*835911671821=29*576491671822=2*3*3*131*7091671823=191*87531671824=2*2*2*2*7*11*23*591671825=3*5*5*222911671826=2*13*643011671827=61*274071671828=2*2*3*127*10971671829=19*879911671830=2*5*31*53931671831=3*3*7*7*17*2231671832=2*2*2*53*39431671833=1289*12971671834=2*3*2786391671835=5*11*113*2691671836=2*2*4179591671837=3*47*71*1671671838=2*7*1194171671839=13*1286031671840=2*2*2*2*2*3*3*3*3*3*5*431671841=1223*13671671842=2*109*76691671843=3*5572811671844=2*2*4179611671845=5*7*37*12911671846=2*3*11*73*3471671847=23*726891671848=2*2*2*17*19*6471671849=3*3*431*4311671850=2*5*5*29*11531671851=67*249531671852=2*2*3*7*13*15311671853=101*165531671854=2*8359271671855=3*5*227*4911671856=2*2*2*2*1044911671857=11
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 古建门楼租赁合同
- 分项工程劳务分包合同
- 基坑喷锚支护劳务分包合同
- 建实务招标与合同管理知识点
- 私人教练健身指导服务合同与免责条款
- 产品销售服务合同
- 个人林地承包合同
- 北京平安普惠合同
- 石子黄沙购销合同
- 《第14课 循环结构(二)》教学设计教学反思-2023-2024学年小学信息技术浙教版23五年级下册
- 人力资源外包合同范本
- 2024年青岛职业技术学院高职单招语文历年参考题库含答案解析
- 《职业道德与法治》开学第一课(导言)(课件)-【中职专用】中职思想政治《职业道德与法治》高效课堂课件+教案(高教版2023·基础模块)
- (正式版)JBT 10437-2024 电线电缆用可交联聚乙烯绝缘料
- 监控系统维保方案计划及报价
- ABCD2评分量表(TIA早期卒中风险预测工具)
- E-learning平台使用手册(培训管理员版)
- 自动化物料编码规则
- 小学音乐教材分析
- 委托收款三方协议
- 黄冈市2021-2022高一上学期期末考试数学试题及答案
评论
0/150
提交评论