题目1(1-2020,位数出现过多少次数字2)
在1-2020的数位上,共出现过多少次字符2。
如:222,出现了3次。
核心代码:
#include<stdio.h>
int main()
{
int count = 0;
//历遍所有数字
for (int i = 1; i <= 2020; i++)
{
int num = i;//存一个新的数值,方便除
//下面是判断一个数字上出现过几次字符2
//如2020
//1.202,count=0
//2.20,count=1
//3.2,count=1
//4.0,count=2
while (num > 0)
{
if (num % 10 == 2)
{
count++;
}
num /= 10;
}
}
printf("%d", count);
}
答案是:624。
题目2(既约分数)
如果一个分数的分子和分母的最大公约数是1,这个分数称为既约分数。请问,有多少个既约分数,分子和分母都是1到2020之间的整数(包括1和2020)
核心代码:
#include <stdio.h>
// 计算两个数的最大公约数(欧几里德算法)
int gcd(int a, int b)
{
while (b != 0)
{
int temp = b;
b = a % b;
a = temp;
}
return a;
}
int main()
{
int count = 0;
// 遍历分子和分母的组合
for (int numerator = 1; numerator <= 2020; numerator++)
{
for (int denominator = 1; denominator <= 2020; denominator++)
{
// 判断最大公约数是否为1,即是否为既约分数
if (gcd(numerator, denominator) == 1)
{
count++;
}
}
}
printf("1到2020之间的既约分数的个数为:%d\n", count);
return 0;
}
答案:2481215。
题目3:蛇形数组
思路1:
#include <stdio.h>
#define MAX_SIZE 41 // 因为我们需要计算到第41条对角线
int main()
{
int matrix[MAX_SIZE][MAX_SIZE] = { 0 }; // 初始化一个足够大的矩阵
int num = 1; // 用于填充的数字
int i, j;
// 按照蛇形填数的规则填充矩阵
for (int diag = 0; diag < 2 * MAX_SIZE - 1; ++diag)
{
if (diag < MAX_SIZE)
{
// 对角线从左下角开始向右上角填充
for (i = diag, j = 0; i >= 0; --i, ++j)
{
matrix[i][j] = num++;
}
}
else
{
// 对角线从左下角开始向右上角填充
for (i = MAX_SIZE - 1, j = diag - MAX_SIZE + 1; j < MAX_SIZE; --i, ++j)
{
matrix[i][j] = num++;
}
}
}
// 输出坐标(20, 20)的值
printf("The number at (20, 20) is %d\n", matrix[20][20]);
return 0;
}
思路2:
我们需要找到蛇形填数矩阵中坐标 (20, 20) 对应的数字。这个矩阵是从左上角开始,沿着对角线依次填充的。每条对角线的起始数字是前一条对角线的起始数字加上对角线的序号。
#include <stdio.h>
int main()
{
int targetRow = 20, targetCol = 20;
int diag = targetRow + targetCol; // 对角线的序号
int num = 1; // 对角线的起始数字
int increment = 1; // 对角线上数字的增量
// 计算第 41 条对角线的起始数字
for (int i = 1; i <= diag; ++i)
{
num += i;
}
// 计算对角线上的第 21 个数字
int result = num + targetRow;
printf("The number at (%d, %d) is %d\n", targetRow, targetCol, result);
return 0;
}