求特殊自然数
描述
一个十进制自然数,它的七进制与九进制表示都是三位数,且七进制与九进制的三位数码表示顺序正好相反。编程求此自然数,并输出显示。
输入
无。
输出
三行:
第一行是此自然数的十进制表示;
第二行是此自然数的七进制表示;
第三行是此自然数的九进制表示。
样例输入
(无)
样例输出
(不提供)
#include <stdio.h>
int main() {
int n, a, b, c, d, temp;
for (int i = 100; i <= 729; i++) {
n = i;
a = 0;
int factor = 1;
while (n > 0) {
a += (n % 7) * factor;
n /= 7;
factor *= 10;
}
n = i;
b = 0;
factor = 1;
while (n > 0) {
b += (n % 9) * factor;
n /= 9;
factor *= 10;
}
temp = a;
d = 0;
while (temp > 0) {
d = d * 10 + temp % 10;
temp /= 10;
}
if (d == b) {
printf("%d\n%d\n%d\n", i, a, b);
}
}
return 0;
}
菲波那契数列
描述
菲波那契数列是指这样的数列: 数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和。
给出一个正整数k,要求菲波那契数列中第k个数是多少。
输入
输入一行,包含一个正整数k。(1 <= k <= 46)
输出
输出一行,包含一个正整数,表示菲波那契数列中第k个数的大小
样例输入
19
样例输出
4181
#include <stdio.h>
int main() {
int k;
scanf("%d", &k);
if (k == 1 || k == 2) {
printf("1\n");
return 0;
}
int a = 1, b = 1, fib;
for (int i = 3; i <= k; i++) {
fib = a + b;
a = b;
b = fib;
}
printf("%d\n", fib);
return 0;
}
数字反转
描述
给定一个整数,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例2)。
输入
输入共 1 行,一个整数N。
-1,000,000,000 ≤ N≤ 1,000,000,000。
输出
输出共 1 行,一个整数,表示反转后的新数。
样例输入
样例 #1: 123 样例 #2: -380
样例输出
样例 #1: 321 样例 #2: -83
#include <stdio.h>
int main() {
int n, a;
scanf("%d", &n);
if (n == 0) {
printf("0");
return 0;
}
if (n < 0) {
printf("-");
n = -n; // 取绝对值,方便处理
}
int leading_zero = 1; // 标记前导零
while (n > 0) {
a = n % 10;
n /= 10;
if (a != 0) {
leading_zero = 0; // 遇到第一个非零数字
}
if (!leading_zero || a != 0) {
printf("%d", a);
}
}
return 0;
}
计算多项式的值
假定多式的形式为xn+xn-1+…+x2+x+1,请计算给定单精度浮点数x和正整数n值的情况下这个多项式的值。
输入
输入仅一行,包括x和n,用单个空格隔开。x在float范围内,n <= 1000000。
输出
输出一个实数,即多项式的值,精确到小数点后两位。保证最终结果在float范围内。
样例输入
2.0 4
样例输出
31.00
#include <stdio.h>
int main() {
int n;
float x, term = 1.0, sum = 1.0; // 初始化 sum 为 1,因为 x^0 = 1
scanf("%f %d", &x, &n);
for (int i = 1; i <= n; i++) {
term *= x; // 连续乘以 x 来计算下一个项
sum += term; // 将当前项加到总和中
}
printf("%.2f", sum); // 直接输出 sum,因为它已经包含了常数项 1
return 0;
}
开关灯
描述
假设有N盏灯(N为不大于5000的正整数),从1到N按顺序依次编号,初始时全部处于开启状态;有M个人(M为不大于N的正整数)也从1到M依次编号。
第一个人(1号)将灯全部关闭,第二个人(2号)将编号为2的倍数的灯打开,第三个人(3号)将编号为3的倍数的灯做相反处理(即,将打开的灯关闭,将关闭的灯打开)。依照编号递增顺序,以后的人都和3号一样,将凡是自己编号倍数的灯做相反处理。
请问:当第M个人操作之后,哪几盏灯是关闭的,按从小到大输出其编号,其间用逗号间隔。
输入
输入正整数N和M,以单个空格隔开。
输出
顺次输出关闭的灯的编号,其间用逗号间隔。
样例输入
10 10
样例输出
1,4,9
#include <stdio.h>
#include <stdbool.h>
int main() {
int N, M;
scanf("%d %d", &N, &M);
// 初始化灯的状态为开启
bool lights[N+1];
for (int i = 1; i <= N; i++) {
lights[i] = true;
}
// 模拟每个人的操作
for (int person = 1; person <= M; person++) {
for (int i = person; i <= N; i += person) {
lights[i] = !lights[i]; // 翻转灯的状态
}
}
// 输出结果
bool first = true;
for (int i = 1; i <= N; i++) {
if (!lights[i]) { // 如果灯是关闭状态
if (!first) {
printf(",");
}
printf("%d", i);
first = false;
}
}
printf("\n");
return 0;
}