成长轨迹42 【ACM算法之路 百炼poj.grids.cn】【数值转换】【2972、2798、2735、2734、2973】
一次ac的没啥好说、、、
2972:确定进制
1 #include<stdio.h>
2 #include<string.h>
3
4 int a1[10];
5 int b1[10];
6 int c1[10];
7 int main()
8 {
9 int t;
10 scanf("%d",&t);
11 for(int p=0;p<t;p++)
12 {
13 memset(a1,0,sizeof(a1));
14 memset(b1,0,sizeof(b1));
15 memset(c1,0,sizeof(c1));
16 int a,b,c;
17 scanf("%d%d%d",&a,&b,&c);
18 if( (c&&(a==0||b==0))||
19 (a==b&&b==c)||
20 (a==1&&b!=c)||
21 (b==1&&a!=c))
22 printf("0\n");
23 else
24 {
25 int na=0;
26 if(!a) na=1;//0也是1位
27 while(a)
28 {
29 a1[na]=a%10;
30 a/=10;
31 na++;
32 }
33
34
35 int nb=0;
36 if(!b) nb=1;
37 while(b)
38 {
39 b1[nb]=b%10;
40 b/=10;
41 nb++;
42 }
43
44 int nc=0;
45 if(!c) nc=1;
46 while(c)
47 {
48 c1[nc]=c%10;
49 c/=10;
50 nc++;
51 }
52 int a2,b2,c2;
53 int k;
54 for(k=2;k<1000000;k++)
55 {
56 if(na&&nb&&nc&&(k<=a1[na-1]||k<=b1[nb-1]||k<=c1[nc-1]))
57 continue;
58 //if(a1[0]*b1[0]!=c1[0])
59 // continue;
60 //【这个不行,因为化成10进制时个位还是会跟原进制的其它位相关】
61 bool quit = false;
62 a2=a1[na-1];
63 for(int j=na-2;j>=0;j--)
64 {
65 a2*=k;
66 a2+=a1[j];
67 if(a1[j]>=k)
68 {
69 quit = true;
70 break;
71 }
72 }
73 if(quit)
74 continue;
75
76 b2=b1[nb-1];
77 for(int j=nb-2;j>=0;j--)
78 {
79 b2*=k;
80 b2+=b1[j];
81 if(b1[j]>=k)
82 {
83 quit = true;
84 break;
85 }
86 }
87 if(quit)
88 continue;
89
90 c2=c1[nc-1];
91 for(int j=nc-2;j>=0;j--)
92 {
93 c2*=k;
94 c2+=c1[j];
95 if(c1[j]>=k)
96 {
97 quit = true;
98 break;
99 }
100 }
101 if(quit)
102 continue;
103
104 if(a2*b2==c2)
105 {
106 printf("%d\n",k);
107 break;
108 }
109
110
111 }
112 if(k==1000000)
113 printf("0\n");
114 }
115
116 }
117 return 0;
118 }
2798:2进制转化为16进制
1 #include<stdio.h>
2 #include<string.h>
3
4 int main()
5 {
6 int n;
7 scanf("%d",&n);
8 for(int i=0;i<n;i++)
9 {
10 char n16[3000];
11 char n[12000];
12 scanf("%s",&n);
13 int leng = strlen(n);
14 int len16 = (leng+3)/4;
15
16 for(int j=leng-4;j>-4;j-=4)
17 {
18 int a16=0;
19 for(int k=0;k<4;k++)
20 {
21 a16 *= 2;
22 if(j+k>=0)
23 a16+=(n[j+k]-'0');
24 }
25 if(a16>=10&&a16<=15)
26 n16[(j+3)/4]=char('A'+(a16-10));//【向上进位】
27 else
28 n16[(j+3)/4]=char('0'+a16);
29
30
31 }
32 for(int k=0;k<len16;k++)
33 {
34 printf("%c",n16[k]);//【注意改回使用数组元素,而非首地址,否则会出来奇怪的字符】
35 }
36 printf("\n");
37 }
38 return 0;
39 }
2735:八进制到十进制
1 #include<stdio.h>
2 #include<string.h>
3
4 int main()
5 {
6 int a;
7 scanf("%d",&a);
8 int a10=0;
9 int mult=1;
10 while(a)//【越低位乘得越少!!】
11 {
12 a10+=mult*(a%10);
13 mult*=8;
14 a/=10;
15 }
16 printf("%d\n",a10);
17 return 0;
18 }
2734:十进制到八进制
1 #include<stdio.h>
2 #include<string.h>
3
4
5 int main()
6 {
7 int a;
8 scanf("%d",&a);
9 int a8=0;
10 int mult=1;
11 while(a)//【越低位乘得越少!!】
12 {
13 a8+=mult*(a%8);
14 mult*=10;
15 a/=8;
16 }
17 printf("%d\n",a8);
18 return 0;
19 }
2973:Skew数
1 #include<stdio.h>
2 #include<string.h>
3
4 char n[35];
5 int main()
6 {
7 while(1)
8 {
9 int skew=0;
10 scanf("%s",&n);
11 int leng = strlen(n);
12 if(leng==1&&n[0]-'0'==0)
13 break;
14
15 int power=2;
16 skew=n[leng-1]-'0';//【记得减‘0’!】
17 for(int i=leng-2;i>=0;i--)
18 {
19 power*=2;
20 skew+=((n[i]-'0')*(power-1));
21 }
22 printf("%d\n",skew);
23 }
24
25 return 0;
26 }