01 求第二大数
题目描述:
写一个函数找出一个整数数组中,第二大的数
代码:
#include <stdio.h>
#define N 105
int secondMax(int a[],int n){
int Max=a[0],s_Max=-32767;
int i;
for(i=1;i<n;i++){
if(a[i]>Max){
s_Max=Max;
Max=a[i];
}
else if(a[i]<Max){ //大小相同则不作任何操作
if(a[i]>s_Max)
s_Max=a[i];
}
}
return s_Max;
}
int main(){
int a[N];
int n,i,ans;
while(scanf("%d",&n)!=EOF){
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
ans=secondMax(a,n);
printf("%d\n",ans);
}
return 0;
}
02 计算N的阶乘
题目描述:
编程计算n!的值
代码 1 (n!在int范围内)
#include <stdio.h>
int multi(int ans, int n){
int i;
for(i=n;i>0;i--){
ans=ans*i;
}
return ans;
}
int main(){
int n,ans;
while(scanf("%d",&n)!=EOF){
ans=1;
ans=multi(ans,n);
printf("%d\n",ans);
}
return 0;
}
代码 2 (n!不在int范围内,n在int范围内)
#include <stdio.h>
#include <stdlib.h>
#define N 10
//大整数乘法
struct bign{
int data[1000];
int len;
};
bign multi(bign x,int y){
int carry=0,i; //carry表示进位
for(i=0;i<x.len;i++){
int temp=x.data[i]*y+carry;
carry=temp/N;
x.data[i]=temp % N;
}
while(carry){
x.data[i++]=carry % N;
carry=carry/N;
}
x.len=i; //更新长度
return x;
}
int main(){
int i,n;
struct bign a;
while(scanf("%d",&n)!=EOF){
a.data[0]=1;
a.len=1;
for(i=2;i<=n;i++){
a=multi(a,i);
}
//输出结果
for(i=a.len-1;i>=0;i--){
printf("%d",a.data[i]);
}
printf("\n");
}
return 0;
}
03 字符 i 首次出现的位置
题目描述:
设有一个字符串“This is a computer”,请编程求字符“i”首次出现的位置。(字符i 与字母i )
代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#define N 1001
int main(){
char str[N]={0},c1,c2;
int pos=-1,i;
while(gets(str)!=NULL){
printf("所输入的是:%s\n",str);
//scanf("%c",&c1);
c1=getchar();
printf("要查找的是:%c\n",c1);
getchar(); //需要吸收换行符
if(c1>='A' && c1<='Z') //issuper(cl),是-1,不是-0
c2=c1+32; //c2=tolower(c1),转换为小写
if(c1>='a' && c1<='z') //islower(cl),是-1,不是-0
c2=c1-32; //c2=toupper(c1),转换为大写
int len=strlen(str);
printf("len=%d\n",len);
for(i=0;i<len;i++){
if(str[i]== c1 || str[i]==c2){
pos=i+1;
break;
}
}
printf("pos=%d\n",pos);
}
return 0;
}
04 Fibonacci数列
题目描述:
生成Fibonacci数列的前20项并输出
代码:
#include <stdio.h>
#define N 101
int main(){
int n,i;
int a[N];
a[1]=1,a[2]=1;
while(scanf("%d",&n)!=EOF){
if(n<2 && n>0)
for(i=1;i<=n;i++)
printf("%d ",a[i]);
else{
printf("%d %d ",a[1],a[2]);
for(i=3;i<=n;i++){
a[i]=a[i-1]+a[i-2];
printf("%d ",a[i]);
}
}
printf("\n");
}
return 0;
}
05 名称排序
题目描述:
输入五个国家的名称,按字母顺序排列输出
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
char country[5][20];
char temp[20];
int i,j;
for(i=0;i<5;i++){
scanf("%s",country[i]);
}
for(i=0;i<5;i++){
for(j=i+1;j<5;j++){
if(strcmp(country[i],country[j])>0){
strcpy(temp,country[j]);
strcpy(country[j],country[i]);
strcpy(country[i],temp);
}
}
puts(country[i]);
}
return 0;
}
指针实现字符串排序
指针实现对字符串排序,输出排序后的字符串。
#include <stdio.h>
#include <string.h>
#define MAX 20
int main(){
void sort(char **p);
int i;
char **p,*pstr[5],str[5][MAX];
for(i=0;i<5;i++){
pstr[i]=str[i]; //将第i个字符串的首地址赋予指针数组pstr的第i个元素
}
printf("input 5 strings:\n");
for(i=0;i<5;i++){
scanf("%s",pstr[i]);
}
p=pstr;
sort(p);
printf("\nstrings sorted:\n");
for(i=0;i<5;i++){
printf("%s\n",pstr[i]);
}
return 0;
}
void sort(char **p){
int i,j;
char *temp;
for(i=0;i<5;i++){
for(j=i+1;j<5;j++){
if(strcmp(*(p+i),*(p+j))>0) //比较后交换地址
{
temp=*(p+i);
*(p+i)=*(p+j);
*(p+j)=temp;
}
}
}
}
06 字符串替换
题目描述:
将字符串S1中出现的所有S2都替换成S3, 并且不损坏字符串S1。函数原型为:char exchange(char S1, char S2, char S3)
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *exchange(char *str1, char *str2, char *str3){
char*p,*q,*r,*s;
int len1,len2,len3,i=0,len; //len表示新串的长度
len1=strlen(str1);
len2=strlen(str2);
len3=strlen(str3);
p=str1;
//统计一个字符串在另一个字符串中出现次数
while((p=strstr(p,str2))!=NULL){
i++; //统计str2出现的次数
p+=len2;
}
len=len1-i*len2+i*len3;
s=r=(char *)malloc(len);//分配动态存储空间
p=str1;
while(1){
q=strstr(p,str2); //str2串是否在s1中出现,返回首次出现位置
if(q!=NULL){
i=q-p; //出现位置距离开始位置距离
strncpy(r,p,i); //先写串str1的前i个字符
r+=i;
strcpy(r,str3); //将str3写入新串
r+=len3;
p=q+len2; //将指针移到str2子串出现之后,准备下一次循环
}
else{ //表示剩余str1中已没有str2
strcpy(r,p);
break;
}
}
return s;
}
int main(){
char a[]="sabcababde",b[]="ab",c[]="efg",*d;
d=exchange(a,b,c);
printf("result= %s\n",d);
free(d);
return 0;
}
07 求自守数
题目描述:
自守数是指一个数的平方的尾数等于自身。例如,25就是—个自守数,因为252=625,末两位数为25;9376是一个自守数,因为93762=87909376.末4位数为9376。编写程序.从键盘输入整数m和n(10<m,n<200000),求出m与n之间所有的自守数,并且以每行5个数的形式输出。
思路:
如果一个自然数的平方数的尾部仍然为该自然数本身,则称其为自守数。
例如:
5 x 5 = 25
76 x 76 = 5776
625 x 625 = 390625
下面代码的目的是寻找出2千万以内的所有自守数。
注意,2千万的平方已经超出了整数表达的最大范围,所以该程序使用了一个巧妙的方案。
如果我们仔细观察乘法的计算过程,就会发现实际上对乘积的尾数有贡献的环节,从而不用真正计算出整个乘积。
分析手工方式下整数平方(乘法)的计算过程,以376为