e=a[t][0];a[t][0]=a[j][0];a[j][0]=e;
e=a[t][2];a[t][2]=a[j][2];a[j][2]=e;
a[j][1]=j+1;/*置名次*/
}
t=a[0][1];
for(k=1;k<10;k++)/*相同成绩,名次也一样*/
if(a[k-1][2]==a[k][2])a[k][1]=t;
elsea[k][1]=++t;
for(k=0;k<10;k++)
printf("%5d:
%5d%5d\n",a[k][1],a[k][0],a[k][2]);
}
3-13.编程,输出所有不超过n(取n<256)的、其平方具有对称性质的正整数(也称为回文数)。
结果:
1*1=1
2*2=4
3*3=9
11*11=121
22*22=484
26*26=676
101*101=10201
111*111=12321
121*121=14641
202*202=40804
212*212=44944
分析:
对j循环(j=1~255),将j*j的各位数字放入数组,输出具有对称性质的j.
main()/*sj1-3-13*/
{inte,f,c,t,n=0,a[10];
longj,k;
for(j=1;j<256;j++)
{k=j*j;
t=0;
while(k>0){a[t++]=k%10;k=k/10;}
for(c=0,e=t-1;cif(a[c]!
=a[e])break;
if(c>=e){printf("%d:
%ld*%ld=%ld\n",++n,j,j,j*j);}
}
}
3-14.编程,输入两个已经按从小到大顺序排列好的字符串,将两个字符串合并为一个新的从小到大排列字符串并输出。
结果:
输入:
13579
24acf
输出:
1234579acf
分析1:
先将两个字符串合并成一个字符串,然后按从小到大排序。
#include"string.h"
#include"stdio.h"
main()/*sj1-3-14*/
{chara[80],b[80];
inti,j=0,k,t;
gets(a);gets(b);
printf(“a=%s,b=%s\n”a,b);
while(a[j]!
=’\0’)j++;/*找a串尾*/
i=0;
while(b[i]!
=’\0’)a[j++]=b[i++];/*b串接在a串尾*/
k=strlen(a);
for(i=0;i{t=i;
for(j=i+1;jif(a[t]>a[j])t=j;
p=a[i];a[i]=a[t];a[t]=p;
}
printf(“a=a+b=%s\n”,a);
}
分析2:
对b串的每个字符b[i]在a串中找插入位置j,将a[j],a[j+1],a[j+2],…均向后移动1个位置,然后将b[i]存入a[j].直到b串的每个字符均插入完毕为止。
#include"string.h"
#include"stdio.h"
main()/*sj1-3-14*/
{chara[80],b[80];
inti,j,k;
gets(a);gets(b);
for(i=0;b[i]!
='\0';i++)/*a,b合并到a*/
{j=0;
while(b[i]>=a[j]&&a[j]!
='\0')j++;/*找b[i]在a中的插入位置j*/
if(a[j]=='\0'){a[j]=b[i];a[j+1]='\0';}
else{for(k=strlen(a)+1;k>j;k--)
a[k]=a[k-1];/*将a[k]向后移1个位置*/
a[j]=b[i];/*将b[i]存入a[j]*/
}
}
puts(a);
}
3-15.编程,输入两个已经按从小到大顺序排列好的字符串,合并两个字符串,使合并后的字符串中字符从大到小排列并输出。
结果:
输入:
13579
24acf
输出:
fca9754321
分析:
先将两个字符串合并成一个字符串,然后按从大到小排序。
#include"string.h"
#include"stdio.h"
main()/*sj1-3-15*/
{chara[80],b[80];
inti,j,k,t,p;
gets(a);gets(b);
printf("a=%s,b=%s\n",a,b);
strcat(a,b);/*b串接在a串尾*/
k=strlen(a);
for(i=0;i{t=i;
for(j=i+1;jif(a[t]p=a[i];a[i]=a[t];a[t]=p;
}
printf("a=a+b=%s\n",a);
}
3-16.编程,输入两个字符串s1和s2,在s1中删除任何s2中有的字符。
例如,s1:
“abc123ad”,s2:
“a1”,则输出“bc23d”。
结果:
输入:
abc123ad
a1
输出:
bc23d
分析:
对s2中每个字符s2[i]到s1中寻找它,将s1中出现的所有s2[i]均删除。
若s1[j]应删除,则用s1[j]后面的字符向前移动的方法覆盖s1[j],达到删除s1[j]的目的。
#include"string.h"
#include"stdio.h"
main()/*sj1-3-16*/
{chars1[80],s2[80];
inti,j,k;
gets(s1);gets(s2);
for(i=0;s2[i]!
='\0';i++)/*删除s1中的与s2[i]相同的字符*/
{j=0;
while(s1[j]!
='\0')/*在s1中找s2[i]并删除*/
{if(s2[i]==s1[j])/*找到s1[j],用向前移动的方法覆盖s1[j]*/
for(k=j;ks1[k]=s1[k+1];/*将s1[j+1]~s1尾('\0')向前移1个位置,删除s1[j]*/
j++;
}
}
puts(s1);
}
3-17.编程,输入一行文字,判断该行文字是否是回文。
例如,读入:
MADAMIMADAM输出:
YES
读入:
ABCDBA.输出:
NO
结果:
输入:
MADAMIMADAM
输出:
MADAMIMADAMYES
输入:
ABCDBA
输出:
ABCDBANO
分析:
对字符串S,若s[i]==s[n-i-1](i=0,1,…,n/2)),则为回文。
#include"stdio.h"
main()/*sj1-3-17*/
{chars[80];
intp,n;
gets(s);
p=0;
n=strlen(s);
while(pif(s[p]!
=s[n-p-1])/*比较对称的两个字符*/
{printf("%sNO\n",s);break;}
elsep++;
if(p>=n/2)
printf("%sYES\n",s);
}
3-18.编程,输入若干个字符串,当输入字符串的长度为0时停止输入。
输出最长的字符串。
结果:
输入:
china
Beijing
Chongqing
Shanhai
输出:
max=Chongqing
分析:
用循环输入各字符串并求其长度,找最大长度并输出相应字符串。
输入空串(长度为0)时结束循环。
#include"stdio.h"
#include"string.h"
main()/*sj1-3-18*/
{inti,k,m;
chars[80],max[80];
i=1;gets(s);m=0;
while((k=strlen(s))!
=0)/*输入空串时结束循环*/
{if(k>m){m=k;strcpy(max,s);}/*比较并记录最长字符串*/
gets(s);
}
printf("max=%s\n",max);
}
3-19.编程,输入若干个字符串,当输入字符串的长度为0时停止输入,输出最大字符串。
结果:
输入:
China
Beijing
Chongqing
Shanhai
输出:
max=Shanhai
分析:
用循环输入各字符串并求其长度,找最大字符串并输出。
输入空串(长度为0)时结束循环。
#include"stdio.h"
#include"string.h"
main()/*sj1-3-19*/
{inti,k,m;
chars[80],max[80];
i=1;gets(s);strcpy(max,s);
while((k=strlen(s))!
=0)/*输入空串时结束循环*/
{if(strcmp(max,s)<0)strcpy(max,s);/*比较并记录最大字符串*/
gets(s);
}
printf("max=%s\n",max);
}
3-20.“1898─要发就发”。
将不超过2004的所有素数从小到大排成第一行,第二行上的每个数都等于它“右肩”上的素数与“左肩”上的素数之差。
编程,输出第二行数中满足下列条件的整数:
第二行数中若干个连续整数的和恰好是1898。
第一行:
2357111317.....199719992003
第二行:
12242