id:404 A.输出三角形字符阵列
题目要求
本题要求编写程序,输出n行由大写字母A开始构成的三角形字符阵列。
输入
输入在一行中给出一个正整数n(1≤n<7)。
输出
输出n行由大写字母A开始构成的三角形字符阵列。格式见输出样例,其中每个字母后面都有一个空格。
输入样例
4
输出样例
A B C D
E F G
H I
J
题解
- n表示输出n行,且第一行有n个字母,第二行有n-1个字母,第三行,,,以此类推,直到最后一行只剩一个字母;故,因有两重循环,第一重循环是从第一行到第n行,第二重循环从第一行有n个字母到第n行只有一个字母。而输出字母则需要用到字符输出的知识。
- 第一重循环的开始条件是n > 0,此后每循环一轮n–,直到n = 0
- 第一重循环嵌套的第二重循环中,用一个变量count来计数,当count > t 时结束循环,循环中每次都要让ch++;
代码
#include <stdio.h>
int main()
{
int n, count, t;
char ch;
scanf("%d", &n);
t = n;
ch = 'A';
while (t > 0)
{
for (count = 1; count <= t; count++)
{
printf("%c ", ch);
ch++;
}
printf("\n");
t--;
}
return 0;
}
id:478 B.求幂级数展开的部分和
题目描述
已知函数ex可以展开为幂级数1+x+x2/2!+x3/3!+⋯+xk/k!+⋯。现给定一个实数x,要求利用此幂级数部分和求e^x的近似值,求和一直继续到最后一项的绝对值小于0.00001。
输入
输入在一行中给出一个实数x∈[0,5]。
输出
在一行中输出满足条件的幂级数部分和,保留小数点后四位。题目保证计算结果不超过双精度范围。
输入样例
1.2
输出样例
3.3201
题解
- 此题仅需一重循环,则是实现阶乘
- 循环的条件是最后一项的绝对值小于0.00001,阶乘的实现需要其每次乘以循环的轮数即可,并不需要每次都从1开始乘
代码
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(int argc, char *argv[])
{
int i = 1;
double x, sum, j, k;
scanf("%lf", &x);
sum = 1.0;
j = 1.0;
k = 1.0;
while (fabs(j) > 0.00001)
{
k *= i;
j = pow(x, i) / k;
sum += j;
i++;
}
printf("%.4f", sum);
return 0;
}
id:403 C.输出整数的 各位数字
题目描述
本题要求编写程序,对输入的一个整数,从高位开始逐位分割并输出它的各位数字。
输入
输入在一行中给出一个整型范围内的非负整数。
输出
从高位开始逐位输出该整数的各位数字,每个数字后面有一个空格。
输入样例
123456
输出样例
1 2 3 4 5 6
题解
- 此题需要用到两个循环,第一个循环用来计算输入的数有多少位,第二个循环用来将输入的数从高位到低位依次输出
- 令输入的数为n,第一个循环进行的条件是n > 9,循环中,用一个变量j来记n的位数,每进行一轮,n /= 10, j *= 10,当n < 9时,结束第一个循环
- 在第二个循环中,令一个变量k记录n的最高位的那个数,每分解一次最高位,则输出一次k,并且 n %= j; j /= 10,直到j < 0时结束循环
- 另外,第一个循环用do while可以有效处理输入的数为0的情况,还需要注意输入的数时个位的情况
代码
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int n, t, j, k;
scanf("%d", &n);
t = n;
j = 1;
do
{
t /= 10;
j *= 10;
}
while (t > 9);
t = n;
while (j > 0)
{
k = t / j;
if ( n < 10)
{
printf("%d", n);
return 0;
}
else
{
printf("%d ", k);
}
t %= j;
j /= 10;
}
return 0;
}
id:34 D.判断回文数
题目描述
从键盘输入任意正整数,判断该数是否是回文数。所谓回文数就是从左到右读这个数与从右到左读这个数是一样的。例如12321、1221都是回文数。
输入
测试案例的个数n
第一个测试值
第二个测试值
…
第n个测试值
输出
各个测试值是否是回文数,是,就输出Yes,不是,就输出No
输入样例
3
4554
123
121
输出样例
Yes
No
Yes
题解
- 此题需要两重循环,第一重循环用来处理读进来的n个数,第二个循环用来将每一个测试值逆序,并用if语句判断逆序后是否和测试值相等
- 第一重循环进行的条件是循环次数小于等于n,并在循环中输入n个测试值
- 将测试值赋值给变量j,第二重循环的条件是j大于零,每次循环都将j的最低位取出并乘以10再加上下一次取出的最低位,并且j要除以10,将此次的最低位舍弃
- 第二重循环结束后用if语句进行比较逆序的数和测试值是否相等
代码
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int n, t, i, m, r, j;
scanf("%d", &n);
t = n;
for (i = 1; i <= n; i++)
{
r = 0;
scanf("%d", &t);
j = t;
while (j > 0)
{
m = j % 10;
r = r * 10 + m;
j /= 10;
}
if (r == t)
{
printf("Yes\n");
}
else
{
printf("No\n");
}
}
return 0;
}
id:400 E.验证“哥德巴赫猜想”
题目描述
数学领域著名的“哥德巴赫猜想”的大致意思是:任何一个大于2的偶数总能表示为两个素数之和。比如:24=5+19,其中5和19都是素数。本实验的任务是设计一个程序,验证20亿以内的偶数都可以分解成两个素数之和。
输入
输入在一行中给出一个(2, 2 000 000 000]范围内的偶数N。
输出
在一行中按照格式“N = p + q”输出N的素数分解,其中p≤q均为素数。又因为这样的分解不唯一(例如24还可以分解为7+17),要求必须输出所有解中p最小的解。
输入样例
24
输出样例
24 = 5 + 19
题解
- 此题需要两层循环,第一层循环从p = 2开始到 < N为止,并再用一个循环判断此时的p是否为素数,当找到p的第一个素数时,启用第二层循环,在p的第一个素数的情况下,判断q = N - p是否为素数,若为素数,则输出,若不为素数,则回到第一层循环,从上一次p的下一个数开始寻找下一个素数
代码
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int N, p, q, i, j;
scanf("%d", &N);
for (p = 2; p < N; p++)
{
for (i = 2; i * i <= p; i++)
{
if (p % i == 0)
{
break;
}
}
if (i * i > p)
{
q = N - p;
for (j = 2; j * j <= q; j++)
{
if (q % j == 0)
{
break;
}
}
if (j * j > q)
{
printf("%d = %d + %d\n", N, p, q);
break;
}
}
}
return 0;
}