C基础程序设计趣味题竞赛题_第1页
C基础程序设计趣味题竞赛题_第2页
C基础程序设计趣味题竞赛题_第3页
C基础程序设计趣味题竞赛题_第4页
已阅读5页,还剩101页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2012年程序设计竞赛基础实训详解试1不等式对指定的正整数m,试求满足不等式,V2V3品 1m<]H 1 F■•,H <祖+]3 5 2n-l的正整数n。输入正整数m く10000),输出正整数n所在的区间。例如m=2,输出正整数n的区间为:[4,8]测试数据:¢1) m=1000C2) m=2012程序设计:/Z解不等式,tlttinclude<stdio.h>#include<math.h>voidmainO{longc,d,i,m;doubles;printf("请输入m:*);scanf("%ld",&m);i=0;s=0;while(s<m){i=i+l;s=s+sqrt(i)/(2*i-l);}c=i;while(s<m+l){i=i+l;s=s+sqrt(i)/(2*i-l);}d=i-l;printf("\n满足不等式的正整数n为:[%ld,%ld]\n*,c,d):)数据测试:请输入m:1000满足不等式的正整数n为:[999550,1001549]请输入m:2012满足不等式的正整数n为:[4047237,4051260]变通:如果和式中增加有规律的号,如何求解?

实训1:解不等式<1+ F-d +・・・±—其中m为从键盘输入的正整数,式中符号为二个“+”号后ー个“-”号,即分母能被3整除时为“ノ。输入正整数m,输出满足不等式的n。测试数据:⑴m=4 (2)m=7试2不定方程试求四元二次不定方程x+y+z=w在指定区间[a,b]的正整数解。输入正整数a,b(l^a<b<10000),输出方程在该区间[a,b]内的正整数解x,y,z,w(约定a近x〈y〈z〈wWb)的组数。例如输入a,b:1,10;求得方程在[1,10]有2组解:{1,4,8,9},{2,3,6,7},输出:2。测试数据:600,10001000,2012求解要点:设指定区间为[a,b],一般设置4重循环在指定区间内穷举x、y、z,w(x<y<z),若满足方程式则用n统计级数。程序设计:/Z求指定区间内不定方程解的组数t21#include<stdio.h>ttinclude<math.h>voidmainO{longa,b,n,x,y,z,w;printfC请输入区间[a,b]的上下限a,b:");scanf(*%ld,%ld*,&a,&b);n=0;/Z满足不定方程式时统计/Z满足不定方程式时统计if(n=0)printf(・方程在该区间内没有解。、n");elseprintf(・方程在1%Id,%ld]内有%Id组解。Xn*,a,b,n):}优化循环参数:/Z求指定区间内不定方程解的组数t224include<stdio.h>#include<math.h>voidmainO{longa,b,n,x,y,z,w;printf(・请输入区间[a,b]的上下限a,b:');scanfC%ld,%ld*,&a,&b);n=0;for(x=a;x<=sqrt(b*b/3);x++)for(y=x+l;y<=sqrt((b*b-x*x)/2);y++)for(z=y+l;z<=sqrt(b*b-x*x-y*y);z++)for(w=z+l;w<=b;w++)if(x*x+y*y+z*z==w*w)/Z满足不定方程式时统计n++;if(n=0)printfC方程在该区间内没有解。、n");elseprintfC方程在[%ld,%ld!内有%Id组解。ゝn”,a,b,n);}数据测试:请输入区间[a,b]的上下限a,b:500,1000方程在[500,1000]内有13I组解。请输入区间[a,b]的上下限a,b:1000,2012方程在[1000,2012]内有617组解。精简循环设计:设指定区间为[a,b],精简w循环,设置3重循环在指定区间内穷举x,y,z(xくyくz),应用方程式计算d=x*x+y*y+z*z,w=sqrt(d):若絞b或w不满足方程,返回;否则用n统计级数。/Z求指定区间内不定方程解的组数t23#include<stdio.h>#include<math.h>voidmainO{longa,b,d,n,x,y,z,w;printf("请输入区间[a,b]的上下限a,b:");scanf("%ld,%ld*,&a,&b);n=0;for(x=a;x<=sqrt(b*b/3);x-h-)for(y=x+l;y<=sqrt((b*b-x*x)/2);y++)for(z=y+l;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)n++;/Z满足方程式时统计)if(n=0)printf(・区间内没有勾股数组。、n");elseprintf(・方程在1%Id,%ld]内有%Id组解。Xn*,a,b,n):)变通:可把要求统计解数变为输出某些解,或输出某些量。实训2:求最大值设指定区间[a,b]内的正整数x,y,z,w满足其中aWx〈yくz<wWb,试求s=x+y+z+w的最大值。输入正整数a,b(IWaVbClOOOO),输出s的最大值。测试数据:a=500,b=1000a=1000,b=2012试3喝汽水某学院的m个学生参加南湖春游,休息时喝汽水。南湖商家的公告:(1)买1瓶汽水定价1.40元,喝1瓶汽水(瓶不带走)1元。(2)为节约资源,规定3个空瓶可换回1瓶汽水,或20个空瓶可换回7瓶汽水。(3)为方面顾客,可先借后还。例如借1瓶汽水,还3个空瓶;或借7瓶汽水,还20个空瓶问m个学生每人喝1瓶汽水,至少需多少元?输入正整数ポ2的〈10000),输出至少需多少元(精确到小数点后第2位)。测试数据:11112012设计要点:建立x=0,1,2, ,int(m/20)循环:1)把m人分为x个大组,每组20人。每组买13瓶汽水(借7瓶汽水),饮完后还20个空瓶(即相当于换回7瓶汽水还给商家),两清。2)剩下t=nrx*20人,分为y=t/3个小组,每组3人。每组买2瓶汽水(借1瓶汽水),饮完后还3个空瓶(即相当于换回1瓶汽水还给商家),两清。3)剩下t=m-x*20-y*3人,每人花1元喝1瓶。对每ー个x,所求得最低费用(13*x+2*y)*L40+t与最小值变量mi比较,求得最低费用。程序设计:/Z喝汽水t31#include<stdio.h>voidmainO{longm,t,x,y;doublep,mi;printf(・请输入m:");scanf("%ld",&m);p=L40;mi=2*m; //最小值mi赋初值for(x=0;x<=m/20;x++)〃分x个大组,每组买13瓶汽水,借7瓶{t=m-20*x; /Z剩下大组外的t人y=t/3; 〃剩下t人分y个小组,每组买2瓶汽水,借1瓶t=m-20*x-3*y;/Z剩下大小组外的t人,每人花1元喝1瓶if((13*x+2*y)*p+t〈mi)/Z比较求最小值mi=(13*x+2*y)*p+t;)printf(・喝%Id瓶汽水,需%.2f元。Xn*,m,mi);}数据测试:请输入m:1111喝1111瓶汽水,需1011.40元。请输入m:2012喝2012瓶汽水,需1831.20元。设计求解优化:(1)大组人数为20人,买13瓶汽水(借7瓶汽水,还20个空瓶),花费13*1.40元,人均13*1.40/20=0.91元。(2)小组人数为3人,买2瓶汽水(借1瓶汽水,还3个空瓶),花费2*1.40元,人均2*1.40/3=0.93333元。(3)零散人数可能为1或2人,每人喝1瓶汽水(瓶不带走),各花费1元注意到0.91<0.933333<l,显然大组优先小组,小组优先零散。改进程序设计:/Z喝汽水t32#include<stdio.h>voidmainO{longm,x,y,z;printf("请输入m:“);scanf("%ld",&m);x=m/20; //分x个大组,每组买13瓶汽水,借7瓶y=(m-20*x)/3;/Z剩下人分y个小组,每组买2瓶汽水,借1瓶z=m-20*x-3*y;/Z剩下零散z人,每人花1元喝1瓶printf("喝%Id瓶汽水,需%.2f元。\n*,m,(x*13+y*2)*l.40+z);

试4交通网岳阳新城区的方格交通网如图1所示,其中金鹦山占据了交通网中(3,2).(4,2)与(4,3)这三个交叉点尚未开通,另有从(2,3)至(2,4)与(6,4)至(7,4)的两条打“X”路段正在维护,禁止通行。试统计从始点(0,0)到终点(m,n)的不同最短路线(路线中各段只能从左至右、从下至上)的条数。图1交通网格示意图输入正整数m,n(7<m<=20,5<n<=20),输出从始点(0,0)到终点(m,n)的最短路线的条数。测试数据:m=10,n=8m=20,n=12设计要点:如果没有障碍的方格交通网,每一条路线共m+n段,其中横向m段,纵向n段,每ー条不同路线对应从m+n个元素中取m个元素(以放置横向段)的组合数。因而不同路线条数为C,"因而不同路线条数为C,"n+m1n+今设置了诸多障碍,试应用递推求解。设f(x,y)(O〈x《!n,OCyWn)为从始点(0,0)到终点(x,y)的不同最短路线的条数。(1)递推关系f(x,y)=f(x-1,y)+f(x,y-1)(2)边界条件f(x,0)=1(。くxWm)f(0,y)=l(O〈yWn)(3)障碍处理城区的一座山所占据网中的(3,2)、(4,2)、(4,3)三个交叉点,可令f(3,2)=f(4,2)=f(4,3)=0;从(2,3)至(2,4)段禁止通行,则对f(2,4)的赋值只有f(1,4),即f[2][4]=f[l][4];同理f[7][4]=f[7][3];程序设计:/Z带障碍的交通路线问题t41tfinclude<stdio.h>voidmainO{intm,n,x,y,f[50][50];printf(・请输入正整数tn,n:*);scanf("%d,%d",&m,&n);for(x=1;x<=m;x++)f[x][0]=l;for(y=l;y<=n;y++)f[0][y]=l!〃确定边界条件for(x=l;x<=m;x++)for(y=l;y<=n;y++) /Z实施递推得目标值f(m,n)if(x=3&&y=2IIx=4&&y=2||x=4&&y=3)f[x][y]=0;elseif(x=2&&y==4)f[x][y]=f[x-l][y];elseif(x=7&&y==4)f[x][y]=f[x][y-1];elsef[x][y]=f[x-l][y]+f[x][y-1];printf(・不同最短路线条数为:%d\n*,f[m][n]):}数据测试:请输入正整数!n,n:10,8不同最短路线条数为:11008请输入正整数叫n:20,12不同最短路线条数为:70679215附无障碍交通路线问题程序/Z无障碍完整交通路线问题t42#include<stdio.h>voidmainO{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]=l;for(y=l;y<=n;y++)f[0][y]=l;〃确定边界条件for(x=l;x<=m;x++)for(y=l:y<=n;y++) /Z实施递推得目标值f(m,n)f[x][y]=f[x-1][y]+f[x][y-1];printf("不同最短路线条数为:%d\n”,f[m][n]);z=l;for(k=l;k<=m;k++)z=z*(n+k)/k;printfC不同最短路线组合数为:%d\n",z);请输入正整数m,n:7,10不同最短路线条数为:19448实训3带中转站的交通路线在某城区的完整方格交通网中,中转站(a,b)与终点(m,n)为交通网中的任意两交叉点,这里a,b,叫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,ni=20,n=12a=20,b=12,m=9,n=7试5三角网格把ー个正三角形的三边n等分,分别与各边平行连接各分点,得n一三角网格。例如n=6时6一三角网格如图2所示。对指定正整数n»试求n一三角网格中不同三角形(大小不同或方位不同)的个数,以及所有这些三角形的面积之和(设网格中最小的单位三角形的面积为1)。图26一三角网格输入整数n(l<n<120),输出n一三角网格中不同三角形的个数,所有这些三角形的面积之和。测试数据:25100统计求解要点:1)设n一三角网格中所含单位三角形数为p(n),显然从最上层开始的第1层为1个,第2层3个,…,底层为2n-l个。因而有p(n)=1+3+…+(2nT)一般地,设k一三角网格中所含单位三角形数为p(k),则P(k)=l+3+—+(2k-l) (k=l,2,3,…,n)计算出P(l),p(2),-,p(n),为后续计算面积和时使用。2)统计三角形数与面积和时,设三角形的水平边为底,顶角在上或在下把所有三角形分为“正立”与“倒立"两类。设正立三角形的个数为si»其面积之和为SS1.正立三角形从大到小统计:边为n的三角形1个,其面积为p(n);边为n-1的三角形1+2个,每个面积为p(n-l);边为1的三角形l+2+-+n个,每个面积为p(l)。sl=l+(1+2)+(1+2+3)+-+(l+2+—+n)ssl=l*p(n)+(l+2)*p(n-1)+,,,+(l+2+—+n)*p(l)3)设倒立三角形的个数为s2,其面积之和为ss2。倒立三角形从小到大统计:边为1的三角形1+2+…+(n-l)个,每个面积为p(l);边为2的三角形1+2+…+(n-3)个,每个面积为p(2);当n为偶数时,边为n/2的三角形1个,每个面积为p(n/2);s2=l+(1+2+3)+—+(1+2+—+(n-1))ss2=l*p(n/2)+(1+2+3)*p(n/2-1)+…+(1+2+—+(n-l))*p(l)当n为奇数时,边为(n-1)/2的三角形1+2个,每个面积为p((n-l)/2);s2=(1+2)+(1+2+3+4)+,,,+(l+2+*,e+(n-l))ss2=(l+2)*p((n-1)/2)+(1+2+3+4)*p((n-1)/2)+—+(1+2+—+(n-1))*p(1)4)所求n-三角网格中不同三角形的个数为sl+s2,所有这些三角形的面积之和(即所含单位三角形的个数之和)为ssl+ss2。程序设计://n-三角网格中的不同三角形个数及面积之和t51ftinclude<stdio.h>voidmainO{intk,m,n,u,p[1000];longt,tl,t2,si,s2,ssl,ss2;printf(”请输入正整数n:");scanf("%d",&n);for(t=0,k=l;k<=n;k++){t=t+(2*k-l);p[k]=t;}tl=t2=sl=s2=ssl=ss2=0;for(k=l;k<=n;k++) /Z求正立三角形个数及其面积之和{tl=tl+k;sl=sl+tl;ssl=ssl+tl*p[n+l-k];)m=(n%2==0?l:2);for(k=m;k<=n-l;k=k+2)/Z求倒立三角形个数及其面积之和{t2=t2+(k-1)+k;u=(n+l-k)/2;s2=s2+t2;ss2=ss2+t2*p[u];)printfC三角网格中共有三角形个数为:%ld\n*,sl+s2);printfC三角网格中所有三角形面积之和为:%ld\n",ssl+ss2);)数据测试:请输入正整数n:25三角网格中共有三角形个数为:4303三角网格中所有三角形面积之和为:244153请输入正整数n:100三角网格中共有三角形个数为:256275三角网格中所有三角形面积之和为:201941895点评:难点在于统计“倒立”三角形时,需对k分奇数与偶数两种情形分别总结规律。另外,求三角形面积之和时,p数组的建立大大简化了计算。试6双码二部数双码二部数定义:由两个不同数码组成,每个数码多于1位时相连而不分开的正整数称为双码二部数。显然,10是最小双码二部数,3335是一个4位双码二部数,477是ー个3位双码二部数;而333只有一个数码,4474的数码4呈分开状态,都不是双码二部数。对指定的正整数n,探求出n位双码二部数从小到大排序的序列中第m项。依次输入n,m(2<n<100),输出n位双码二部数序列的第m项。测试数据:10,50030,2012求解要点:设双码二部数为a…ab…b(l/aW9,0WbW9),其高部数字a有la位,低部数字b有1b位,显然有la+lb=n(lWla^n-l)为了确保从小到大枚举双码二部数,要注意枚举循环的先后次序:首先,高部数字a须从小到大,范围为1—9;当a确定后,高部位数la简单地从小到大或从大到小都不能确保双码二部数从小到大变化,需配合b分以下3步完成。为便于理解,以le=4,aヨ的递增进程实施标注。la增长(1 le-2)段,lb=leTa,b递增(0 a-l)取值。4000411142224333(la=l,lb=3,b:0——3)4400441144224433(la=2,lb=2,b:0——3)la与lb取定值段,la=le-l,lb=l,b递增(0——9)取值(当b=a时跳过)。

444044414442444344454446444744484449(la=3,lb=l,b:0——9.其中b=4时跳过)la减小(le-2——1)段,lb=le-la,b递增(a+1——9)取值。4455 4466 4477 4488 4499 (la=2,lb=2,b:5——9)4555 4666 4777 4888 4999 (la=l,lb=3,b:5——9)以上3步骤中每ー步骤中都是递增的,且3个步骤衔接中没有重复与遗漏,从而可确保la位的双码二部数从小到大递增,没有重复与遗漏。程序代码:/Z探求n位双码二部数从小到大排序的第m个t61^include<stdio.h>#include<math.h>voidmain(){inta,b,aO,bO,i,n,m,la,lb,laO,IbO,s;printf(< 请依次输入整数n,m:*);scanf(*%d,%d”,&n,&m);s=0;for(a=l;a<=9;a++){for(la=l;la<=n-2;la++)scanf(*%d,%d”,&n,&m);s=0;for(a=l;a<=9;a++){for(la=l;la<=n-2;la++){lb=n-la;for(b=0;b<=a-l;b++){s++:if(s=m)////髙部数字a从小到大枚举髙部位数la分3步骤枚举/Z变量s统计个数/Z记录第m个数的信息{a0=a;bO=b:la0=la;lbO=lb;}))la=n-l:lb=l;for(b=0;b<=9;b++){if(a!=b) /Z当a=b时跳过{s++;if(s=m){aO=a;bO=b;la0=la;lbO=lb;}))for(la=n-2;la>=l;la—){lb=n-la;for(b=a+l;b<=9;b++){s++;if(s=m){a0=a;bO=b;la0=la;lbO=lb;}}))if(m<=s){printfC 职位双码二部数从小到大第%d个数为:ゝn,m);for(i=l;i<=laO;i++)printf("%d”,aO);

for(i=l;i<=lbO;i++)printf("%d”,bO);printf(,\n*);)elseprintfC %d位双码二部数的个数不到%d个。ゝn”,n,m);}数据测试:请依次输入整数n,m:10,50010位双码二部数从小到大第500个数为:7766666666请依次输入整数n,m:30,201230位双码二部数从小到大第2012个数为:888888888888888888888888000000设计改进:/Z探求n位双码二部数从小到大排序的第m个t62ftinclude<stdio.h>#include<math.h>voidmainOinta,b,aO,bO,i,n,m,la,laO,IbO,s;printf(<请依次输入整数n,m:");scanf("%d,%d",&n,&m);a=l;b=0;la=l;s=l;while(la<n-l||a<9||b<8)//此时//此时b不能增!,有以下2种选择//①a增1后,b从〇开始//②a段长增1后,b从a+1开始//a与la不变,b增1if(la=l){a++;b=0:}else{la-;b=a+l;}elseif(b!=a-l)b++;elseif(la!=n-l){la++;b=0:}//a段长增1后,b从〇开始elseif(b<8)b+=2; //b增2跳过a=b情形s++;if(s=m){aO=a;bO=b;la0=la:lbO=n-la;})if(m<=s){printf(" %d位双码二部数从小到大第%d个数为:",n,m);for(i=l:i<=laO;i++)printf("%d”,aO);for(i=l:i<=lbO;i++)printf("%d",bO);printf\n*):)elseprintf(" %d位双码二部数的个数不到%d个。、n”,n,m);实训4双码二部数序列试求双码二部数升序序列的第m项。测试数据:m=2012;m=201241解不等式其中m为从键盘输入的正整数,式中符号为二个“+”号后ー个“ノ号,即分母能被3整除时为“一”。输入正整数m,输出满足不等式的n。测试数据:(1)m=4 (2)m=7设计要点1:式中出现减运算,导致不等式的解可能分段。设置条件循环,每三项(包含二正一负)ー起求和,得一个区间解。然后回过头来ー项项求和,得个别离散解。为叙述方便,ifl,y(n)=1+———+—+---+ —通过循环知s(d+l)>m,且n=d+1为“-”,可得n=d为ー个解;而n=d+2时L0/(n+3)为可得s(d+2)>m;以后各项中,“一”项小于其前面的项,可知对于n>d+2有s(n)>m成立。因而有区间解:nNd在n<d时是否有解,逐个求和检验确定离散解。这ー步不能省,否则出现遗解。程序设计1://解不等式:m<l+l/2-l/3+l/4+l/5-l/6+...+-l/nttinclude<stdio.h>voidmainO{longd,n,m,k;doubles;printf("\n请输入m:");scanf("%d",&m);n=-2;s=0;while(s<=m){n=n+3;s=s+l.0/n+l.0/(n+l)-l.0/(n+2);}d=n+l;s=0; /Z可确定区间解ned(1)for(k=l;k<=n;k++){if(k%3>0)s=s+l.0/k;elses=s-l.0/k;if(s>m)printf(*n=%ld,",k); 〃逐个得离散解printf(*n>=%ld\n”,d);)程序运行示例:请输入m:4n=10151,n=10153,n>=10154请输入!n:7n=82273511,n=82273513,n>=82273514注意:要特别注意,不要把离散解遗失。思考:如果把后一个离散解写入区间解中?设计要点2:为叙述方便,记ゆ)=i+丄ー丄+丄+丄ー丄+…土丄23456 ~n(1)通过循环累加,当加到s=s+l.O/n+1.0/(n+l)-l.0/(n+2);得s(n+2)>m,令d=n+l,可知:n2d为解;(2)此时,s(n)有可能大于叫因而在原s基础上s-1.0/d+l.0/(d+l)得s(n):若s(n)>m,合并得区间解:n^d-1;若s(n)く叫区间解为:n2d;(因可肯定s(n-l)くm)但s(n-2)还有可能大于叫因而在上s基础上s+1.0/(d-2)-l.0/(d-l),得s(n-2):若s(n-2)>m,得一个离散解:n=d-3;若s(n-2)くm,没有离散解。程序设计2://解不等式:m<l+l/2-l/3+l/4+l/5-l/6+...+-l/n#include<stdio.h>voidmainO{longd,n,m;doubles;printf("\n请输入m:");scanf("%d",&m);n=-2;s=0;while(s<=m){n=n+3;s=s+l.0/n+L0/(n+l)-l.0/(n+2);}d=n+l; /Z可确定区间解n,d(1)s=s-l.0/d+l.0/(d+l); /Z得s(n)if(s>m)printfCn>=%ld\n",dT);/Z输出区间解elseprintfCn>=%ld\n",d);s=s+l.0/(d-2)-l.0/(d-1): 〃得s(n-2)if(s>m)printf("n=%ld\n”,d-3); /Z输出ー个离散解}数据测试:请输入m:4n>=10153n=10151请输入m:7n>=82273513n=82273511程序设计3:请判断以下程序是否正确?//解不等式:m<l+l/2-l/3+l/4+l/5-l/6+...+-l/nttinclude<stdio.h>voidmainO{doublen,m,s;printf("\n请输入m:");scanffan);n=0;s=3.0/2;while(s<=m){n=n+3;s=s-l.0/n+l.0/(n+l)+l.0/(n+2);}d=n+2;printfCn=%.OfJ,d); /Z得一个离散解(1)s=s-l.0/(n+3)+l.0/(n+4);d=n+4;if(s>m)printfCn〉=%.Of\n",d);/Z可确定区间解n2d(2)elseprintf(<n>=%.0f\n”,d+1); //??}(1)首先s(d)>m,n=d为ー个解;而s(d-3)く=m,n=d-2为“-”项,其绝对值大于n=d-l的“+”项,可得s(d-l)Qi;且知n<d时无解。同时由一丄+丄 しく〇,可得s(d+l)く!n,即n=d为ー个离散解。(2)当s(n+4)>m时,以后的“一”项绝对值小于其前面的“+”项,故得区间解n2d;当s(n+4)<=m时,因———+ +—>0可知s(n+5)>m5但不能确定s(n+6)>0,〃+3n+4n+5因而不能确定n2d+l为区间解!2求最大值设指定区间[a,を内的正整数x,y,z,w满足x2+y2+z2=w2其中aWx〈yくz〈wWb,试求s=x+y+z+w的最大值。输入正整数a,b(l^a<b<10000),输出s的最大值。测试数据:a=500,b=1000a=1000,b=2012设计要点:对每ー组满足条件的解,通过比较求得最大值。程序设计:/Z求最大值#include<stdio.h>ftinclude<math.h>voidmainO{longa,b,d,s,x,y,z,w,max;printfC请输入区间[a,b]的上下限a,b:*);scanf("%ld,%ld”,&a,&b);max=0;for(x=a;x<=sqrt(b*b/3);x++)for(y=x+l;y<=sqrt((b*b-x*x)/2);y++)for(z=y+l;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) /Z满足条件时统计{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,2012s的最大值为: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个元素(以放置横向段)的组合数,不同路线条数为n+mn+m-i n+1今设置了路线中的必经点(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=lo2)若a>0且b〉O,即a,b为正整数时,y=Cス为了求z,分以下两种情形计算:1)若m=a或n=b,即必经点与终点在横向或纵向同线,z=l»2)若mWa且nWb,必经点与终点在横向相差レ司,在纵向相差|ゼ,/。程序设计:/Z带中转站的最短路线tfinclude<stdio.h>#include<math.h>voidmainO{doublea,b,c,d,叫n,k,y,z;printf(・请输入正整数a,b:*);scanf %lf",&a,&b);printf(・请输入正整数m,n:*);scanf %lf*,&m,&n);y=l;if(a*b>0)for(k=l;k<=a;k++)y=y*(b+k)/k; /Z计算C(a+b,a)z=l;if((m-a)*(n-b)!=0){c=fabs(m-a);d=fabs(n-b);for(k=l;k<=c;k++)z=z*(d+k)/k; /Z计算C(|nra|+|n-b|,|nra|)}printfC不同最短路线条数为:%.Of\n*»y*z);}数据测试:请输入正整数a,b:9,7请输入正整数叫n:20,12不同最短路线条数为:49969920请输入正整数a,b:20,12请输入正整数m,n:9,7不同最短路线条数为:986263125120附无障碍无中转站的交通路线问题程序:/Z无障碍完整交通路线问题♦♦include<stdio.h>voidmainO{intk,m,n,x,y,z,f[50][50];printf(“请输入正整数m,n:");scanf("%d,%d",&m,4n);for(x=l;x<=m;x++)f[x][0]=l;for(y=l;y<=n;y++)f[0][y]=lI〃确定边界条件for(x=l;x<=m;x++)for(y=l;y<=n;y++) /Z实施递推得目标值f(叫n)f[x][y]=f[x-l][y]+f[x][y-1];printf(・不同最短路线条数为:%d\n*,f[m][n]);z=l;for(k=l;k<=m;k++)z=z*(n+k)/k;printfC不同最短路线组合数为:%d\n”,z);请输入正整数叫n:7,10不同最短路线条数为:194484双码二部数序列试求双码二部数升序序列的第m项。测试数据:m=2012;m=20124设计1:把双码二部数升序序列的第m项换算为n位的第mO项。注意到2位双码二部数共9*9=81个;3位双码二部数共2*9*9=2*8I个;//求双码二部数升序序列的第m项#include<stdio.h>♦♦include<math.h>voidmainO{inta,b,aO,bO,i,n,m,mO,la,lb,laO,IbO,s;printfC 请依次输入整数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位的第mO项for(a=l;a<=9;a++) //髙部数字a从小到大枚举{for(la=l;la<=n-2;la++)/Z髙部位数la分3步骤枚举{lb=nTa;for(b=0;b<=a-l;b++)

{s++! 〃变量s统计个数if(s=mO) /Z记录第m个数的信息{aO=a;bO=b;laO=la;lbO=lb;}))la=n-l;lb=l;for(b=0;b<=9;b++)if(a!=b) /Z当a=b时跳过{s++;if(s=mO){aO=a;bO=b;laO=la;lbO=lb;}}for(la=n-2;la>=l;la-){lb=n-la;for(b=a+l;b<=9;b++){s++;if(s==mO){aO=a;bO=b;laO=la;lbO=lb;})))printfC 双码二部数升序序列的第%d个数为:。m);for(i=l;i<=laO;i++)printfaO);for(i=l;i<=lbO;i++)printfbO);printf("\n");printf(* (式中%d个%d,%d个%d)\n”,laO,aO,IbO,bO);)设计2:从n=2位开始统计//求双码二部数从小到大排列的第m个数#include<stdio.h>voidmain(){inta,b,aO,bO,i,m,n,p,la,laO,IbO;printf(・请输入整数m:");scanf("%d",&m);n=l;p=0;while(l){n++;p++;a=l;b=O;la=l; //默认n位第1个为1后n-1个〇if(p=m){aO=a;bO=b;laO=la;lbO=n-laO;break:}while(la<n-l||a<9||b<8){p++://此时//此时b不能增!»有以下2种选择〃①a增1后,b从0开始//②a段长增1后,b从a+1开始if(la=l){a++;b=0;}else{la-;b=a+l;}elseif(b!=a-l)b++;elseif(la!=n-l){la++;b=O;}elseif(b<8)b+=2;//a与la不变,b增1//a段长增1后,b从0开始//b增2跳过a=b情形if(p=m){aO=a;bO=b;laO=la;lbO=n-laO;break;})if(p=m)break;}printf(" 第%d个双码二部数为:%d(%d)%d(%d)\n*.m,aO,laO,b,IbO):printfC 其中从小到大第%d个数为:",m);for(i=l;i<=laO;i++)printfaO);for(i=l;i<=lbO;i++)printfbO);printf("\n");)数据测试:请依次输入整数m:2012双码二部数升序序列的第2012个数为:55999999(式中2个5,6个9)请依次输入整数m:20124双码二部数升序序列的第20124个数为:88882222222222222222222(式中4个8,19个2)5求代数和设n为正整数,求和,& 6 V4 工品5=14- 4- +…土 1-1/21-1/2+1/31-1/2+1/3-1/4 1-1/2+…±1/”式中各项符号为二正一负,分母符号为一正ー负。正整数n从键盘输入,输出和s四舍五入精确到小数点后5位。输入n=100 输出:输入n=2012输出:/Z求代数和1#include<stdio.h>#include<math.h>voidmainO{longj,n;doublets,s;printf(・请输入n:");scanf&n);j=O;ts=O;s=O;while(j<n){j=j+l;if(j%2=0)ts=ts-(double)1/j; 〃ts为各项的分母elsets=ts+(double)1/j;if(j%3=0)s=s-sqrt(j)/ts; //求代数和selses=s+sqrt(j)/ts;}printf("s=%・5f\n”,s);)/Z求代数和2ttinclude<stdio.h>#include<math.h>voidmainO{doublej,n,ts,s;printf(・请输入n:");scanf(*%lfd*,&n);j=O;ts=O;s=O;while(j<n)(j=j+l;if(fmod(j,2)=0)ts=ts-l/j; //ts为各项的分母elsets=ts+l/j;if(fmod(j,3)=0)s=s-sqrt(j)/ts; //求代数和selses=s+sqrt(j)/ts;)printf(*s=%.5fヽin”,s);请输入n:100s=324.74013请输入n:2011s=28924.48725请输入n:2012s=28989.22300变通:设2くnW2012,当n为何值时,和s最接近2012?6合数世纪探求.问题的提出20世纪的!00个年号[1901—2000]中有13个素数,而21世纪的100个年号[2001,2100]中有14个素数。那么,是否存在ー个世纪的100个年号中一个素数都没有?定义ー个世纪的100个年号中不存在ー个素数,即100个年号全为合数的世纪称为合数世纪。设计程序探索第m(约定水100)个合数世纪。测试数据:1)m=l2)m=102•设计要点应用穷举搜索,设置a世纪的的50个奇数年号(偶数年号无疑均为合数)为b,用k试商判别b是否为素数,用变量s统计这50个奇数中的合数的个数。对于a世纪,若s=50,即50个奇数都为合数,找到a世纪为合数世纪,用n统计合数世纪的个数。当n=m时打印输出a世纪。当n=m时退出循环结束。.合数世纪程序设计/Z探求第1个与第m个合数世纪#include<stdio.h>tfinclude<math.h>voidmainO{longa,b,k;intm,n,s,x;printf("请确定m:祝);scanf("%d",&m);a=l;n=0;while(1){a++;s=0; /Z检验a世纪for(b=a*100-99;bく=a*100T;b+=2) 〃穷举a世纪奇数年号b{x=0;for(k=3;k<=sqrt(b);k+=2)if(b%k=O){x=l;break;}if(x=0)break;/Z当前为非合数世纪时,跳出循环进行下ー个世纪的探求s=s+x; 〃年号b为合数时,x=l,S增1}if(s=50) //s=50,即50个奇数均为合数{n++;if(n=m)printfC第%d个合数世纪为:%ld世纪。、n”,n,a);}if(n=m)break;.程序运行示例请确定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)质因数分解乘积形式程序设计/Z质因数分解乘积形式#include"math.h"ftinclude<stdio.h>voidmainO{longintb,i,k,m,n,w=0;printfCDn,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>l){printf(*%ld**,k);continue; //k为质因数,返回再试)if(b==l)printf(*%ld\n*,k);}k++;}if(b>l&&b<i)printfC%ld\n*,b); /Z输出大于i平方根的因数if(b=i){printf("(素数!)、n");w++;} //b=i,表示i无质因数}printf("其中共%d个素数.、n”,w);}1671861=3*31*179775845276=2*2*223*6553[m,n]中整数分解质因数(乘积形式)请输入叫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=12232*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*13101*165531671854=2*8359271671855=3*5*227*4911671856=2*2*2*2*1044911671857=11*11*41*3371671858=2*3*3*293*3171671859=7*2388371671860=2*2*5*179*4671671861=3*31*179771671862=2*8359311671863=359*46571671864=2*2*2*3*696611671865=5*13*17*17*891671866=2*7*1194191671867=3*3*3*19*32591671868=2*2*11*379971671869=83*201431671870=2*3*5*23*24231671871=487*34331671872=2*2*2*2*2*2*151*1731671873=3*7*796131671874=2*8359371671875=5*5*5*5*5*5*1071671876=2*2*3*3*464411671877=79*211631671878=2*13*643031671879=3*11*292*2*2*5*7*7*8531671881=331*50511671882=2*3*17*37*4431671883=43*59*6591671884=2*2*47*88931671885=3*3*5*53*7011671886=2*19*439971671887=7*2388411671888=2*2*2*2*3*61*5711671889=521*32091671890=2*5*11*151991671891=3*13*163*2631671892=2*2*31*97*1391671893=23*157*4631671894=2*3*3*3*7*44231671895=5*3343791671896=2*2*2*103*20291671897=3*181*30791671898=2*41*203891671899=17*98347其中共0个素数.8统计试统计含有数字7且不能被7整除的m位整数的个数si,并指出这si个数中不含有数字4的整数的个数s2»输入叫输出si,s2。m=5.输出: m=6,输出: (1)设计要点首先通过乘m-1个10计算m位数的起点b=l(T(m-l),为枚举提供范围t(b-10*b-l)〇为了检测m位数t含有多少个数字7,每个m位整数t赋给d(以保持t不变),然后通过m次求余先后分离出t的m个数字c,if(c=7)f++,统计整数t中数字7的个数fo同时统计数字4的个数g。如果f>0,说明整数t中含有数字7。如果g=0,说明整数t中不含数字4。对每ー个m位整数,据f>0&&t%7>0,si作相应统计。据f>0&&t%7>0&&g==0,s2作相应统计。(2) 程序设计/Z统计含数字7且不能被7整除的m位整数的个数si»其中不含数字4的个数s2#include<stdio.h>voidmain(){intc,f,g,i,j,m;longb,d,si,s2,t;printf(・请输入位数m(2<=m<=9):");scanf(*%d*,&m);b=l;sl=0;s2=0;for(i=2;i<=m;i++)b=b*10; //计算m位数的起点for(t=b;t<=10*b-l;t++)/Z枚举每一个m位数{d=t;f=0;g=0;for(j=l;j<=m;j++){c=d%10;d=d/10:if(c=7)f++;/Z统计数字7的个数if(c=4)g++;/Z统计数字4的个数)if(f>0&&t%7>0)sl++;/Z统计含数字7且不能被7整除数的个数if(f>0&&t%7>0&&g==0)s2++;/Z统计其中不含数字4的个数)printf(*sl=%ld,s2=%ld\n*,si,s2);}(3)程序运行示例请输入位数m(2<=k<=9):5sl=32152,s2=20412请输入位数m(2<=k<=9):6s1=366522,s2=208300变通1J试统计含有数字7且能被7整除的没有重复数字的m位整数的个数si,并指出其中最大的ー个数。为了比较是否存在重复数字,设置f数组,f[3]=2为2个数字“3”。ttinclude<stdio.h>voidmain(){intc,e,g,i,j,m,f[10];longb,d,si,t;printf("请输入位数m(2<=m<=9):");scanf("%d",&m);b=l;sl=0;for(i=2;i<=m;i++)b=b*10; //计算m位数的起点for(t=b;t<=10*b-l;t++)/Z枚举每一个m位数{d=t;for(j=0;j<=9;j++)f[j]=0;/Z数组清零for(j=l;j<=m;j++){c=d%10;d=d/10;f[c]++J 〃统计数字c的个数)for(g=0,j=0;j<=9:j++)if(f[j]>l)g=l; 〃存在重复数字标注g=lif(f[7]>0&&t%7==0&&g=0){sl++;e=t;} /Z统计个数,并把满足条件的数赋值给e)printf(*sl=%ld,e=%d\n”,si,e);}请输入位数m(2<=m<=9):5sl=1978,e=98763请输入位数m(2<=m<=9):6sl=11704,e=987651变通2;试统计恰含一个数字7与2个数字4且能被7整除的m(m>3)位整数的个数sL并指出其中从小到大排序的第n个数。ftinclude<stdio.h>voidmainO{intc,e,i,j,m,n,f[10];longb,d,si,t;printf(・请输入m,n:つ;scanf(*%d,%d",&m,&n);b=l;sl=0;for(i=2;i<=m;i++)b=b*10; //计算m位数的起点for(t=b;t<=10*b-l;t++)/Z枚举每一个m位数{d=t;for(j=0;j<=9;j++)f[j]=O;/Z数组清零for(j=l;j<=m;j++){c=d%10;d=d/10;f[c]++; 〃统计数字c的个数}if(f[7]=l&&f[4]=2&&t%7=0){sl++;if(sl=n)e=t; /Z统计个数,并把第n个数赋值给e))printf(*sl=%ld,e=%d\n*,si,e);)请输入叫n:6,1000sl=4096,e=4172429真分数最值统计分母在指定区间[a,b]的最简真分数(分子小于分母,且分子分母无公因数)共有多少个,并求其中最接近指定分数x/y的最简真分数。输入a,b,输出[a,b]中最简真分数的个数、指出最接近417/2011的最简真分数。测试数据:a=10,b=99,输出:a=100,b=999,输出:(1)设计要点设计求解一般情形:统计分母在指定区间[a,b]的最简真分数的个数,并求这些最简真分数的和(正整数a,b从键盘输入)。设分数分子为i,分母为j,最简真分数的个数为n,其和为s。在指定范围[a,b]内枚举分数的分母j:a——b;同时对每ー个分母j枚举分子i:l j-lo对每一分数i/j,置标志t=0,然后进行是否存在公因数的检测。如果分子i与分母j存在大于1的公因数u,说明i/j非最简真分数,应予舍略。因为分子分母同时约去u后,分母可能不在[a,b],即使在[a,b]时前面已作了统计求和。注意到公因数u的取值范围为[2,i],因而设置u循环在⑵i]中枚举,若满足条件j%u==0&&i%u==0说明分子分母存在公因数,标记t=l后退出,不予统计与求和。否则保持原t=0,说明分子分母无公因数,用n实施迭代“n=n+l”统计个数。为了求最接近s=x/y的最简真分数,设双精度型变量smin存储丨i/j-x/y|的最小值,把分数i/j转变为double型减去s并求绝对值与smin比较,若fabs((double)i/j-s)<smin»则把fabs((double)i/j-s)赋值给smin,同时用il存储i,用j存储lj。每得一个最简真分数i/j,就与smin比较一次。枚举完成,则il/jl即为所求最接近x/y的最简真分数。(2)求最简真分数程序设计/Z求分母在[a,b]的最简真分数的个数,及最接近x/y的分数•include<stdio.h>•include<math.h>voidmainO{inta,b,i,j,il,jl,t,u,x,y;longn;doubles,smin;printf(・最简真分数分母在[a,b]内,请确定a,b:");scanf(*%d,%d*,&a,&b);/Z输入区间的上下限printf("指定分数为x/y,请确定x,y:;scanf(*%d,%d*,&x,&y);/Z输入指定分数n=0;s=(double)x/y;smin=10;for(j=a;j<=b;j++) /Z枚举最简真分数的分母for(i=l;i<=j-l;i++)/Z枚举最简真分数的分子{for(t=0,u=2;u<=i;u++) /Z枚举因数if(j%u==0&&i%u==0){t=l;break;} /Z分子分母有公因数,则舍去if(t=0){n++; /Z统计最简真分数个数if(fabs((double)i/j-s)<smin){smin=fabs((double)i/j-s);il=i;jl=j;}/Z比较求最接近x/y的最简真分数)}printf(*最简真分数个数:%ld\n",n);printf(*最接近%d/%d的最简真分数为:%d/%d\n*,x,y,il,jl);(3)程序运行示例最简真分数分母在[a,b]内,请确定a,b:10,99指定分数为x/y,请确定x,y:417,2011最简真分数个数:2976最接近417/2011的最简真分数为:17/82最简真分数分母在[a,b]内,请确定a,b:100,999指定分数为x/y,请确定x,y:417,2011最简真分数个数:300788最接近417/2011的最简真分数为:62/29910特定数字组成的平方数用数字2,3,5,6,7,8,9可组成多少个没有重复数字的7位平方数?解:求出最小7位数的平方根b,最大7位数的平方根c.用a枚举[b,c]中的所有整数,计算d=a*a,这样确保所求平方数在d中。设置f数组统计d中各个数字的个数。如果f[3]=2,即平方数d中有2个“3”。检测若f[k]〉l(k=O~~9),说明d中存在有重复数字,返回。在不存在重复数字的情形下,检测若f[0]+f[l]+f[4]=0,说明7位平方数d中没有数字“〇”,"1",“4”,d满足题意要求,打印输出。/Z组成没有重复数字的7位平方数#include<math.h>#include<stdio.h>voidmain(){intk,m,n,t,f[10];longa,b,c,d,w;n=0;b=sqrt(2356789);c=sqrt(9876532);for(a=b;a<=c;a++){d=a*a;w=d; /Z确保d为平方数for(k=0:k<=9:k++)f[k]=O;while(w>0){m=w%10;f[m]++;w=w/10;}for(t=0,k=l;k<=9;k++)if(f[k]>l)t=l; /Z测试平方数是否有重复数字if(t==O&&f[0]+f[l]+f[4]==0)/Z测试平方数中没有数字0,1,4{n++;printf(*%2d:*,n);printf(*%ld=%ld*2\n*,d,a);printfC共可组成%d个没有重复数字的7位平方数.\n",n);}3297856=1816^23857296=1964-25827396=2414-26385729=2527-28567329=2927^29572836=3094/共可组成6个没有重复数字的7位平方数.变通1:用1,2,…,9这9个数字可以组成多少个没有重复数字的9位平方数?/Z组成没有重复数字的9位平方数ttinclude<math.h>ttinclude<stdio.h>voidmainO{intk,m,n,t,f[10];longa,b,c,d,w;n=0;b=(int)sqrt(123456789);c=(int)sqrt(987654321);for(a=b;a<=c;a++){d=a*a;w=d; /Z确保d为平方数for(k=0;k<=9;k++)f[k]=0;while(w>0){m=w%10げ[m]++;w=w/10;}for(t=0,k=l;k<=9;k++)if(f[k]>l)t=l;/Z测试平方数是否有重复数字if(t=0&&f[0]=0)〃测试平方数中没有重复数字,也没有数字〇{n++;printf(*%2d:",n);printf("%ld=%ld*2\n",d,a);)}printf("共可组成%d个没有重复数字的9位平方数.'n",n);)139854276=11826~2152843769=12363~2157326849=12543^2215384976=14676^2245893761=15681-2254817369=15963c2326597184=18072/361874529=19023へ2375468129=19377"382945761=19569"385297641=19629"412739856=20316"523814769=22887"529874361=23019"537219684=23178"549386721=23439"587432169=24237"589324176=24276"597362481=24441"615387249=24807"627953481=25059"653927184=25572"672935481=25941"697435281=26409"714653289=26733"735982641=27129"743816529=27273へ2842973156=29034"847159236=29106"923187456=30384"共可组成30个没有重复数字的9位平方数.1I构建横竖折对称方阵试观察图所示的横竖折对称方阵的构造特点,总结归纳其构造规律,设计并输出n(奇数)阶对称方阵。3210123221012211101110000000111011122101223210123图7阶横竖对称方阵输出15阶、19阶横竖折对称方阵。解:这是一道培养与锻炼观察能力、归纳能力与设计能力的有趣案例。设置2维数组a[n][n]存储n阶方阵的元素,数组a[n][n]就是数据结构。本案例求解算法主要是给a数组赋值与输出。ー个ー个元素赋值显然行不通,必须根据方阵的构造特点,归纳其构建规律,分区域给各元素赋值。构造规律与赋值要点观察横竖折对称方阵的构造特点,方阵横向与纵向正中有一对称轴。两对称轴所分4个小矩形区域表现为同数字横竖折递减,至4顶角元素为1。设阶数n(奇数)从键盘输入,对称轴为m=(n+l)/2。设置2维a数组存储方阵中元素,行号为i,列号为j,为第i行第j列元素。可知主对角线(从左上至右下)有:i=j;次对角线(从右上至左下)有:i+j=n+l。按两条对角线把方阵分成上部、左部、右部与下部4个区,如图所示。图对角线分成的4个区对角线上元素可归纳到上、下部,即上、下部区域带等号即可。上、下部按列号j的函数m-abs(m-j)赋值:if(i+j<=n+l&&i<=jIIi+j>=n+l&&i>=j)a[i][j]=m-abs(m-j);左、右部按行号i的函数m-abs(m-i)赋值:if(i+j<n+l&&i>j11i+j>n+l&&i<j)a[i][j]=m-abs(m-i);输出时,按m-a[i][j]打印。(2)程序设计/Z横竖折对称方阵^include<stdio.h> /Z调用2个头文件#include<math.h>voidmain(){inti,j,m,n,a[30][30]; //定义数据结构printf(・请确定方阵阶数(奇数)n:");scanf("%d",&n);if(n%2=0) {printf(・请输入奇数!”

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论