上一篇:从0开始学c语言-17-二维数组以及数组传参应用:三字棋_阿秋的阿秋不是阿秋的博客-优快云博客
目录
题目一:二分查找
编写代码在一个整形有序数组中查找具体的某个数
要求:找到了就打印数字所在的下标,找不到则输出:找不到。
int er(int q[], int w, int e)
{
int left = 0;
int right = e;
int mid = (left + right) / 2;
while (left <= right)
{
if (w < q[mid])
{
right = mid - 1;
mid = (left + right) / 2;
}
else if (w > q[mid])
{
left = mid + 1;
mid = (left + right) / 2;
}
else
return mid;
}
return -99;
}
int main()
{
int a[10] = { 1,2,3,4,5,6,7,8,9,10 }; //查找范围
int b = 0;
scanf("%d", &b); //输入查找值,别忘了&
int c = sizeof(a) / sizeof(a[0]); //数组元素个数
printf("%d\n", er(a, b, c));
return 0;
}
题目二:数9的个数
编写程序数一下 1到 100 的所有整数中出现多少个数字9
思路:
给一个循环从1遍历到100,拿到每个数据后进行一下操作:
1. 通过%的方式取当前数据的个位,检测个位数据是否为9,如果是,给计数器加1。
2. 通过/的方式取当前数据的十位,检测十位数据是否是9,如果是,给计数器加1。
循环一直继续,直到所有的数据检测完,所有9的个数已经统计在count计数中。
#include <stdio.h>
int main()
{
int i = 0;
int count = 0;
for (i = 1; i <= 100; i++)
{
if (i % 10 == 9) //个位数
count++;
if (i / 10 == 9) //十位数
count++;
}
printf("%d\n", count);
return 0;
}
题目三:分数求和
计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值,打印出结果
观察出来奇数项为正数,偶数项为负数,且需要打印的是分数,那么就是需要输出小数结果,在进行除法运算的时候需要记得除法操作符的特点。
不知道的看从0开始学c语言-07-认识一下操作符、原码和反码和补码_阿秋的阿秋不是阿秋的博客-优快云博客
int main()
{
int i = 0;
double sum = 0; //和
for (i = 1; i < 101; i++)
{
if (i % 2 != 0)
{
sum = sum + (1.0 / i); //用1.0是为了让除法进行小数运算
}
else
{
sum = sum - (1.0 / i);
}
}
printf("%lf\n", sum);
return 0;
}
或者优化一下代码
#include <stdio.h>
int main()
{
int i = 0;
double sum = 0.0;
int flag = 1;
for (i = 1; i <= 100; i++)
{
sum += flag * 1.0/ i;
flag = -flag;
}
printf("%lf\n", sum);
return 0;
}
题目四:求最大值
求10 个整数中最大值
思路:
1. 采用循环的方式输入一个数组
2. 使用max存储数组中的最大值,采用循环的方式依次获取数组中的每个元素与max进行比较,如果arr[i]大于max,更新max储存的最大值,数组循环结束后,max中保存的即为数组中的最大值。
int main()
{
int arr[10] = { 0 };
int i = 0;
int max = 0;
for (i = 0; i < 10; i++)
{
scanf("%d", &arr[i]);
}
max = arr[0];
for (i = 1; i < 10; i++)
{
if (arr[i] > max)
max = arr[i];
}
printf("max = %d\n", max);
return 0;
}
题目五:乘法口诀表
在屏幕上输出9*9乘法口诀表
int main()
{
int a = 0;
int b = 0;
for (a = 1; a < 10; a++)
{
for (b = 1; b < a + 1; b++)
{
printf("%d * %d ", a, b);
}
printf("\n");
}
return 0;
}
还少了结果
int main()
{
int i = 0;
//控制行数
for (i = 1; i <= 9; i++)
{
//打印每一行内容,每行有i个表达式
int j = 0;
for (j = 1; j <= i; j++)
{
printf("%d*%d=%2d ", i, j, i * j); //%2d代表打印两位,不够用空格填充
}
printf("\n");
}
return 0;
}
题目六:字符串逆序(递归实现)
非递归
//void re_sequence(char arr2[], int sz) 这样写也行
void re_sequence(char* arr2, int sz)
{
int left = 0;
int right = sz - 2; //sz-1是\0的下标
while (left <= right)
{
char tmp = arr2[left];
arr2[left] = arr2[right];
arr2[right] = tmp;
//这样写也行
//char tmp = *(arr2 + left);
//*(arr2 + left)=*(arr2+right);
//*(arr2 + right) = tmp;
left++;
right--;
}
}
int main()
{
char arr1[] = "abcdef"; //此时arr中有六个元素,别忘了结束标志\0
int sz = sizeof(arr1) / sizeof(arr1[0]);
re_sequence (arr1 ,sz);
printf("%s\n", arr1);
return 0;
}
递归实现-用自己求长度的函数
//我们用了自己写的求长度函数
int my_str(char*arr)
{
int count = 0;
while (*arr != '\0') //每次访问的都是首元素
{
count++; //统计长度
arr++; //相当于换了下一个元素作为首元素
}
return count;
}
void re_seq(char* arr)
{
char tmp = *arr;
int len = my_str(arr); //如果不存在len中,输出结果是fea
*arr= *(arr + len - 1);
*(arr +len - 1) = '\0';
if ((my_str(arr+1)) >=2)
{
re_seq(arr+1);
}
*(arr + len - 1) = tmp;
}
//为什么要把长度存在变量中呢?
//因为接下来的每一步我们都调用求长度函数的话
//就会导致每次长度求的不一样
//所换的数据也就不一样了
//这就是为什么要设置个变量来接收长度的原因了
int main()
{
char arr[] = "abcdef";
re_seq(arr);
printf("%s", arr);
return 0;
}
递归实现-用自带的strlen
void reverse_string(char* arr)
{
int len = strlen(arr);
char tmp = *arr;
*arr = *(arr+len-1);
//在最后那个位置放上\0进行递归
*(arr+len-1) = '\0';
if(strlen(arr+1)>=2)
reverse_string(arr+1);
//交换完之后再把之前存的都放回\0的位置上
*(arr+len-1) = tmp;
}
题目七:计算一个数的每位之和(递归实现)
输入一个非负整数,返回组成它的数字之和
非递归的代码
int add(int a)
{
if (a > 9)
{
a = a % 10 + add(a / 10);
}
return a;
}
int main()
{
int input = 0;
scanf("%d", &input);
printf("%d",add(input));
return 0;
}
换成递归的
int ret(int n)//1729
{
if(n>9)
return ret(n/10)+n%10;
else
return n;
}
题目八:递归实现n的k次方
int re(int n, int k)
{
if(k==0)
return 1;
else if(k>=1)
{
return n*re(n, k-1);
}
}
这是基本思路,但是没有考虑到负数,我们完善一下。
考虑负数
double squ(int n,int k) //因为后面有1.0的小数运算
{
if (k > 0)
{
return n * squ(n, k - 1);
}
else if (k == 0)
return 1;
else
return 1.0 / squ(n, -k); //2的-3次方,那这里就是2的3次方分之一
}
int main()
{
printf("请输入需要求的n的k次方所对应的n的值");
int n = 0;
scanf("%d", &n);
printf("请输入需要求的%d的k次方所对应的k的值", n);
int k = 0;
scanf("%d", &k);
printf("%lf",squ(n,k));
return 0;
}
题目九:交换数组
将数组A中的内容和数组B中的内容进行交换。(数组一样大)
注意:交换数组不能创建中间数组进行交换。
#include <stdio.h>
int main()
{
int arr1[10] = {0};
int arr2[10] = {0};
int i = 0;
//初始化两个数组
printf("请输入10个数字:>");
for(i=0; i<10; i++)
{
scanf("%d", &arr1[i]);
}
printf("请输入10个数字:>");
for(i=0; i<10; i++)
{
scanf("%d", &arr2[i]);
}
//交换
for(i=0; i<10; i++)
{
int tmp = arr1[i];
arr1[i] = arr2[i];
arr2[i] = tmp;
}
return 0;
}