6.1
题目描述:使用if和goto语句,求1+2+3+…+100的值。
输入:无
输出:输出题目描述中表达式的值。请注意行尾输出换行。
#include <stdio.h>
int main() {
int sum = 0;
int i = 1;
loop:
sum += i;
i++;
if (i <= 100) {
goto loop;
}
printf("%d\n", sum);
return 0;
}
注意goto语法的使用
6.3
题目描述:用do…wihle语句求1+2+3+…+100的值。
输入:无
输出:输出题目描述中表达式的值。请注意行尾输出换行。
#include <stdio.h>
int main() {
int sum = 0;
int i = 1;
do {
sum += i;
i++;
} while (i <= 100);
printf("%d\n", sum);
return 0;
}
注意while语句的语法
6.5
题目描述:使用这个公式求π的近似值,直到某一项的绝对值小于10-6为止。
输入:无
输出:输出π的近似值,保留6位小数。请注意行尾输出换行。
#include <stdio.h>
#include <math.h>
int main() {
double pi = 0;
int sign = 1;
int n = 0;
double term;
do {
term = sign * 1.0 / (2 * n + 1);
pi += term;
sign = -sign;
n++;
} while (fabs(term) >= 1e-6);
pi *= 4;
printf("%.6lf\n", pi);
return 0;
}
6.6
题目描述:求Fibonacci数列的前40个数。
输入:无
输出:输出Fibonacci数列的前40个数,并在每个数之后输出一个空格。请注意行尾输出换行。
#include <stdio.h>
int fib(int n) {
int first = 1, second = 1;
int result;
if (n == 0 || n == 1) {
return 1;
}
for (int i = 2; i <= n; i++) {
result = first + second;
first = second;
second = result;
}
return result;
}
int main() {
for (int i = 0; i < 40; i++) {
long long number = fib(i);
printf("%d ", number);
}
return 0;
}
6.9 电文加密
题目描述:给电文加密。加密规则是对于每一个字符,如果是字母,变换成其相应的其后(循环的字母序,即A紧跟在Z的后面)的第4个字母。例如A变成E,a变成e,W变成A,X变成B,Y变成C,Z变成D。如果不是字母,则不进行变换。
输入:输入一行字符。
输出:输出相应的密码。请注意行尾输出换行。
#include <stdio.h>
int main() {
char ch;
while ((ch = getchar()) != '\n') {
if (ch >= 'A' && ch <= 'V') {
ch += 4;
}
else if (ch >= 'W' && ch <= 'Z') {
ch -= 22;
}
else if (ch >= 'a' && ch <= 'v') {
ch += 4;
}
else if (ch >= 'w' && ch <= 'z') {
ch -= 22;
}
printf("%c", ch);
}
return 0;
}
getchar()
函数:getchar()
是 C 语言中的一个输入函数,它从标准输入(通常是键盘)读取一个字符,并返回该字符的 ASCII 码值。这个值被赋给变量ch
。
循环条件:(ch = getchar())!= '\n'
表示只要从输入读取到的字符不是换行符\n
,循环就会继续执行。这里要注意ch = getchar()
是一个赋值表达式,整个表达式的值就是ch
的值(即刚读取到的字符的 ASCII 码值),将其与\n
的 ASCII 码值进行比较,来决定是否继续循环。
6.10 辗转相除法求最大公约数
题目描述:输入两个正整数m和n,求其最大公约数和最小公倍数。
输入:输入两个正整数m和n,用空格隔开。
输出:分别输出m和n的最大公约数和最小公倍数,用空格隔开。请注意行尾输出换行。
#include <stdio.h>
int main() {
int m, n, a, b, temp;
scanf("%d %d", &m, &n);
a = m;
b = n;
// 使用辗转相除法求最大公约数
while (b!= 0) {
temp = b;
b = a % b;
a = temp;
}
// 输出最大公约数
printf("%d ", a);
// 计算并输出最小公倍数
printf("%d\n", m * n / a);
return 0;
}
6.11 getchar的再使用
题目描述:输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。
输入:一行字符。
输出:分别输出这行字符中的英文字母、空格、数字和其他字符的个数,用空格隔开。请注意行尾输出换行。
#include <stdio.h>
int main() {
int letterCount = 0;
int spaceCount = 0;
int digitCount = 0;
int otherCount = 0;
char ch;
while ((ch = getchar()) != '\n' && ch != EOF) {
if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) {
letterCount++;
}
else if (ch == 32) {
spaceCount++;
}
else if (ch >= '0' && ch <= '9') {
digitCount++;
}
else {
otherCount++;
}
}
printf("%d %d %d %d\n", letterCount, spaceCount, digitCount, otherCount);
return 0;
}
6.12 适时加入中间变量temp
题目描述:求 的值,其中a是一个数字,n表示a的位数,例如:2+22+222+2222+22222(此时n=5)
输入:两个整数a和n。
输出:计算出的Sn的值。请注意行尾输出换行。
#include<stdio.h>
int main(){
int a=0;
int n=0;
int Sn=0;
int temp=0;
scanf("%d%d",&a,&n);
for(int i=1;i<=n;i++){
temp=temp*10+a;
Sn+=temp;
}
printf("%d\n",Sn);
return 0;
}
6.13 迭代求和
题目描述
输入:无
输出:题目描述中算式的值。请注意行尾输出换行。
#include <stdio.h>
int f(int n) {
if (n == 0 || n == 1) {
return 1;
}
else {
return n * f(n - 1);
}
}
int main() {
int sum = 0;
for (int i = 1; i <= 10; i++) {
sum += f(i);
}
printf("%d\n", sum);
return 0;
}
6.15 水仙花数
题目描述:输出所有“水仙花数”。所谓“水仙花数”是指一个3位数,其各位数字立方和等于该数本身。例如,153是一个“水仙花数”,因为153=13+53+33。
输入:无
输出:所有“水仙花数”,在每一个数之后输出一个空格。请注意行尾输出换行。
#include <stdio.h>
int main() {
int num;
for (num = 100; num < 1000; num++) {
int bai = num / 100;
int shi = (num / 10) % 10;
int ge = num % 10;
int sum = bai * bai * bai + shi * shi * shi + ge *
ge * ge;
if (sum == num) {
printf("%d\n", num);
}
}
return 0;
}
6.16 完数和因子
题目描述:一个数如果恰好等于它的因子之和,这个数就被称为“完数”。例如,6的因子为1、2、3,而6=1+2+3,因此6是“完数”。找出1000之内的所有完数,并输出。
输入:无
输出:每一个完数一行。在每一行中,首先输出这个完数的值,再输出一个冒号,之后从小到大输出这个完数的所有因子,在每个因子前输出一个空格。请注意行尾输出换行。
#include <stdio.h>
int main() {
int i, j, sum;
for (i = 2; i <= 1000; i++) { // 从2开始,因为1不是完数的讨论范围
sum = 0;
for (j = 1; j < i; j++) {
if (i % j == 0) {
sum += j;
}
}
if (sum == i) {
printf("%d:", i);
for (j = 1; j < i; j++) {
if (i % j == 0) {
printf(" %d", j);
}
}
printf("\n");
}
}
return 0;
}
6.17 迭代斐波那契求和
题目描述:有一个分数序列:2/1, 3/2, 5/3, 8/5, 13/8, 21/13,…求出这个序列的前20项之和。
输入:无
输出:题目描述中的前20项之和,保留4位小数。请注意行尾输出换行。
#include <stdio.h>
double fib(int n) {
if (n == 1 || n == 2) {
return 1;
}
double a = 1, b = 1, temp;
for (int i = 3; i <= n; i++) {
temp = a + b;
a = b;
b = temp;
}
return b;
}
int main() {
double sum = 0;
double zi = 2, mu = 1;
for (int i = 0; i < 20; i++) {
sum += zi / mu;
double temp = zi;
zi = zi + mu;
mu = temp;
}
printf("%.4f\n", sum);
return 0;
}
6.21 牛顿迭代法
题目描述:用牛顿迭代法求以下方程在1.5附近的根
输入:无
输出: 输出牛顿迭代法求出的根,保留4位小数。 请注意行尾输出换行。
#include <stdio.h>
// 定义方程 f(x)
double f(double x) {
return 2 * x * x * x - 4 * x * x + 3 * x - 6;
}
// 手动计算导数 f'(x)
double df(double x) {
return 6 * x * x - 8 * x + 3;
}
int main() {
double x = 1.5; // 初始值
double x_next;
do {
x_next = x - f(x) / df(x);
if ((x_next - x) > 0) {
if (x_next - x < 1e-6) break;
}
else {
if (x - x_next < 1e-6) break;
}
x = x_next;
} while (1);
printf("%.4lf\n", x);
return 0;
}
6.22 二分法
题目描述:用二分法求以下方程在(-10, 10)之间的根:
保证此函数在以上区间中是单调递增的。
输入:无
输出:输出二分法求出的根,保留4位小数。请注意行尾输出换行。
#include <stdio.h>
// 定义要求解的方程
double equation(double x) {
return 2 * x * x * x - 4 * x * x + 3 * x - 6;
}
int main() {
double left = -10;
double right = 10;
double mid;
double precision = 1e-4;
while ((right - left) > precision) {
mid = (left + right) / 2;
double value = equation(mid);
if (value == 0) {
break;
}
else if (value > 0) {
right = mid;
}
else {
left = mid;
}
}
printf("%.4lf\n", (left + right) / 2);
return 0;
}