每日刷题(三十一)
BASIC-10、十进制转十六进制
思路如下:
其实这根本就不算一个题,你可以直接提交一个六行代码
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
printf("%X\n", n);
return 0;
}
正统代码如下:
#include<stdio.h>
int main()
{
int n;
scanf("%d", &n);
char a[] = {48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 'A', 'B', 'C', 'D', 'E', 'F'};
int t = n;
int tmp = n % 16;
char m;
char k[100];
int i;
if(n / 16 == 0)
{
m = a[tmp];
printf("%c", m);
return 0;
}
else
{
i = 0;
while(t)
{
k[i] = a[tmp];
t = t / 16;
tmp = t % 16;
i++;
}
while(i > -1)
{
printf("%c", k[--i]);
}
}
return 0;
}
部分运行结果如下:
BASIC-11、十六进制转十进制
这题也非常简单,但是要注意一点,定义数值型为long long型更保险,以免溢出
详细C代码如下:
#include<stdio.h>
#include<string.h>
int change(char a[], int i)
{
switch(a[i])
{
case '0':
return 0;
case '1':
return 1;
case '2':
return 2;
case '3':
return 3;
case '4':
return 4;
case '5':
return 5;
case '6':
return 6;
case '7':
return 7;
case '8':
return 8;
case '9':
return 9;
case 'A':
return 10;
case 'B':
return 11;
case 'C':
return 12;
case 'D':
return 13;
case 'E':
return 14;
case 'F':
return 15;
}
}
int main()
{
char a[8];
scanf("%s", a);
int t = strlen(a);
long long num = 0;
int i = 0;
num = change(a, i);
while(--t)
{
num = 16 * num + change(a, i + 1);
i++;
}
printf("%lld\n", num);
return 0;
}
BASIC-12、十六进制转八进制
特别省事的代码如下
#include<stdio.h>
#include<string.h>
int change(char a[], int i)
{
switch(a[i])
{
case '0':
return 0;
case '1':
return 1;
case '2':
return 2;
case '3':
return 3;
case '4':
return 4;
case '5':
return 5;
case '6':
return 6;
case '7':
return 7;
case '8':
return 8;
case '9':
return 9;
case 'A':
return 10;
case 'B':
return 11;
case 'C':
return 12;
case 'D':
return 13;
case 'E':
return 14;
case 'F':
return 15;
}
}
int main()
{
char a[100000];
int n;
scanf("%d", &n);
int v;
for(v = 0; v < n; v++)
{
scanf("%s", a);
int t = strlen(a);
long long num = 0;
int i = 0;
num = change(a, i);
while(--t)
{
num = 16 * num + change(a, i + 1);
i++;
}
printf("%o\n", num);
}
return 0;
}
但是因为题目要求把所有输入数据都输完后才可以输出,所以不符合要求,上面那套代码就只适合玩玩,下面才是正规解:
#include<stdio.h>
#include<string.h>
int change(char a[], int i)
{
switch(a[i])
{
case '0':
return 0;
case '1':
return 1;
case '2':
return 2;
case '3':
return 3;
case '4':
return 4;
case '5':
return 5;
case '6':
return 6;
case '7':
return 7;
case '8':
return 8;
case '9':
return 9;
case 'A':
return 10;
case 'B':
return 11;
case 'C':
return 12;
case 'D':
return 13;
case 'E':
return 14;
case 'F':
return 15;
}
}
int main()
{
char a[100000];
int n;
scanf("%d", &n);
int cnt = 0;
long long th[100000];
int v;
for(v = 0; v < n; v++)
{
scanf("%s", a);
int t = strlen(a);
long long num = 0;
int i = 0;
num = change(a, i);
while(--t)
{
num = 16 * num + change(a, i + 1);
i++;
}
int k[100000];
int w = num;
int u = num % 8;
if(num / 8 == 0)
{
th[cnt++] = u;
continue;
}
else
{
int z = 0;
while(w)
{
k[z] = u;
w = w / 8;
u = w % 8;
z++;
}
z--;
long long rv = k[z];
while(z > 0)
{
rv = rv * 10 + k[--z];
}
th[cnt++] = rv;
}
}
int tc = 0;
for(; tc < cnt; tc++)
printf("%lld\n", th[tc]);
return 0;
}
样例运行结果如下:
最后还是要吐槽一下,什么变态测试数据!
BASIC-13、数列排序
我这里用的是冒泡排序法,详细代码如下:
#include<stdio.h>
int main()
{
int n;
scanf("%d", &n);
int a[n];
int i;
for(i = 0; i < n; i++)
scanf("%d", &a[i]);
int j;
int tmp = 0;
for(i = 0; i < n - 1; i++)
{
for(j = i + 1; j < n; j++)
{
if(a[i] > a[j])
{
tmp = a[j];
a[j] = a[i];
a[i] = tmp;
}
}
}
for(i = 0; i < n; i++)
printf("%d ", a[i]);
printf("\n");
return 0;
}