目录
一、题目
二、更多测试用例
1、用例一
2、用例二
3、用例三
三、解题思路
1、经阅读题目,我们可以知道,题目中的乘法表只是我们小学学过的九九乘法表的变表。它要求我们输出在不同进制下的乘法表。
这个题目中的坑在它的输出格式要求上:输出 P 进制下的乘法表。P 进制中大于等于 10 的数字用大写字母 A
、B
、C
、⋯⋯ 表示。如果你只是将两数相乘的结果转换为P进制,并将P进制中大于等于 10 的数字用大写字母 A
、B
、C
、⋯⋯ 表示,那你就落入坑中了。
它输出格式的意思是所有只要大于等于10的数就要用A、B、C、⋯⋯ 表示,可以看以上用例二、三。
2、我们知道九九乘法表,而九九乘法表的代码如下:
int main()
{
//外循环控制行数,并提供1~9
for (int i = 1; i <=9; i++)
{
//内循环控制列数,并提供1~9
for (int j = 1; j <= i; j++)
{
// 打印出来的格式,记得空格一下以确保格式正确。
printf("%d*%d=%d ", i, j, i * j);
}
//每一行打印完就进行换行
printf("\n");
}
return 0;
}
而不同进制的乘法表也是以九九乘法表为框架进行更改得到的。那我们该如何做呢?
先给出在题目要求下的九九乘法表框架如下:
int main()
{
int P;
scanf("%d", &P);
//外循环控制行数,并提供1~9,i<P是因为不论是几进制下的乘法表,其最大数都小于P;
for (int i = 1; i <P; i++)
{
//内循环控制列数,并提供1~9
for (int j = 1; j <= i; j++)
{
// 打印出来的格式,记得空格一下以确保格式正确。
printf("%d*%d=%d ", i, j, i * j);
}
//每一行打印完就进行换行
printf("\n");
}
return 0;
}
因为输出格式的意思是所有只要大于等于10的数就要用A、B、C、⋯⋯ 表示,所以我们要分两步。一步判断i和j是否大于等于10,一步将i*j的结果转换进制。
3、我们先判断i和j是否大于等于10,并将大于等于10的用大写字母表示。这时就有一个问题,判断数字是否大于等于10很容易,但如何将大于等于10的数用大写字母表示呢?这时,我们就要用到我们的Ascll表了。表中大写字母的ascll码值为65.因此我们只需要将i+55和j+55,就可以将大于等于10的数用大写字母输出。
由九九乘法表我们可以得知i大于等于10时,j可能小于10.而j大于等于10时i一定大于等于10;
由此我们可以得到以下判断代码:
int main()
{
int P;
scanf("%d", &P);
//外循环控制行数,并提供1~9,i<P是因为不论是几进制下的乘法表,其最大数都小于P;
for (int i = 1; i <P; i++)
{
//内循环控制列数,并提供1~9
for (int j = 1; j <= i; j++)
{
if (i >= 10 && j<10)
{
printf("%c*%d=", i + 55, j);
}
else
{
if (j >= 10)
{
printf("%c*%c=", i + 55, j + 55);
}
else
{
//在i和j都小于10进行,不写等号后面的是为了方便第二步
printf("%d*%d=", i, j, i * j);
}
}
}
//每一行打印完就进行换行
printf("\n");
}
return 0;
}
4、在完成第一步后,我们来进行第二步,把i*j的结果转换,这个转化就只是单纯的对单个数的进制转换,我们知道将一个十进制数转换为其他进制,只需不断取余进制,然后反向排序即可获得。因此,我们只需写一个函数,传入的参数为i*j和P,不返回任何参数。然后在函数内对i*j的结果不断对P取余,然后再对每个余数判断和转换,最后输出即可,代码如下:
void css(int a, int p)
{
//定义一个字符数组好储存余数,因为规定了P的范围为2~36,所以定义元素个数为10000完全够用
char b[10000];
//数组b的标记
int i = 0;
while (a)
{
//判断余数是否大于等于10
if ((a % p) >= 10)
{
//储存并转换,同样用到了Ascll码表
b[i++] = a % p + 55;
//除去p,这也是这个while循环的逼近限制条件
a = a / p;
}
else
{
//将小于10的数转化为字符,48为字符0
b[i++] = a % p + 48;
a = a / p;
}
}
for (i = i - 1; i >= 0; i--)
{
//打印结果
printf("%c", b[i]);
}
}
int main()
{
int P;
scanf("%d", &P);
//外循环控制行数,并提供1~9,i<P是因为不论是几进制下的乘法表,其最大数都小于P;
for (int i = 1; i <P; i++)
{
//内循环控制列数,并提供1~9
for (int j = 1; j <= i; j++)
{
if (i >= 10 && j<10)
{
printf("%c*%d=", i + 55, j);
}
else
{
if (j >= 10)
{
printf("%c*%c=", i + 55, j + 55);
}
else
{
//在i和j都小于10进行,不写等号后面的是为了方便第二步
printf("%d*%d=", i, j, i * j);
}
}
//传参
css(i * j, P);
//保证与题目要求的格式一致
printf(" ");
}
//每一行打印完就进行换行
printf("\n");
}
return 0;
}
如此这个题目就解决了,如果有更为高效或者不一样的解题思路也可于评论区留言。
标签:10,进制,int,等于,蓝桥,2020,printf,大于,乘法表 From: https://blog.csdn.net/2401_86688820/article/details/144636906