一、递归求和
题目描述
利用递归方法求5!。
题目分析
递归公式:fn=fn_1*4!
代码
#include<stdio.h>
int main()
{
int i;
int fact(int);
for(i=0;i<6;i++){
printf("%d!=%d\n",i,fact(i));
}
}
int fact(int j)
{
int sum;
if(j==0){
sum=1;
} else {
sum=j*fact(j-1);
}
return sum;
}
效果
二、逆序递归
题目描述
逆序递归
题目分析
利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。
源码
#include <stdio.h>
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);
}
}
效果
三、猜年龄
题目描述
有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,
他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。 最后问第一个人,他说是10岁。请问第五个人多大?
题目分析
利用递归的方法,递归分为回推和递推两个阶段。 要想知道第五个人岁数,需知道第四人的岁数,依次类推,推到第一人(10岁),再往回推
源码
#include <stdio.h>
int age(n)
int n;
{
int c;
if(n==1) c=10;
else c=age(n-1)+2;
return(c);
}
int main()
{
printf("%d\n",age(5));
}
效果
四、逆序
题目描述
给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
题目分析
学会分解出每一位数
源码
#include <stdio.h>
int main( )
{
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);
}
}
效果
五、回文数
题目描述
一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
题目分析
学会分析每一位数。
源码
#include <stdio.h>
int main( )
{
long ge,shi,qian,wan,x;
printf("请输入 5 位数字:");
scanf("%ld",&x);
wan=x/10000; /*分解出万位*/
qian=x%10000/1000; /*分解出千位*/
shi=x%100/10; /*分解出十位*/
ge=x%10; /*分解出个位*/
if (ge==wan&&shi==qian) { /*个位等于万位并且十位等于千位*/
printf("这是回文数\n");
} else {
printf("这不是回文数\n");
}
}
效果
六、查询日期
题目描述
请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。
题目分析
用情况语句比较好,如果第一个字母一样,则判断用情况语句或if语句判断第二个字母。
源码
#include<stdio.h>
int main()
{
char i,j;
printf("请输入第一个字母:\n");
scanf("%c",&i);
getchar();//scanf("%c",&j);的问题,第二次是读入的一个换行符,而不是输入的字符,因此需要加一个getchar() 吃掉换行符
switch(i)
{
case 'm':
printf("monday\n");
break;
case 'w':
printf("wednesday\n");
break;
case 'f':
printf("friday\n");
break;
case 't':
printf("请输入下一个字母\n");
scanf("%c",&j);
if (j=='u') {printf("tuesday\n");break;}
if (j=='h') {printf("thursday\n");break;}
case 's':
printf("请输入下一个字母\n");
scanf("%c",&j);
if (j=='a') {printf("saturday\n");break;}
if (j=='u') {printf("sunday\n"); break;}
default :
printf("error\n"); break;
}
return 0;
}
效果
七、删除指定字母
题目描述
删除一个字符串中的指定字母,如:字符串 “aca”,删除其中的 a 字母。
题目分析
循环遍历,对照删除。
源码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
// 删除字符串中指定字母函数
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;
}
效果
八、判断质数
题目描述
判断一个数字是否为质数。
题目分析
质数(prime number)又称素数,有无限个。 一个大于1的自然数,除了1和它本身外,不能被其他自然数整除
源码
#include<stdio.h>
#include<math.h>
#define MAX 1000
int prime[MAX];
int isPrimeNaive(int n)
{
if(n <= 1)
return 0;
for(int i = 2; i < n; i++)
if(n % i == 0)
return 0;
return 1;
}
int isPrime(int n)
{
if(n<= 1)
return 0;
if(n == 2)
return 1;
if(n%2 == 0)
return 0;
int limit = (int)sqrt((double)n);
for(int i = 3; i <= limit; i=i+2)
{
if(n % i == 0)
return 0;
}
return 1;
}
void sieve()
{
prime[0] = 0;
prime[1] = 0;
for(int i = 2; i < MAX; i++)
prime[i] = 1;
int limit = (int)sqrt((double)MAX);
for(int i = 2; i <= limit; i++)
{
if(prime[i])
for(int j = i*i; j <= MAX; j+=i)
prime[j] = 0;
}
}
int isPrimeSieve(int n)
{
if(prime[n])
return 1;
else
return 0;
}
int main()
{
sieve();
printf("N=%d %d\n", 1, isPrime(1));
printf("N=%d %d\n", 2, isPrime(2));
printf("N=%d %d\n", 3, isPrime(3));
printf("N=%d %d\n", 4, isPrime(4));
printf("N=%d %d\n", 7, isPrime(7));
printf("N=%d %d\n", 9, isPrime(9));
printf("N=%d %d\n", 13, isPrime(13));
printf("N=%d %d\n", 17, isPrime(17));
printf("N=%d %d\n", 100, isPrime(100));
printf("N=%d %d\n", 23, isPrime(23));
printf("N=%d %d\n", 1, isPrime(1));
return 0;
}
效果
九、函数调用
题目描述
练习函数调用。
题目分析
练习函数调用。
源码
#include <stdio.h>
void hello_world(void)
{
printf("Hello, world!\n");
}
void three_hellos(void)
{
int counter;
for (counter = 1; counter <= 3; counter++)
hello_world();/*调用此函数*/
}
int main(void)
{
three_hellos();/*调用此函数*/
}
效果
十、字符反转
题目描述
字符串反转,如将字符串 “www.abcd.com” 反转为 “moc.dcba.www”。
题目分析
无
源码
#include <stdio.h>
void reverse(char* s)
{
// 获取字符串长度
int len = 0;
char* p = s;
while (*p != 0)
{
len++;
p++;
}
// 交换 ...
int i = 0;
char c;
while (i <= len / 2 - 1)
{
c = *(s + i);
*(s + i) = *(s + len - 1 - i);
*(s + len - 1 - i) = c;
i++;
}
}
int main()
{
char s[] = "www.abcd.com";
printf("'%s' =>\n", s);
reverse(s); // 反转字符串
printf("'%s'\n", s);
return 0;
}
效果