第一题:
有1,2,3,4,4个数字,请问能组成多少个互不相同的三位数?都是多少?
这是我自己想的思路,答案是对的,过程繁琐了些。
#include<stdio.h>
int main(void)
{
int number[4] = { 1, 2, 3, 4 };//初始数组
int left_number1[3] = { 0, 0, 0 }, left_number2[2] = {0,0};//第1个数组用于存放被挑选1个数后,初始数组剩余的数被放于第1个数组;第2个数组用于存放再被挑选一个数后,第1个数组剩余的数放于第2个数组
int i, j,k,t,position,first_number,second_number;//每2个变量用于控制循环,位置变量用于存放数组,两个数字变量用于存放被挑选后的数
int count=0;//用于计数
for (i = 0; i < 4; i++)
{
position = 0;
//挑选第1个数后,把剩余的数放于第1个剩余数组
first_number = number[i];
for (j = 0; j < 4; j++)
{
if (j != i)
{
left_number1[position] = number[j];
position++;
}
}
position = 0;
//进行第2次挑选
for (k = 0; k < 3; k++)
{
//挑选第2个数字
second_number = left_number1[k];
//在挑选第2个数字后,把剩余数字放于第2个剩余数组中
for (t = 0; t < 3; t++)
{
if (t != k)
{
left_number2[position] = left_number1[t];
position++;
}
}
//此时第2个剩余数组选择完毕,第2个剩余数组只有两个数字。此时只需要输出两次即可
printf("%5d %5d", (first_number * 100 + second_number * 10 + left_number2[0]), (first_number * 100 + second_number * 10 + left_number2[1]));
//由于每次打印两个数字,故每次计数+2
count += 2;
printf("\n");
}
}
printf("%4d", count);
return 0;
}
上述我的代码的思路是:自己从已经设置好的数组去选择和挑选。具体的思考过程已经给了注释。
接下来的代码是我看B站上关于这个题的参考解答
int i, j, k, a[100], n = 0;
for (i = 1; i <= 4; i++)
{
for (j = 1; j <= 4; j++)
{
for (k = 1; k <= 4; k++)
{
if (i != j&&i != k&&j != k)
{
a[n] = i * 100 + j * 10 + k;
n++;
}
}
}
}
printf("能组成%d个无重复数字的三位数\n", n);
printf("分别是:");
for (i = 0; i < n; i++)
printf("%3d", a[i]);
return 0;
这个参考解答的思路更nice。它是从题目中说的三个不同的数字从发,且3个数字都是处于1~4中。则我只需要让i,j,k分别都从1变化到4,且包含2次for嵌套。再用if条件语句去判断3个数字都不同的条件,只要满足这个条件,就可以输出这个数字。
第二题:
利润(I)低于或等于10万元时,奖金可提10%;
利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;
20万到40万之间时,高于20万元的部分,可提成5%;
40万到60万之间时高于40万元的部分,可提成3%;
60万到100万之间时,高于60万元的部分,可提成1.5%;
高于100万元时,超过100万元的部分按1%提成。
解题思路:这一题很容易做,主要考察if和else语句的使用
double profit,bonus;//定义利润与奖金的变量
printf("Please enter the profit(W RMB) :");//告诉输入者利润以万元为单位。
scanf("%lf", &profit);
if (profit <= 10)
bonus = profit*0.1;
else if (profit >= 10 && profit < 20)
bonus = 10 * 0.1 + (profit - 10)*0.075;
else if (profit >= 20 && profit < 40)
bonus = 10 * 0.1 + 10 * 0.75 + (profit - 20)*0.05;
else if (profit >= 40 && profit < 60)
bonus = 10 * 0.1 + 10 * 0.75 + 20 * 0.05 + (profit - 40)*0.03;
else if (profit >= 60 && profit <= 100)
bonus = 10 * 0.1 + 10 * 0.75 + 20 * 0.05 + 20 * 0.03 + (profit - 60)*0.015;
else if (profit >100)
bonus = 10 * 0.1 + 10 * 0.75 + 20 * 0.05 + 20 * 0.03 + 40 * 0.015 + (profit - 100)*0.01;
printf("The bonus is %g", bonus);
唯一需要注意的是:如果使用float是可能会丢失,定义为double型是较为合适的。
第三题:
一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
解题思路:首先,肯定需要通过键盘输入一个界限,来找在这个界限范围内合适的数字。其次,通过两次for循环,分别找到满足加100后的数字,再通过下一个for循环,找到在满足加100后还满足加168的数字。
int x,n,m,number[100];//定义x为我们想要找的那个数,用n去判断加100后的完全平方,用m去判断加168后的平方
int limit;//手动输入界限去猜这个范围内合理的数字
int position = 0;//定义位置变量用来存储合适的数字
printf("Please enter the limit :");
scanf("%d", &limit);
for (x = 0; x < limit; x++)
{
//这一步是去找经过加100后在界限里面合适的数字
for (n = 1; n < limit; n++)
{
if ((x + 100) == (n*n))
{
number[position] = x;
position++;
}
}
}
//这一步是去在已经经过筛选的number数组里面去找合适的数字
for (int i = 0; i< position; i++)
{
//用一个for循环是在数组里面用m去找合适的数
for (m = 1; m <limit; m++)
{
if ((number[i] + 268) == (m*m))
printf("%5d", number[i]);
}
}
接下来是B站参考解答的代码,我觉得思路和做第一题一样类似的思路。
int i, j, k;
for (i = 0; i <= 1000; i++)
for (j = 0; j <= 1000; j++)
for (k = 0; k <= 1000; k++)
if ((i + 100 == j*j) && (i + 268) == k*k)
printf("这个数是%d\n", i);
总结下:第1题和第3题B站UP主采用了类似的思路。在第3题中用3个for循环嵌套去找,然后通过与语句共同来判断。但是对比一下,我觉得我的程序运行效率更高些。
第四题:
输入某年某月某日,判断这一天是这一年的第几天?
解题思路:主要考虑闰年,然后主要考察switch语句的使用。这个题还是很容易思考的。但是我在解这个题时犯了一个小失误。我忘记了switch语句是先根据case选择后,如果对应的case语句没有break,才会依次往下执行。我给记成了switch语句,是先从第一个case语句开始,真是犯了低级的失误。
int year, month, day;//用来输入日,月,天的变量
int count = 0;//用来计算第多少天的变量
printf("Please enter year month day :");
scanf("%d %d %d", &year, &month, &day);
switch (month)
{
case 1:
count = day;
break;
case 2:
count = day + 31;
break;
case 3:
count = day + 31 +28;
break;
case 4:
count = day + 31*2 + 28;
break;
case 5:
count = day + 31 * 2 + 28+30;
break;
case 6:
count = day + 31 * 3 + 28 + 30;
break;
case 7:
count = day + 31 * 3 + 28 + 30*2;
break;
case 8:
count = day + 31 * 4 + 28 + 30*2;
break;
case 9:
count = day + 31 * 5 + 28 + 30*2;
break;
case 10:
count = day + 31 * 5 + 28 + 30*3;
break;
case 11:
count = day + 31 * 5 + 28 + 30 * 4;
break;
case 12:
count = day + 31 * 5 + 28 + 30 * 5;
break;
}
if (year % 4 == 0)
count++;
printf("This %d day is %d year's %dth day", day, year, count);
第五题:
输入三个整数x,y,z,请把这三个数由小到大输出。
解题思路:这个已经是基础题,就是两两比较即可。也可以用for循环采用冒泡排序法也是可以的。
int x, y, z,temp;
//进行3次比较即可
scanf("%d %d %d", &x, &y, &z);
if (x > y)
{
temp = x;
x = y;
y = temp;
}
if (x > z)
{
temp = x;
x = z;
z = temp;
}
if (y > z)
{
temp = y;
y = z;
z = temp;
}
printf("%d %d %d ", x, y, z);
return 0;
今天,先写5道题。后面接着更新。