1. 调整奇数偶数顺序
调整数组使奇数全部都位于偶数前面。
输入一个整数数组,实现一个函数,来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分。
思路:设置left和right指针。left从左开始找偶数(即遇到奇数就跳过);right从又开始找奇数(即遇到偶数就跳过)。将left找到的偶数和right找到的奇数交换。
void move_odd_even(int arr[], int sz)
{
int left = 0;
int right = sz - 1;
//left找偶数,right找奇数
while (left < right)
{
//从左往右找一个偶数,停下来。(遇到奇数就++)
//等效于left%2,因为模2等于1就为真,真就进入
while ((left < right) && arr[left] % 2 == 1)//假设全是奇数,left找不到偶数,一直++,那么left可能越界。所以要限制范围
{
left++;
}
//从右往左找一个奇数,停下来(遇到偶数就--)
while ((left < right) && arr[right] % 2 == 0)
{
right--;
}
//交换奇数和偶数
if (left < right)
{
int tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
//交换完以后,让指针继续移动,回到上面判断下一个元素是奇数还是偶数。
left++;
right--;
}
}
}
int main()
{
int arr[10] = { 0 };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
//输入
for (i = 0; i < sz; i++)
{
//scanf("%d", &arr[i]);//两种方式都可以
scanf("%d", arr + i);//arr是数组名,加i就是下标为i的元素的地址
}
//调整
//方法一思路:第一次遍历找奇数,第二次遍历找偶数,第三次遍历拷贝进原数组。
//方法二思路:
//设置两个指针,left指针从最左开始找,right指针从最右边开始找。
//当left指针找到偶数,并且right指针找到奇数时交换,
//left要小于right指针,否则当right移动到left左边时,可能把位置正确的奇数和偶数交换
move_odd_even(arr, sz);
//输出
for (i = 0; i < sz; i++)//调整完之后还是打印这个数组
{
printf("%d ", arr[i]);
}
return 0;
}
2. 输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。
输入描述:
输入包含三行,
第一行包含两个正整数n, m,用空格分隔。n表示第二行第一个升序序列中数字的个数,m表示第三行第二个升序序列中数字的个数。
第二行包含n个整数,用空格分隔。
第三行包含m个整数,用空格分隔。
输出描述:输出为一行,输出长度为n + m的升序序列,即长度为n的升序序列和长度为m的升序序列中的元素重新进行升序序列排列合并。
int main() {
int n = 0;
int m = 0;
scanf("%d %d", &n, &m);
int arr1[n];
int arr2[m];
int i = 0;
for (i = 0; i < n; i++) {
scanf("%d", &arr1[i]);
}
for (i = 0; i < m; i++) {
scanf("%d", &arr2[i]);
}
// 思路:
// 假设第一个数组的下标为j,第二个数组的下标为k。
// 用arr1[j]和arr2[k]比较,谁小打印谁,打印以后该数组下标+1,依次类推
int j = 0;//arr1
int k = 0;//arr2
while (j < n && k < m) {
if (arr1[j] < arr2[k]) {
printf("%d ", arr1[j]);
j++;
}
else {
printf("%d ", arr2[k]);
k++;
}
}
// 上方循环不满足,意味着有一个数组已经遍历完了
// 所以需要判断还有哪个数组有剩余元素,然后打印
if (j < n) //这里说明arr1数组还有没遍历完
{
for (; j < n; j++) {
printf("%d ", arr1[j]);
}
}
else {
for (; k < m; k++) {
printf("%d ", arr2[k]);
}
}
return 0;
}
//合并版本
int main() {
int n = 0;
int m = 0;
scanf("%d %d", &n, &m);
int arr1[n];
int arr2[m];
int arr3[m + n];
int i = 0;
for (i = 0; i < n; i++) {
scanf("%d", &arr1[i]);
}
for (i = 0; i < m; i++) {
scanf("%d", &arr2[i]);
}
// 思路:
// 假设第一个数组的下标为j,第二个数组的下标为k。创建第三个数组放置前两个数组的元素
// 用arr1[j]和arr2[k]比较,谁小先放进第三个数组,之后该数组下标+1,依次类推
int j = 0;//arr1
int k = 0;//arr2
int r = 0;//arr3
while (j < n && k < m) {
if (arr1[j] < arr2[k]) {
arr3[r++] = arr1[j];
j++;
}
else {
arr3[r++] = arr2[k];
k++;
}
}
// 上方循环不满足,意味着有一个数组已经遍历完了
// 所以需要判断还有哪个数组有剩余元素,然后打印
if (j < n) { //这里说明arr1数组还有没遍历完
for (; j < n; j++) {
arr3[r++] = arr1[j];
}
}
else {
for (; k < m; k++) {
arr3[r++] = arr2[k];
}
}
// 打印
for (i = 0; i < m + n; i++) {
printf("%d ", arr3[i]);
}
return 0;
}
3. 把一个数的每一位的奇数变成1,偶数变成0
示例1: 输入:222222 输出:0
示例2: 输入:123 输出:101
#include <math.h>
//思路:
//通过%10 得到最后一位
//通过/10 去掉最后一位
//再用每一位%2,确定结果是0或1
//每一位的0或1需要权重,假设结果是101,那么最高位的1就是1*10^2,依次类推,把所有结果加起来
int main() {
int input = 0;
scanf("%d", &input);
int sum = 0;
int i = 0;
while (input) {
int bit = input % 10; //获取最后一位
// if (bit % 2 == 1) {
// sum += 1 * pow(10, i);
// i++;
// } else {
// sum += 0 * pow(10, i);
// i++;
// }
// 简化
if (bit % 2 == 1) {
bit = 1;
}
else {
bit = 0;
}
sum += bit * pow(10, i++);
input /= 10; //剥离最后一位
}
printf("%d\n", sum);
return 0;
}
4. 打印直角三角形
KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“* ”组成的带空格直角三角形图案。
输入描述:多组输入,一个整数(2~20),表示直角三角形直角边的长度,即“ * ”的数量,也表示输出行数。
输出描述:针对每行输入,输出用“ * ”组成的对应长度的直角三角形,每个“ * ”后面有一个空格。
输入:5
输出:
*
* *
* * *
* * * *
* * * * *
//思路:
// 0 1 2 3 4
//0 *
//1 * *
//2 * * *
//3 * * * *
//4* * * * *
//行和列加起来小于4打印空格,大于等于4打印*空格
int main() {
int n = 0;
while (scanf("%d", &n) == 1) {
int i = 0;
int j = 0;
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
if (i + j < n - 1) {
printf(" ");
}
else {
printf("* ");
}
}
printf("\n");
}
}
return 0;
}
5. 计算打折后的价格
KiKi非常喜欢网购,在一家店铺他看中了一件衣服,他了解到,如果今天是“双11”(11月11日)则这件衣服打7折,“双12” (12月12日)则这件衣服打8折,如果有优惠券可以额外减50元(优惠券只能在双11或双12使用),求KiKi最终所花的钱数。
输入描述:一行,四个数字,第一个数表示小明看中的衣服价格,第二和第三个整数分别表示当天的月份、当天的日期、第四个整数表示是否有优惠券(有优惠券用1表示,无优惠券用0表示)。
注:输入日期保证只有“双11”和“双12”。
输出描述:一行,小明实际花的钱数(保留两位小数)。(提示:不要指望商家倒找你钱)
int main() {
double price = 0.0;
int month = 0;
int day = 0;
int discount = 0;
scanf("%lf %d %d %d", &price, &month, &day, &discount);
//计算
if (month == 11)
{
price = price * 0.7 - discount * 50;
}
else if (month == 12)
{
price = price * 0.8 - discount * 50;
}
//输出
if (price < 0)
{
printf("%.2lf", 0);
}
else
{
printf("%.2lf", price);
}
return 0;
}