P8723 [蓝桥杯 2020 省 AB3] 乘法表

题目描述

九九乘法表是学习乘法时必须要掌握的。在不同进制数下,需要不同的乘法表。

例如, 四进制下的乘法表如下所示:

1*1=1
2*1=2 2*2=10
3*1=3 3*2=12 3*3=21

请注意,乘法表中两个数相乘的顺序必须为样例中所示的顺序,不能随意交换两个乘数。

给定 P,请输出 P 进制下的乘法表。

输入格式

输入一个整数 P

输出格式

输出 PP 进制下的乘法表。PP 进制中大于等于 1010 的数字用大写字母 ABC⋯ 表示。

 

 

 思路

可以由十进制转任何进制入手,根据连除法将十进制转化为任何进制,连除法即被除数处于进制p余数为进制的n位上的数(n=p^i,i∈[0,+∞],i∈z),分两种情况当进制<10时和进制>=10,一种输出整型一种输出字符型。

代码

 1 #include <stdio.h>
 2 void jinzhi(int,int);
 3 void jinzhizimu(int,int);
 4 int main(){
 5     int p;
 6     int i,j;
 7     scanf("%d",&p);
 8     for(i=1;i<p;i++){
 9         for(j=1;j<=i;j++){
10             if(p<=9){
11             printf("%d*%d=",i,j);
12             jinzhi(i*j,p);
13         }
14             else {
15                 if(i>=10&&j<=9){
16                     printf("%c*%d=",'A'+i-10,j);
17                 }else if(i>=10&&j>=10){
18                     printf("%c*%c=",'A'+i-10,'A'+j-10);
19                 }else{
20                     printf("%d*%d=",i,j);
21                 }
22                 jinzhizimu(i*j,p);
23                 
24             }
25             if(j!=i)printf(" ");
26             else printf("\n");
27         }
28     }
29     return 0;
30 }
31 
32 void jinzhi(int x,int p){    //连除法
33     int a[100];  
34     int num=0;
35     int i;
36     do{
37         a[num++]=x%p;
38         x=x/p;
39     }while(x!=0); 
40     
41     for( i=num-1;i>=0;i--){
42         printf("%d",a[i]);
43     }
44 } 
45 
46 void jinzhizimu(int x,int p){    //与前面一种类似不过要进行转化(int->char)
47     char a[100];  
48     int sum;
49     char c;
50     int num=0;
51     int i;
52     do{
53         sum=x%p;
54         if(sum>=10){
55             a[num++]=('A'+sum-10);   //大于10转化为A--E;
56         }else{
57             a[num++]='0'+sum;       //小于10转化为字符型0--9;
58         }
59         x=x/p;
60     }while(x!=0); 
61     for( i=num-1;i>=0;i--){
62         printf("%c",a[i]);
63     }
64 }

 

posted @ 2023-01-15 18:31  清风南鸢、  阅读(244)  评论(0)    收藏  举报