C语言初阶小练习(6)

目录

//完全平方数且其中两位数字两相等

//回文数

//求a+aa+aaa+aaaa+aaaaa+……的和,其中a是一个数字

//喝汽水问题

//上三角矩阵判断

//有序数列合并

//有序数列判断

//奇偶排序:奇在前,偶在后


//完全平方数且其中两位数字两相等

编写程序寻找既是完全平方数,又有两位数字相同的三位正整数,例如121、144等。要求统计满足该条件的整数个数,并从大到小打印这些整数。

#define _CRT_SECURE_NO_WARNINGS
#include
int main()
{
	int num = 0;
	for (num = 100; num <= 999; num++)
	{
		int i = 10;
		while(i*i<=num)//先找到平方数,再看是不是有两个相等,可以提高效率
		{
			int bai = num / 100;
			int ge = num % 10;
			int shi = (num - 100 * bai - ge) / 10;//孩子在这里卡了好久呜呜呜,千万别忘了 /10 !!
			if (num == i * i) 
				if(bai == shi || bai == ge || shi == ge)
			    {
				    printf("%d ", num);
			    }
			i++;
		}
	}
	return 0;
}

//回文数

回文是指正反序文字相同,如,LeveL,若是则输出“Yes”,否则输出“No”

#define _CRT_SECURE_NO_WARNINGS
#include
int main()
{
	char arr[10];
	printf("请输入一个字符串:");
	scanf("%s", arr);
	int sz = sizeof(arr) / sizeof(arr[0]);
	int left = 0;
	int right = sz - 1;
	int flag = 1;
	for (left = 0, right = sz - 1; left <= right; left++, right--)
	{
		if (arr[left] != arr[right])//只要有一对不同,跳出循环
		{
			flag = 0;
          break;
		}
	}
	if (flag)
	{
		printf("Yes\n");
	}
	else
	{
		printf("No\n");
	}
	return 0;
}

//求a+aa+aaa+aaaa+aaaaa+……的和,其中a是一个数字

这题思路巨多,可以a*1+a*11+a*111+……,也可以从后往前加,每次 / 10,等等。

int main()
{
	int n = 0;//总共几项
	int a = 0;//a+aa+aaa+……
	scanf("%d %d", &a, &n);
	int sum = 0;//计算n项的和
	int i = 0;
	int k = 0;//k为其中一项
	for (i = 0; i < n; i++)//循环计算每一项
	{
		k = k * 10 + a;
		sum += k;
	}
	printf("%d\n", sum);
	return 0;
}

C语言初阶小练习(6)_第1张图片

//喝汽水问题

喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以买多少汽水

其实由数学归纳法不难得出 total = empty * 2 - 1 ,不过这样这题就没有意义了,这里用点不一样的~

#define _CRT_SECURE_NO_WARNINGS
#includeint main()
{
	int money = 0;//你有多少钱
	int total = 0;//一共能买多少瓶
	int empty = 0;//空瓶数量
	scanf("%d", &money);
	total = money;//一开始买了多少瓶
	empty = money;//一开始喝完后空瓶的数量

	//从这里开始漫漫环保路(省钱路)
	while (empty >= 2)//只要空瓶剩两个以上就可兑换
	{
		total += (empty / 2);//空瓶能兑换的汽水
		empty = empty / 2 + empty % 2;//前面是兑换后喝完的空瓶,后面是兑换前落单的空瓶
	}
	printf("%d\n", total);
	return 0;
}

//上三角矩阵判断

对角线以下元素均为0则是上三角矩阵,如:

1 2 3         

0 4 5         

0 0 6

#define _CRT_SECURE_NO_WARNINGS
#include
int main()
{
	printf("请问想输入几行几列?:");
	int n = 0;
	scanf("%d", &n);
	int arr[10][10];
	printf("请输入矩阵:):\n");
	int i = 0;
	int j = 0;
	//输入
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n; j++)
		{
			scanf("%d", &arr[i][j]);
		}
	}
	//判断
	int flag = 1;//flag我们已经用了很多次了,这里就不赘述为什么了
	for (i = 0; i < n; i++)
	{
		//观察可知满足条件的矩阵中对角线下 j 都小于 i
		for (j = 0; j < i; j++)
		{
			if (arr[i][j] != 0)
			{
				flag = 0;
				goto end;//break只能跳出一层循环,而goto end 想去哪就去哪
			}            //哦吼吼 ,新用法,有没有学到??
		}
	}
end://注意这里是冒号不是分号!!!
	printf("是否为上三角矩阵?:");
	if (flag)
	{
		printf("yes\n");
	}
	else
	{
		printf("no\n");
	}
  return 0;
}

C语言初阶小练习(6)_第2张图片

//有序数列合并

将两组有序数列合并 

方法很多,可以直接现将两组数组存入新数组中再排序,不过这样原数组有序无序都不重要了,这里我们物尽其用,既然原数组已经有序,就可以边比较边排列

#define _CRT_SECURE_NO_WARNINGS
#include
int main()
{
	int arr1[10];
	int arr2[10];
	int arr3[20];//数组3元素是前两数组元素之和
	int m = 0;
	int n = 0;
	printf("数组1和数组2分别有几个元素?:");
	scanf("%d%d", &m, &n);
	int i = 0;
	int j = 0;
	int k = 0;
	//输入
	printf("请输入第一个数组:");
	for (i = 0; i < m; i++)
	{
		scanf("%d", &arr1[i]);
	}
	printf("请输入第二个数组:");
	for (i = 0; i < n; i++)
	{
		scanf("%d", &arr2[i]);
	}
	//边比较边合并
    i = 0;//这一步千万不能少!!!
	while (i < m && j < n)//前提条件:数组访问不会越界
	{
		if (arr1[i] < arr2[j])
		{
			arr3[k] = arr1[i];
			i++;
			k++;
		}
		else
		{
			arr3[k] = arr2[j];
			j++;
			k++;
		}
	}
	if (i == m)//arr1先访问完
	{
		//把arr2中剩余元素放在arr3中
		while (j < n)
		{
			arr3[k] = arr2[j];
			j++;
			k++;
		}
	}
	else//arr2先访问完
	{
		//把arr1中剩余元素放在arr3中
		while (i < m)
		{
			arr3[k] = arr1[i];
			i++;
			k++;
		}
	}
	//打印
	for (k = 0; k < m + n; k++)
	{
		printf("%d ", arr3[k]);
	}
	return 0;
}

 C语言初阶小练习(6)_第3张图片

//有序数列判断

判断一组数是否有序,相同也算有序 

#define _CRT_SECURE_NO_WARNINGS
#include
int main()
{
    int n = 0;
    scanf("%d", &n);
    int arr[10];
    int i = 0;
    //还是用flag,我愿称之为flag万能法
    int flag1 = 0;//标记升序
    int flag2 = 0;//标记降序

    for (i = 0; i < n; i++)
    {
        scanf("%d", &arr[i]);
        if (i > 0)//从第二个数开始就可以和第一个数比较了
        {
            //如果一直升序:flag1=1,flag2=0
            if (arr[i - 1] < arr[i])
            {
                flag1 = 1;
            }
            //如果一直降序:flag1=0,flag2=1
            else if (arr[i - 1] > arr[i])
            {
                flag2 = 1;
            }
        }
    }
    if (flag1 + flag2 < 2)//即等于0或等于1
        printf("sorted\n");
    else
        printf("unsorted\n");
    return 0;
}

C语言初阶小练习(6)_第4张图片

//奇偶排序:奇在前,偶在后

将一组数组中奇数放在前面,偶数放在后面

不强调新数组奇偶数有序

#define _CRT_SECURE_NO_WARNINGS
#include
void move(int arr[], int sz)
{
	int left = 0;
	int right = sz - 1;
	//从前往后找偶数,从后往前找奇数
	while (left < right)
	{
		//找偶数
		while ((left < right) && (arr[left] % 2 == 1))
		{
			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 };
	printf("请输入十个整数:");
	int i = 0;
	int sz = sizeof(arr)/sizeof(arr[0]);
	for (i = 0; i < sz; i++)
	{
		scanf("%d", &arr[i]);
	}
	move(arr, sz);
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

jC语言初阶小练习(6)_第5张图片

 好长时间没有更新小练习了,这七道题中有些题有一点点小难度,一起加油吧!!

你可能感兴趣的:(C语言初阶小练习,c语言,算法,蓝桥杯)