02-C语言经典算法100例

21、题目:利用递归方法求5!。

int main()
{
	int i;
	int fact();
	for(i=0;i<=5;i++)
		printf("\40:%d!=%d\n",i,fact(i));
}
int fact(j)
int j;
{
	int sum;
	if(j==0)
		sum=1;
	else
		sum=j*fact(j-1);
	return sum;
}

22、题目:利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。

	printf("请输入5个字符");
	char c1[5];
	scanf("%s",c1);
	int i;

	for(i=4;i>=0;i--)
	{
		printf("%c",c1[i]);
	}
	printf("\n");



-------------------------------------------------------


int main()
{
    int i=5;
    void palin(int n);
    printf("请输入5个字符\40:\40");
    palin(i);
    printf("\n");
}
void palin(n)
int n;
{
    char next;
    if(n<=1)
	{
        next=getchar();
        printf("相反顺序输出结果\40:\40");
        putchar(next);
	} 
	else 
	{
        next=getchar();
        palin(n-1);
        putchar(next);
    }
}

23、有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?

程序分析:利用递归的方法,递归分为回推和递推两个阶段。要想知道第五个人岁数,需知道第四人的岁数,依次类推,推到第一人(10岁),再往回推。

int age(n)
int n;
{
	int AGE;
	if(n == 1)
		AGE = 10;
	
	else
		AGE = age(n-1)+2;
	
	return (AGE);
	
}

int main(int argc,char *argv[])
{
	printf("%d\n",age(5));
	return 0;
}

24、题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。

程序分析:学会分解出每一位数,如下解释。

	long a,b,c,d,e,x;
    printf("请输入 5 位数字:");
    scanf("%ld",&x);
    a=x/10000;        /*分解出万位*/
    b=x%10000/1000;   /*分解出千位*/
    c=x%1000/100;     /*分解出百位*/
    d=x%100/10;       /*分解出十位*/
    e=x%10;           /*分解出个位*/
    if (a!=0)
	{
		printf("为 5 位数,逆序为: %ld %ld %ld %ld %ld\n",e,d,c,b,a);
    } 
	else if(b!=0) 
	{
		printf("为 4 位数,逆序为: %ld %ld %ld %ld\n",e,d,c,b);
    } 
	else if(c!=0) 
	{
		printf("为 3 位数,逆序为:%ld %ld %ld\n",e,d,c);
    } 
	else if(d!=0) 
	{
		printf("为 2 位数,逆序为: %ld %ld\n",e,d);
    } 
	else if(e!=0) 
	{
		printf("为 1 位数,逆序为:%ld\n",e);
    }

25、题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。

程序分析:学会分解出每一位数。

	long a,b,c,d,e,x;
    printf("请输入 5 位数字:");
    scanf("%ld",&x);
    a=x/10000;        /*分解出万位*/
    b=x%10000/1000;   /*分解出千位*/
    c=x%1000/100;     /*分解出百位*/
    d=x%100/10;       /*分解出十位*/
    e=x%10;           /*分解出个位*/
	if(a == e && b == d)
	{
		printf("%ld是回文数!\n",x);
	}
	else
	{
		printf("%ld不是回文数!\n",x);
	}

26、题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。

程序分析:用情况语句比较好,如果第一个字母一样,则判断用情况语句或if语句判断第二个字母。

	char first;
	char c;

	printf("pls input first char:");
	scanf("%c",&first);
	switch(first)
	{
		case 'm':
			printf("is monday!\n");
			break;
		
		case 't':
			printf("pls input next char:");
			scanf("%s",&c);
			if(c == 'h')
				printf("is thursday!\n");
			else
				printf("is  tuesday!\n");
			break;
			
		case 'w':
			printf("is wednesday!\n");
			break;
			
		case 'f':
			printf("is friday!\n");
			break;
			
		case 's':
			printf("pls input next char:");
			scanf("%s",&c);
			if(c == 'a')
				printf("is saturday!\n");
			else
				printf("is  sunday!\n");
			break;
			
		default:
			printf("error!pls input again!\n");
			break;
	}

27、题目:删除一个字符串中的指定字母,如:字符串 "aca",删除其中的 a 字母。 

char* deleteCharacters(char * str, char * charSet)
{
    int hash [256];
    if(NULL == charSet)
        return str;
    for(int i = 0; i < 256; i++)
        hash[i] = 0;//清空数组
	
    for(int i = 0; i < strlen(charSet); i++)
        hash[charSet[i]] = 1;
	
    int currentIndex = 0;
    for(int i = 0; i < strlen(str); i++)
    {
        if(!hash[str[i]])
            str[currentIndex++] = str[i];
    }
	
    str[currentIndex] = '\0';
    return str;
}
 
int main()
{
    char s[2] = "a";     // 要删除的字母
    char s2[5] = "aca";  // 目标字符串
    printf("%s\n", deleteCharacters(s2, s));
    return 0;
}

28、题目:对10个数进行排序。

程序分析:可以利用选择法,即从后9个比较过程中,选择一个最小的与第一个元素交换, 下次类推,即用第二个元素与后8个进行比较,并进行交换。

	printf("pls input ten number:");
	int num,i,a[10],j,temp;
	for(i=0;i<10;i++)
	{
		scanf("%d",&num);// 15 48 10 24 45 31 18 4 19 20
		a[i] = num;
	}
	printf("排序前:");
	for(i=0;i<10;i++)
	{
		printf("%d->",a[i]);
	}
	printf("\n");
	
	for(j=0;j<9;j++)
	{
		int min = j;
		for(i=j+1;i<10;i++)
		{
			if(a[min]>a[i])
				min = i;
		}
		if(min!=j)
        {
            temp=a[min];
            a[min]=a[j];
            a[j]=temp;
        }
	}
	printf("排序后:");
	for(i=0;i<10;i++)
	{
		printf("%d->",a[i]);
	}
	printf("\n");

29、题目:求一个3*3矩阵对角线元素之和

程序分析:利用双重for循环控制输入二维数组,再将a[i][i]累加后输出。

	int i,j,a[N][N],sum=0;
    printf("请输入矩阵(3*3):\n");
    for(i=0;i

30、 题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。

程序分析:首先判断此数是否大于最后一个数,然后再考虑插入中间的数的情况,插入后此元素之后的数,依次后移一个位置。

	int a[11] = {10,20,25,35,46,55,60,75,80,85};
	int number,i,j,temp1,temp2;
	printf("pls input number:");
	scanf("%d",&number);
	if(number > a[9])
		a[10] = number;
	else
	{
		for(i=0;i<10;i++)
		{
			if(number < a[i])
			{
				temp1 = a[i];//temp1=25
				a[i] = number;	//a[2]=25
				for(j=i+1;j<11;j++)
                {
                    temp2=a[j];//temp2=35
                    a[j]=temp1;//a[3]=25
                    temp1=temp2;//temp1=35
                }
                break;
			}
				
		}
		
	}
	
	for(i=0;i<11;i++)
	{
		printf("%d-",a[i]);
	}
	printf("\n");

你可能感兴趣的:(C语言经典算法100例,算法,c语言,java)