1.模拟实现strlen的功能
程序分析:strlen是库函数中的一种,通过使用该函数,可以求出字符串的长度 (不包括’\0‘), 我们可以把\0作为终止位置的特性利用起来,采用计数器的方法或者递归的方法求出字 符串长度。
程序源代码:
#include<stdio.h>
int my_strlen(char* str)
{
assert(str != NULL);
if (*str != '\0')
{
return 1 + my_strlen(str+1);
}
else
return 0;
}
int main()
{
char arr[10] = "abc";
int len = my_strlen(arr);
printf("%d\n", len);
return 0;
}
2. 模拟实现strcpy的功能
程序分析:strcpy是库函数中的一种,它可以把一个字符串的内容复制到另一个字符串中,在msdn 中可以找到其实现方式
程序源代码:
#include<stdio.h>
#include<string.h>
void get_strcpy(char* des,const char* sou)//此处加const的原因是防止原字符串的内容被修改
{
assert(sou != NULL);
while (*des++ = *sou++)
{
;
}
}
int main()
{
char arr1[10] = " xxxxxxx ";
char arr2[10] = "bit";
get_strcpy(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
3.求两个数字的最小公倍数
程序分析:要求出两个数字的最小公倍数,最小公倍数最小也得是两数的最大值,最大不能超过 两数的乘积,我们要以此为条件进行程序设计。
程序源代码:
#include<stdio.h>
int get_min(int a,int b)
{
int n = a > b ? a : b;
int min = 0;
for (n ; n <= a * b; n++)
{
if (n % a == 0 && n % b == 0)
{
min = n;
}
}
return min;
}
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
printf("%d\n", get_min(a, b));
return 0;
}
该程序使用了一个名为get_lcm
的函数来计算两个数字的最小公倍数。此函数使用了一个while循环来递增最大值并检查是否同时整除两个数字。如果是,函数返回这个最大公倍数。
4.求解0~10000的水仙花数
水仙花数的定义
水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI)、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),水仙花数是指一个 3 位数,它的每个数位上的数字的 3次幂之和等于它本身。例如:1^3 + 5^3+ 3^3 = 153。
程序分析:1.首先我们应该生成0~10000的数字,判断它是几位数
2.例如数字为123,我们要设想如何把它的各个位上的数字拿下来,这里我们采用%、 /的方法之后我们再对它的每一位进行平方运算,最后把各个位上平方后的数字求和
3.判断求和之后的数字与原数字是否相同,相同则打印在屏幕上
程序源代码:
#include<stdio.h>
#include<math.h>
int main()
{
int i = 0;
for (i = 0; i < 10000; i++)
{
//判断是几位数
int count = 1;
int tmp = i;
while (tmp / 10)
{
count++;
tmp /= 10;
}
//对每一项求次方并相加
tmp = i;
int sum = 0;
while (tmp)
{
sum += pow(tmp % 10, count);//此处的pow函数(求次方)为库函数,引用头文件math.h
tmp /= 10;
}
//判断
if (sum == i)
{
printf("%d ", i);
}
}
return 0;
}
程序分析:拿到题目,我们应该想如何生成a和aa这种特殊类型的数字,我们发现a*10+a=aa;依 照这个思路我们可以利用循环的思路生成多个数字,最终进行求和即可
程序源代码:
#include<stdio.h>
int main()
{
int a = 0;
int n = 0;
scanf("%d %d", &a, &n);
int j = 0;
int subsequent = 0;
int sum = 0;
for (j = 1; j <= n; j++)
{
subsequent = subsequent * 10 + a;
sum += subsequent;
}
printf("sum = %d\n", sum);
return 0;
}
6.设计函数实现字符串逆序
程序分析:拿到题目我们首先想如何实现字符串逆序,我们想到,只要让开始和末尾的字符进行 交换,第二个和倒数第二个进行交换,以此类推,整个字符串就被我们逆序完了。有 这个设计思路,我们采用循环结构,当left=right或left>right时,循环终止,所以循环条 件设为left<right
程序源代码:
#include<stdio.h>
#include<string.h>
//字符串的逆序
void reverse_string(char str[])
{
int left = 0;
int right = strlen(str) - 1;
while (left < right)
{
char tmp = str[left];
str[left] = str[right];
str[right] = tmp;
left++;
right--;
}
}
int main()
{
char arr[] = "abcdef";
reverse_string(arr);
printf("%s", arr);
return 0;
}
7.打印菱形
程序分析:我们首先画一个普通的菱形进行分析。拆分菱形为上下两部分,上半部分行数为line,下半部分行数则为line-1,根据空格和*的个数进行分析和打印
程序源代码:
#include<stdio.h>
int main()
{
int line = 0;
scanf("%d", &line);
int i = 0;
//上
for (i = 0; i <line ; i++)
{
//打印每行
//打印空格
int j = 0;
for (j = 0; j < line - 1 - i; j++)
{
printf(" ");
}
//打印*
for (j = 0; j < 2 * i + 1; j++)
{
printf("*");
}
printf("\n");
}
for (i = 0; i < line - 1; i++)
{
//打印每行
//打印空格
int j = 0;
for (j = 0; j <= i; j++)
{
printf(" ");
}
//打印*
for (j = 0; j < 2 * (line - 1 - i) - 1; j++)
{
printf("*");
}
printf("\n");
}
return 0;
}
8.喝汽水问题,一瓶汽水1元,两个空瓶可以换一瓶汽水,给money元,能喝多少瓶汽水
程序分析:喝的汽水的总数为花钱买的+置换的,每两个空瓶就可以换一瓶,所以循环条件是 empey(空瓶数量)>=2,在进行换瓶子这个动作时,奇数个瓶子也要保留因此要加上 empey%2
程序源代码:
#include<stdio.h>
int main()
{
int money = 0;
scanf("%d", &money);
int empty = money;
int total = money;
while (empty >= 2)
{
total += empty/2;
empty = empty / 2 + empty % 2;//empty%2的原因是手中有奇数个瓶子时也可以保留
}
printf("%d\n", total);
return 0;
}
9.移动数组内元素,使得奇数在前,偶数在后
程序分析:首先应该想如何分辨奇数和偶数,我们想到取模运算i%2==0时,i为偶数,反之则为奇 数,通过定义left和right快捷访问数组的起始部分和末尾,通过循环的方式逐层向内推 进,实现整个数组前面的奇数和后面的偶数进行交换,最终达到题目要求的效果。
程序源代码:
void move(int str[],int sz)
{
int left = 0;
int right = sz - 1;
while (left < right)
{
//从左边找到一个偶数
while ( (left<right) && ((str[left] % 2) == 1) )
{
left++;
}
//从右边找到一个奇数
while ( (left < right) && ((str[right] % 2) == 0))
{
right--;
}
if (left < right)
{
int tmp = str[left];
str[left] = str[right];
str[right] = tmp;
}
}
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9 };
int sz = sizeof(arr) / sizeof(arr[0]);
move(arr,sz);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
10.递归实现n的k次方
程序分析:n的k次方就是n个k相乘,根据’大事化小‘的思路看,也就是n*(n-1)^k
程序源代码:
#include<stdio.h>
int power(int n, int k)
{
if (k == 0)
return 1;
else
return n * power(a , k-1);
}
int main()
{
int n = 0;
int k = 0;
scanf("%d %d", &n,&k);
printf("%d", power(n, k));
return 0;
}