每日刷题(三十)
BASIC-14、时间转换
这题非常简单,这里就不做过多赘述了,详细C代码如下
#include<stdio.h>
int main()
{
int n;
scanf("%d", &n);
printf("%d:%d:%d\n", n / 3600, n % 3600 / 60, n % 3600 % 60);
return 0;
}
部分示例结果展示如下
BASIC-15、字符串对比
这个题其实给人的思路也很清晰,分四类讨论,第一个划分条件是两个字符串的长度是否相等,第二个划分条件是字符串是否相等,第三个划分条件是不考虑大小写字符串是否相等。详细C代码如下:
#include<stdio.h>
#include<string.h>
#include<math.h>
int f(char s1[], char s2[])
{
int i, num = 0;
for(i = 0; s1[i] != '\0'; i++)
{
if(abs(s1[i] - s2[i]) == 32)
num++;
else if(s1[i] == s2[i])
num++;
}
if(num == i)
return 1;
else
return 0;
}
int main()
{
char s1[10], s2[10];
scanf("%s", s1);
scanf("%s", s2);
int c1, c2;
c1 = strlen(s1);
c2 = strlen(s2);
if(c1 != c2)
printf("1\n");
else
{
if(strcmp(s1, s2) == 0)
printf("2\n");
else if(f(s1, s2))
printf("3\n");
else
printf("4\n");
}
return 0;
}
部分示例运行结果如下:
BASIC-16、分解质因数
对于这道题的题意,有一部分人可能没读懂,质因数就是这个数既是质数,同时又是组成k的乘数之一。根据样例输入可以发现一个规律,奇数的质因数绝对都是奇数,而偶数的质因数一定有2,那么就要分两种情况考虑,一种是目标数是奇数,一种是目标数是偶数,而且对于大多数数据而言,他们都有很多质因数,所以就要用变量k来装i的值,进行运算。这里还要考虑输出格式的问题,如果目标数含有两个及其以上的质因数,那么就要考虑符号的输出格式,这里我们用cnt记载有多少质因数。当只有一个时,就输出数字无须附上*,所以在奇偶条件内还要包括一层if语句,详细C代码如下:
#include<stdio.h>
int main()
{
int n, m;
scanf("%d %d", &n, &m);
int i;
int k;
int cnt;
for(i = n; i <= m; i++)
{
cnt = 0; //质因数个数
printf("%d=",i);
k = i;
while(k != 1)
{
if(k % 2 == 0) //本为偶数
{
if(cnt >= 1)
printf("*2");
else
printf("2");
k /= 2;
cnt++;
}
else //本为奇数
{
int j;
for(j = 3; j < m; j += 2)
{
if(k % j == 0)
{
if(cnt >= 1)
printf("*%d",j);
else
printf("%d",j);
k /= j;
cnt++;
break;
}
}
}
}
printf("\n");
}
}
部分示例运行结果如下:
BASIC-17、矩阵乘法
这个题还是很值得思考的。这里也有很多坑。
(1)要考虑幂数,如果幂为0,那么矩阵处理后就应该是单位矩阵,如果幂为1,则矩阵就是为输入的矩阵本身,当然,需要注意输出格式。
(2)要考虑如何处理已经乘完的矩阵同时又不影响乘法过程,我这里设了三个数组,a[N][N]用来继承原始数组数据,b[N][N]开始初始化时跟a数组的值一样,但之后b数组就来承接依次幂运算后的结果,c[N][N]数组用来继承每一轮矩阵乘法后的数组,等一次矩阵乘法结束后再把它的值赋给b,以便下一次矩阵运算。
(3)要考虑数组数据大小,如果数据可能超出int所能记录的范围,可以考虑全程用long long型
我这里有两款C代码,一种是普通版,一种是高阶版(用了二维指针)
普通版:
#include<stdio.h>
int N;
void f(long long a[][N], long long b[][N], long long c[][N])
{
int i, j, t, k;
long sum;
for(i = 0; i < N; i++)
{
for(j = 0; j < N; j++)
{
sum = 0;
for(t = 0; t < N; t++)
{
sum += a[i][t] * b[t][j];
}
c[i][j] = sum;
}
}
for(i = 0; i < N; i++)
{
for(j = 0; j < N; j++)
{
b[i][j] = c[i][j];
}
}
}
int main()
{
int M;
scanf("%lld %lld", &N, &M);
int i, j;
long long a[N][N];
long long b[N][N];
long long c[N][N];
for(i = 0; i < N; i++)
{
for(j = 0; j < N; j++)
{
scanf("%lld", &a[i][j]);
b[i][j] = a[i][j];
}
}
int t;
for(t = 1; t < M; t++)
{
f(a, b, c);
}
if(M > 1)
{
for(i = 0; i < N; i++)
{
for(j = 0; j < N; j++)
{
printf("%lld ",b[i][j]);
}
printf("\n");
}
}
else if(M == 1)
{
for(i = 0; i < N; i++)
{
for(j = 0; j < N; j++)
{
printf("%lld ", a[i][j]);
}
printf("\n");
}
}
else if(M == 0)
{
for(i = 0; i < N; i++)
{
for(j = 0; j < N; j++)
{
if(i == j)
a[i][j] = 1;
else
a[i][j] = 0;
printf("%lld ", a[i][j]);
}
printf("\n");
}
}
return 0;
}
高阶版:
#include<stdio.h>
int N;
void f(int (*p)[N], int (*q)[N], int (*k)[N])
{
int i, j, t;
int sum;
for(i = 0; i < N; i++)
{
for(j = 0; j < N; j++)
{
sum = 0;
for(t = 0; t < N; t++)
{
sum += *(*(p + i) + t) * (*(*(q + t) + j));
}
*(*(k + i) + j) = sum;
}
}
for(i = 0; i < N; i++)
{
for(j = 0; j < N; j++)
{
*(*(q + i) + j) = *(*(k + i) + j);
}
}
}
int main()
{
int M;
scanf("%d %d", &N, &M);
int i, j;
int a[N][N];
int b[N][N];
int c[N][N];
for(i = 0; i < N; i++)
{
for(j = 0; j < N; j++)
{
scanf("%d", &a[i][j]);
b[i][j] = a[i][j];
}
}
int t;
int (*p)[N] = a;
int (*q)[N] = b;
int (*k)[N] = c;
for(t = 1; t < M; t++)
{
f(p, q, k);
}
if(M > 1)
{
for(i = 0; i < N; i++)
{
for(j = 0; j < N; j++)
{
printf("%lld ",b[i][j]);
}
printf("\n");
}
}
else if(M == 1)
{
for(i = 0; i < N; i++)
{
for(j = 0; j < N; j++)
{
printf("%lld ", a[i][j]);
}
printf("\n");
}
}
else if(M == 0)
{
for(i = 0; i < N; i++)
{
for(j = 0; j < N; j++)
{
if(i == j)
a[i][j] = 1;
else
a[i][j] = 0;
printf("%lld ", a[i][j]);
}
printf("\n");
}
}
return 0;
}
内存使用都一样大,第一个是高阶版,第二个是普通版的结果。
部分示例运行结果如下:
BASIC-30、阶乘计算
这个题目有点魔鬼,因为你要考虑你的数组到底设多大,你的数组能设多大。其次你得考虑数字存放的逻辑,分情况讨论,进位和未进位,同时需要设置两个变量,一个存放刚开始做乘法所产生的的进位,另一个存放前一个数乘法运算后产生的进位,每一轮循环要修改其值。
详细C代码如下:
#include<stdio.h>
//#include<string.h>
int main()
{
int a[90000] = {0};
// memset(a, 0, sizeof(a));
int n;
scanf("%d",&n);
int i;
a[0] = 1;
int j = 1;
int t = 0;
int m = 0;
int s = 0;
for(j = 1; j <= n; j++)
{
t = 0;
m = 0;
for(i = 0; i < 90000; i++)
{
m = a[i] * j / 10;
a[i] = a[i] * j % 10;
if(a[i] + t >= 10) //前一个数的进位
{
s = a[i] + t;
t = m + s / 10;
a[i] = s % 10;
}
else
{
a[i] += t;
t = m;
}
}
}
int k = 0;
for(i = 89999; i >= 0; i--)
{
if(a[i] != 0)
k = 1;
if(k)
printf("%d",a[i]);
}
printf("\n");
return 0;
}
这里列出一部分示例以及结果: