最近要复习一下C和C++的基础知识,于是计划把之前学过的谭浩强的《C程序设计》和《C++程序设计》习题重新做一遍。
编译环境为:操作系统32位Win7,编译工具VC++6.0
第六章:循环控制
6.1)输入两个正整数m和n,求其最大公约数和最小公倍数
本段代码用循环来计算最大公约数,在最后给出了辗转相除法计算最大公约数的函数
#include<stdio.h>
int _gcd(int x,int y);
void main()
{
int m, n, gcd, lcm;
scanf("%d%d", &m, &n);
//迭代计算最大公约数
int i, j;
j = (m < n ? m : n) / 2 + 1;
for(i = 1; i < j; i++)
{
if(m % i == 0 && n % i == 0)
{
gcd = i;
}
}
//计算最小公倍数
lcm = m * n / gcd;
printf("Greatest Common Divisor: %d\n", gcd);
printf("Least Common Multiple: %d\n", lcm);
//更简单高效的方法:辗转相除法求最大公约数
printf("%d\n", _gcd(35, 28));
}
//辗转相除法求两数的最大的公约数
int _gcd(int x,int y)
{
if(x < y)
{
int temp = x;
x = y;
y = temp;
}
if(x % y != 0)
{
return _gcd(y, x % y);
}
else
{
return y;
}
}
6.2)输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数
#include<stdio.h>
void main()
{
int count1 = 0; //英文字母数
int count2 = 0; //空格数
int count3 = 0; //数字数
int count4 = 0; //其他字符数
char c;
while((c = getchar()) != '\n')
{
if((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))
{
count1++;
}
else if(c == ' ')
{
count2++;
}
else if(c >= '0' && c <= '9')
{
count3++;
}
else
{
count4++;
}
}
printf("英文字母数:%d\n", count1);
printf("空格数:%d\n", count2);
printf("数字数:%d\n", count3);
printf("其他字符数:%d\n", count4);
}
6.3)求S[n]=a+aa+aaa+...+aaaaa...(n个a),其中a是一个数字,n表示a的位数
#include<stdio.h>
#define a 2
void main()
{
int n, temp, sum = 0;
scanf("%d", &n);
temp = a;
while(n--)
{
sum += temp;
temp = temp * 10 + a;
}
printf("sum: %d\n", sum);
}
6.4)求1!+2!+3!+...+20!
#include<stdio.h>
#define n 20
void main()
{
int counter, temp = 1;
double sum = 0;
for(counter = 1; counter <= n; counter++)
{
temp *= counter;
sum += temp;
}
printf("sum: %.0lf\n", sum);
}
6.5)求Σ(k=1→100,k)+Σ(k=1→50,k^2)+Σ(k=1→10,1/k)
#include<stdio.h>
void main()
{
int k;
double sum1 = 0, sum2 = 0, sum3 = 0;
for(k = 1; k <= 100; k++)
{
sum1 += k;
}
for(k = 1; k <= 50; k++)
{
sum2 += k * k;
}
for(k = 1; k <= 10;k++)
{
sum3 += 1.0 / k;
}
printf("sum: %lf\n", sum1 + sum2 + sum3);
}
6.6)输出所有水仙花数,水仙花数指一个3位数,其各位数字立方和等于该数本身
#include<stdio.h>
void main()
{
int counter, a, b, c;
for(counter = 100; counter < 1000; counter++)
{
a = counter / 100;
b = counter / 10 % 10;
c = counter % 10;
if(a * a * a + b * b * b + c * c * c == counter)
{
printf("Find Narcissistic Number: %d\n", counter);
}
}
}
6.7)一个数恰好等于它的因子之和,这个数就称为完全数,求出1000以内的所有完全数
#include<stdio.h>
void main()
{
int i, j, sum;
for(i = 3; i <= 1000; i++)
{
sum = 0;
for(j = 1; j < i / 2 + 1; j++)
{
if(i % j == 0)
{
sum += j;
}
}
if(sum == i)
{
printf("%d its factors are ", sum);
for(j = 1; j < i / 2 + 1; j++)
{
if(i % j == 0)
{
printf("%d,", j);
}
}
//覆盖掉多打出的逗号
printf("\b \n");
}
}
}
6.8)有一个分数序列:
2/1,3/2,5/3,8/5,13/8...
第一个数的分子+分母是下一个数的分子,第一个数的分子是下一个数的分母
#include<stdio.h>
void main()
{
int a = 2, b = 1, temp, counter;
double sum = 0;
for(counter = 0; counter < 20; counter++)
{
sum += 1.0 * a / b;
temp = b;
b = a;
a = a + temp;
}
printf("sum: %lf\n", sum);
}
6.9)一个球从100米高度自由落下,每次落地后反跳回原高度的一半,再落下,再反弹。求它第十次落地时,共经过多少米?第十次反弹多高?
#include<stdio.h>
#define times 10
void main()
{
double height = 100.0;
double distance = 0;
int counter;
for(counter = 0; counter < times; counter++)
{
distance += height; //落下一个高度
height /= 2.0;
distance += height; //弹回半个高度
}
printf("distance: %lf\n", distance);
printf("height: %lf\n", height);
}
6.10)猴子吃桃,每次吃掉一半又多一个桃子,第十天再想吃时只剩下1个桃子了,问第一天共摘多少个桃子
#include<stdio.h>
void main()
{
int result = 1;
int counter;
for(counter = 10; counter > 1; counter--)
{
result = (result + 1) * 2;
}
printf("Total peaches: %d\n", result);
printf("First day eat peaches: %d\n", result / 2 + 1);
}
6.11)用迭代法求x=sqrt(a),求平方根公式为:x[n+1]=(x[n]+a/x[n])/2
#include<stdio.h>
#define a 121
#define times 10
void main()
{
double x = a;
int counter;
for(counter = 0; counter < times; counter++)
{
x = 0.5 * (x + a / x);
}
printf("Root(a) = %f\n", x);
}
6.12)用牛顿迭代法求方程2x^3-4x^2+3x-6=0在1.5附近的根
牛顿迭代法:x[n+1]=x[n]-f(x[n])/f'(x[n])
#include<stdio.h>
#define a 1.5
#define times 10
void main()
{
double x = a;
//牛顿迭代法:x[n+1]=x[n]-f(x[n])/f'(x[n])
int counter;
for(counter = 0; counter < times; counter++)
{
x = x - (2 * x * x * x - 4 * x * x + 3 * x - 6) / (6 * x * x - 8 * x + 3);
}
printf("x = %lf\n", x);
}
6.13)用二分法求方程2x^3-4x^2+3x-6=0在(-10,10)之间的根
#include<stdio.h>
#define times 30
void main()
{
double left = -10.0, right = 10.0, x;
int counter;
for(counter = 0; counter < times; counter++)
{
x = (left + right) / 2.0;
if(2 * x * x * x - 4 * x * x + 3 * x - 6 < 0)
{
left = x;
}
else
{
right = x;
}
}
printf("x = %lf\n", (left + right) / 2.0);
}
6.14)用星号输出一个菱形图案
#include<stdio.h>
#define x 7
void main()
{
int i, j;
for(i = 0; i < x; i++)
{
for(j = 0; j < x; j++)
{
//左上角 和 右下角
if(i + j < x / 2 || i + j > x / 2 + x - 1)
{
printf(" ");
continue;
}
//左下角
if(x - i + j - 1 < x / 2)
{
printf(" ");
continue;
}
//右上角
if(x - j + i - 1 < x / 2)
{
printf(" ");
continue;
}
printf("* ");
}
printf("\n");
}
}
6.15)本题个人认为并没有专门编程解题的必要(本章还没有接触数组)
答案为:A和Z比赛,B和X比赛,C和Y比赛
END