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;
}