C语言middle.docx
《C语言middle.docx》由会员分享,可在线阅读,更多相关《C语言middle.docx(28页珍藏版)》请在冰点文库上搜索。
![C语言middle.docx](https://file1.bingdoc.com/fileroot1/2023-5/5/ae4e6b09-feff-4247-b64d-ae7bafffbb82/ae4e6b09-feff-4247-b64d-ae7bafffbb821.gif)
C语言middle
Problem1三角形的个数
方法1:
#include<>
intisTriangle(inta,intb,intc).,array[3]存放千位
toArray(n,array);
if(array[3]+array[1]==array[2]*array[0])
return1;
else
return0;
}
intsqrtTest(intn)定义一个按规则构造好的10*10的数组s,定义一个10*10的数组t;
2.读入n,将数组t用0值初始化,将数组s中符合规则的数复制到数组t中,数组t中非0元素需要输出,0元素无需输出;
3.确定数组t中输出的开始行、结束行、开始列、结束列;
4.输出非0元素。
*/
#include<>
#include<>
voidoutput2(int*p).+n-1+n+n-1+n-2+...+1
*/
#include<>
intmain()
{
intlevel,i;
while(scanf("%d",&level)==1)
{
for(i=1;i{
printf("%d+",i);
}
printf("%d",level);
for(i=level-1;i>=1;i--)
{
printf("+%d",i);
}
printf("\n");
}
return0;
}
Problem19三艘船
#include<>
constintMAX_DAY=100;
intmain(){
intspeed[3];
inthour[3];
intdis[3];
charfound;
inti,j,k;
while(scanf("%d%d%d",hour+0,hour+1,hour+2)==3)
{
scanf("%d%d%d",speed+0,speed+1,speed+2);
found=0;
for(i=0;ifound;i++)
{
dis[0]=(i*24+hour[0])*speed[0];
for(j=0;jfound;j++)
{
dis[1]=(j*24+hour[1])*speed[1];
if(dis[0]==dis[1])lf\n",p[n]);
}
return0;
}
Problem26菱形输出
/*两个字母间的空格用变量space控制,space初始值为1,
i:
2-n时,space=space+2
i:
n+1-2n-2时,space=space-2
*/
#include<>
voidoutput(inti,intn,char*a)
{
intj;
for(j=i;j>1;j--)
printf("");
printf("%c",*a);
(*a)--;
for(j=0;j<2*(n-i)-1;j++)
printf("");
printf("%c\n",*a);
(*a)--;
}
intmain()
{
intn,i,j;
intr=0;
chara;
while(scanf("%d",&n)==1)
{
if(r!
=0)printf("\n");
r++;
a='Z';
nv++nc++nv--nc--uit);uit)
{
case'S':
poker[i][j].v=4;break;
case'H':
poker[i][j].v=3;break;
case'D':
poker[i][j].v=2;break;
case'C':
poker[i][j].v=1;break;
}
scanf("%c",&t);alue=t-'0';
else
{
switch(t)
{
case'A':
poker[i][j].value=14;break;
case'K':
poker[i][j].value=13;break;
case'Q':
poker[i][j].value=12;break;
case'J':
poker[i][j].value=11;break;
case'T':
poker[i][j].value=10;break;
}
}
}
}
qsort(poker[0],13,sizeof(structcard),cmp);uit);
if(poker[i][j].value>=10)
switch(poker[i][j].value)
{
case14:
printf("A");break;
case13:
printf("K");break;
case12:
printf("Q");break;
case11:
printf("J");break;
case10:
printf("T");break;
}
else
printf("%d",poker[i][j].value);
}
printf("\n");
}
}
return0;
}
Problem32乒乓球
#include<>
#include<>
voidsolve(char*str,intbase);
intmain()
{
charstr[100],ts[31];
intlen;
inti;
intw,l;
while(gets(ts)!
=NULL)
{
strcpy(str,ts);
len=strlen(ts);
while(ts[len-1]!
='E')
{
gets(ts);
strcat(str,ts);
len=strlen(ts);
}otorcycleType);
}
voidinput()
{
inti;
for(i=0;imotor[i].f=0;
}
}
intFindMotor(char*motorName)otorcycleType,motorName)==0)
returni;
return-1;
}
voidslv()
{
inti,j;
intfound=0;
for(i=0;i{
j=FindMotor(motorList[i]);
if(j!
=-1)
{
motor[j].f=1;
found=1;
}
}
if(!
found)
printf("Cannotfound!
\n");
else
{
for(i=0;iif(motor[i].f)
printf("%s%s%s\n",motor[i].motorcycleType,motor[i].color,motor[i].motorType);
}
}
intmain()
{
while(scanf("%d%d",&n,&m)==2)
{
input();
qsort(motor,m,sizeof(structMotor),cmp);因为要求最先出列的k个人都是绑匪,如果m<=k,则第1个出列的就是人质,所以m>=k+1。
所以m(外循环变量i)可以k+1、k+2…进行枚举。
4.针对每个m,参与游戏的人数(内循环变量i)依次为2k、2k-1…k+1。
i个人报数时,该出列的人的编号计算公式为s=(s+m)%i,如果s>k(第k到第i-1个绑匪)或s=0(第i个绑匪),则表示出列的是绑匪,否则是人质。
5.内循环时,如果出列的是人质,则表示当前的m不合适,这时离开内循环,开始下一轮外循环;如果出列的是绑匪,则进行下一轮内循环。
如果内循环正常结束,则表示出列的k个人都是绑匪,结束外循环,输出找到的m即可。
*/
#include<>
intmain(){
intk,m;
intfind,s,i;
while(scanf("%d",&k)==1)
{
m=k;
do
{
m++;
find=1;.、2位数、1位数
{
sum=0;
for(cnt=0;cnt{
sum=sum*10+str[j+cnt]-'0';
}
if(isprime(sum)&&sum>max)
{
max=sum;
}
}
len--;
}
printf("%d\n",max);
}
}
Problem46日期比较
#include<>
intd1,m1,y1;
intd2,m2,y2;
voidprinta()
{
printf("%02d%02d%disearlierthan%02d%02d%d\n",d1,m1,y1,d2,m2,y2);
}
voidprintb()
{
printf("%02d%02d%disearlierthan%02d%02d%d\n",d2,m2,y2,d1,m1,y1);
}
intmain()
{
while(scanf("%d%d%d%d%d%d",&d1,&m1,&y1,&d2,&m2,&y2)!
=EOF)
{
if(y1elseif(y2elseif(m1elseif(m2elseif(d1elseprintb();
}
return0;
}
Problem47魔方阵
#include<>
intmain(){
intn,i,j;
intr=0;
inta[19][19];
intcolumn,line,num;
intnextColumn,nextLine;
while(scanf("%d",&n)!
=EOF)
{
if(r!
=0)printf("\n");
r++;
memset(a,0,sizeof(a));
column=n/2;//规则1
line=0;
for(num=1;num<=n*n;num++)//构造魔方阵
{
a[line][column]=num;
nextLine=line-1;//规则2
nextColumn=column+1;
if(nextLine<0)nextLine=n-1;//规则3
if(nextColumn==n)nextColumn=0;//规则4
if(a[nextLine][nextColumn]!
=0||(line==0&&column==n-1))//规则5
{
line=line+1;
if(line>=n)line=0;
}
else
{
line=nextLine;
column=nextColumn;
}
}
for(i=0;i{
printf("%d",a[i][0]);
for(j=1;jprintf("%d",a[i][j]);
}
printf("\n");
}
}
return0;
}
Problem48最长的单词
#include<>
#include<>
intmain(){
chartemp[1000],rs[1000];
while(gets(temp)!
=NULL)
{
intmaxLen=0,len;
char*p=strtok(temp,"\n");//在temp中,以空格和换行符为分割符寻找单词
while(p)
{
len=strlen(p);
if(len>maxLen)
{
maxLen=len;
strcpy(rs,p);
}
p=strtok(NULL,"\n");//第2次开始后的调用
}
printf("%d%s\n",maxLen,rs);
}
return0;
}
Problem49奖学金
#include<>
#include<>
intmain(){
intfinalScore,appraiseScore,thesis;
charcadre,west,name[21],max_name[21];
intn;
intr=0;
while(scanf("%d",&n)!
=EOF)
{
intsum=0,max=-1,i;
if(r!
=0)printf("\n");
r++;
for(i=0;i{
inttemp=0;//某个学生的奖学金
scanf("%s%d%d%*c%c%*c%c%d",name,&finalScore,&appraiseScore,&cadre,&west,&thesis);//ok
//scanf("%s%d%d%1s%*c%c%d",name,&finalScore,&appraiseScore,&cadre,&west,&thesis);//ok
//scanf("%s%d%d%*c%c%1s%d",name,&finalScore,&appraiseScore,&cadre,&west,&thesis);//NO
//scanf("%s%d%d%1s%1s%d",name,&finalScore,&appraiseScore,&cadre,&west,&thesis);//NO
if(finalScore>80&&thesis>0)//院士奖学金
{
temp+=8000;
}
if(finalScore>85&&appraiseScore>80)//五四奖学金
{
temp+=4000;
}
if(finalScore>90)//成绩优秀奖
{
temp+=2000;
}
if(finalScore>85&&'Y'==west)//西部奖学金
{
temp+=1000;
}
if(appraiseScore>80&&'Y'==cadre)//班级贡献奖
{
temp+=850;
}
if(temp>max){
max=temp;
strcpy(max_name,name);
}
sum+=temp;
}
printf("%s\n%d\n%d\n",max_name,max,sum);
}
return0;
}
Problem50序列
/*放球方法:
后1个盒子中比前1个盒子多放1个球;
最后剩余的remain个球依次从最后1个盒子开始往前,每个盒子增加1个,直到放完为止。
该方法能保证小球装入盒子的规则
*/
#include<>
intmain()
{
intballCnt;
intbox[140];//10000-(1+n)*n/2<=n,n的大小为140
inti;
intremain;//还未放入盒子中的球数
intlastBox;//最后一个盒子中放的球数
intboxCnt;//放有球的盒子总数
while(scanf("%d",&ballCnt)!
=EOF&&ballCnt)
{
remain=ballCnt;
lastBox=0;
for(i=0;remain>lastBox;i++)
{
box[i]=i+1;
remain-=i+1;
lastBox=box[i];
}
boxCnt=i;
while(remain>0)
{
i--;
box[i]++;
remain--;
}
for(i=0;i{
printf("%d,",box[i]);
}
printf("%d\n",box[i]);
}
return0;
}
Problem51树
#include<>
#include<>
intmain(){
intL,M;
charroad[10001];//1:
代表有树;0:
代表树已移走
intcnt,i,j;
intleft,right;
while(scanf("%d%d",&L,&M)!
=EOF){
memset(road,1,L+1);//road数组的前L+1个字节置初始值1
cnt=L+1;//初始树的棵数
for(i=0;i{
scanf("%d%d",&left,&right);
for(j=left;j<=right;j++)
{
if(road[j]){
cnt--;
road[j]=0;
}
}
}
printf("%d\n",cnt);
}
return0;
}
Problem52三角形
#include<>
intmain(){
ints,n;
intr=0,i,j;
while(scanf("%d%d",&s,&n)==2)
{
if(r!
=0)
printf("\n");
r++;
for(i=1;i<=n;i++)//控制输出的行数
{
for(j=1;j<=i;j++)//控制每行输出的数字个数
{
printf("%d",s);
if(j
{
printf("");
}
else
{
printf("\n");
}
s=s%9+1;//计算下一次输出的数字
}
}
}
return0;
}
Problem53回文数2
/*middle53:
给你一个整数(十进制),
判断该整数的十进制数和它的二进制数是否全为回文数。
*/
#include<>
#include<>
intisPalindrome(char*number);
intmain()
{
intn;
chardecimal[4];//(0,1000),十进制不超过3位
charbinary[11];//(0,1000),二进制不超过10位
while(scanf("%d",&n)==1)
{
itoa(n,binary,2);//将n转换成2进制的数字字符串,存放到binary中
itoa(n,decimal,10);//将n转换成10进制的数字字符串,存放到decimal中
if(isPalindrome(decimal)&&isPalindrome(binary))
printf("Yes\n");
else
printf("No\n");
}
return0;
}
intisPalindrome(char*number)//判断number所指向的数是否是回文数
{
char*head=number;
char*tail=head+strlen(number)-1;
while(head{
if(*head!
=*tail)
return0;
head++;
tail--;
}
return1;
}
Problem54加法器
//与easy45题类似,且更简单
#include<>
#include<>
#include<>
intmain()
{
char*p;//存放分离出来的数字字符串
chartemp[1001];
intsum,tint;
while(gets(temp)!
=NULL)
{
sum=0;
p=strtok(temp,"+");//第1次分离
while(p)
{
tint=atoi(p);//数字字符串转换成整数
sum+=tint;
p=strtok(NULL,"+");//第2次开始分离
}
printf("%d\n",sum);
}
return0;
}
Problem55数列1
#include<>
intarr[50];
intmain()
{
intn;
inti,j,cnt,sum;
while(scanf("%d",&n)==1)
{
cnt=0;
for(i=0;iscanf("%d",arr+i);
for(i=0;i{
sum=0;
for(j=i;j{
sum+=arr[j];
if(sum%11==0)
cnt++;
}
}
printf("%d\n",cnt);
}
return0;
}
Problem56数列2
#include<>
intarr[15];
intmain()
{
intn,i,j,cnt,tmp,res;
while(scanf("%d",&n)==1)
{
cnt=0;
for(i=0;iscanf("%d",arr+i);
for(i=1;i<=((1<