C语言练习(2)

本文包含多个C语言编程实例:通过递归计算年龄问题;将输入字符中的小写字母转为大写并保存到文件;拆分unsigned long型整数;不使用printf系列函数输出二进制和十六进制数;寻找字符串最大公共子串;选择排序降序排列数组;折半查找法;递归将整数转换为字符串;以及计算1000!的末尾零个数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.有五个人坐在一起,问第5个人多少岁?他说比第4个人大2岁。问第4个人多少岁?他说比第3个人大2岁。问第3个人多少岁?他说比第2个人大2岁。问第2个人多少岁?他说比第1个人大2岁。最后问第1个人多少岁?他说是10岁。请问第5个人多大?
#include <stdio.h>
int f(int n)
{
 if(n==1)
  return 10;
 else
  return f(n-1)+2;
}
int _tmain(int argc, _TCHAR* argv[])
{
 int n=f(5);
 printf("%d",n);
 return 0;
}

2.编一程序,能把从终端读入的一个字符中的小写字母全部转换成大写字母,然后输出到一个磁盘文件“test”中保存(用字符!表示输入字符串的结束)。
#include <stdio.h>

int _tmain(int argc, _TCHAR* argv[])
{
 FILE *fp;
 char str[100];
 int i=0;
 if((fp=fopen("test.txt","w"))==NULL)
 {
  printf("open file error!");
  return -1;
 }
 gets(str);
 while(str[i]!='!')
 {
  if(str[i]>='a'&&str[i]<='z')
   str[i]=str[i]-32;
  fputc(str[i],fp);
  i++;
 }
 fclose(fp);
 return 0;
}
3.有一个unsigned long型整数,先要分别将其前2个字节和后2个字节用为两个unsigned int型整数输出(设一个int型数据占2个字节),试编写一函数partition实现上述要求。要求在主函数输入该long型整数,在函数partition中输出结果。
void partition(unsigned long num)
{
 union a
 {
  unsigned int part[2];
  unsigned long w;
 } n,*p;
 p=&n;n.w=num;
 printf("long integer=%lx/n",num);
 printf("/nlong integer=%0x,high-part number=%0x/n",p->part[0],p->part[1]);
}
void main()
{
 unsigned long x;
 printf("Input a long number:");
 scanf("%lx",&x);
 partition(x);
}
4.编程实现:把十进制数(long型)分别以二进制和十六进制形式输出,不能使用printf系列库函数
#include <stdio.h>

int _tmain(int argc, _TCHAR* argv[])
{
 long number=15;
 char str[11];
 str[0]='0';
 str[1]='x';
 str[10]='/0';
 for(int i=2;i<10;i++)
 {
  str[i]=(char)(number<<4*(i-2)>>28);//把高4*i位清零,然后右移28位(一共32位),留出前面的4位
  printf("%c",str[i]);
  str[i]=str[i]>=0?str[i]:str[i]+16; 
  str[i]=str[i]<10?str[i]+'0':str[i]+'7';
 }
 puts(str);
 return 0;
}
5.编程实现:找出两个字符串中最大公共子字符串,如"abccade","dgcadde"的最大子串为"cad"
int GetCommon(char *s1, char *s2, char **r1, char **r2)
{
 int len1 = strlen(s1);
 int len2 = strlen(s2);
 int maxlen = 0;

 for(int i = 0; i < len1; i++)
 {
  for(int j = 0; j < len2; j++)
  {
   if(s1[i] == s2[j])
   {
    int as = i, bs = j, count = 1;
   }
   while(as + 1 < len1 && bs + 1 < len2 && s1[++as] == s2[++bs])
   count++;

   if(count > maxlen)
   {
    maxlen = count;
    *r1 = s1 + i;
    *r2 = s2 + j;
   }
  }
 }
}
6.编写函数:(1)用选择法将数组排成降序的函数----SUB1;(2)用折半查找法查找某数是否在给定的数组当中的函数----SUB2。
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

#define MAX_SIZE 20
void sub1(int *numbers,int n)
{
 int min,temp;
 for(int i = 0;i<n-1;i++)
 {
  min = i;
  for(int j = i+1;j<n;j++)
  {
   if(numbers[min]>numbers[j])
    min = j;
  }
  if(min!=i)
  {
   temp = numbers[i];
   numbers[i] = numbers[min];
   numbers[min] = temp;
  }
 }
}
void sub2(int *numbers,int n,int start,int end)
{
 if(numbers[(start+end)/2]==n)
  printf("OK!/n");
 else if(numbers[(start+end)/2]>n)
  sub2(numbers,n,start,(start+end)/2);
 else
  sub2(numbers,n,(start+end)/2+1,end);
}
int main()
{
 srand((int)time(0));
 int numbers[MAX_SIZE];
 for(int i=0;i<MAX_SIZE;i++)
 {
  numbers[i] = rand()%101;
  printf("%d ",numbers[i]);
 }
 printf("/n");
 sub1(numbers,MAX_SIZE);
 for(int i=0;i<MAX_SIZE;i++)
 {
  printf("%d ",numbers[i]);
 }
 sub2(numbers,32,0,MAX_SIZE-1);
 return 0;
}
7.用递归法将一个整数n转换成字符串(例如输入4679,应输出字符串“4679”),n为不确定数,可以是位数不超过5,且数值在-32768~32767之间和任意整数。
void convert(int n)
{
 int i;
 if((i=n/10)!=0)
 convert(i);
 putchar(n%10+'0');
}
8.求1000!后面多少个0。
求出1->1000里,能被5整除的数的个数n1,能被25整除的数的个数n2,能被125整除的数的个数n3,
能被625整除的数的个数n4.
1000!末尾的零的个数=n1+n2+n3+n4;
#include <stdio.h>
#define NUM 1000

int find5(int num){
int ret=0;
while(num%5==0){
num/=5;
ret++;
}
return ret;
}
int main(){
int result=0;
int i;
for(i=5;i<=NUM;i+=5)
{
result+=find5(i);
}
printf(" the total zero number is %d/n",result);
return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值