HZNU C++程序设计——实验3:循环

一、课内实验题(共10小题,100分)

题型得分100
  1. 【描述】
    计算数列1+1/3+1/5+…的前n项之和。
    【输入】
    输入一个正整数n。
    【输出】
    输出数列前n项的和。
    【输入示例】

    10
    【输出示例】
    2.13326
    【来源】
    《程序设计基础——以C++为例》第2章实验10。

    (10分)

    我的答案:

    #include<iostream>
    using namespace std;
    int main(){
    	int t;
    	double sum = 0;
    	cin >> t;
    	int count = 0;
    	for (int i = 1;count<t;i+=2) {
    		sum = sum + 1.0 / i;
    		count++;
    	}
    	cout << sum;
    }
    题目得分10

    参考答案:

    #include <iostream>
    using namespace std;
    int main() {
        int n;
        cin >> n;
        double sum = 0.0;
        for(int i = 1; i <= n; ++i)
            sum += 1.0 / (2 * i - 1);
        cout << sum << endl;
        return 0;
    }
    
  2. 【描述】
    计算如下式子:

    的值,计算到最后一项的值小于给定的阈值时为止。
    【输入】
    输入在一行中给出小于1的阈值。
    【输出】
    在一行中输出满足阈值条件的式子值,结果保留6位小数。
    【输入示例】

    0.000001
    【输出示例】
    2.718282
    【来源】
    《程序设计基础——以C++为例》第2章实验11强化练习。

    (10分)

    我的答案:

    #include<iostream>
    #include<iomanip>
    #include<cmath>
    
    using namespace std;
    int main()
    {
    	long double a;
    	cin >> a;
    	long double d, e = 0;
    	d = 1;
    	int count = 1;
    	long long int c;
    	while (d > a) {
    		c = 1;
    		e = e + d;
    		for (int i = 1;i <= count;i++) {
    			c = c * i;
    		}
    		d = 1.0 / c;
    		count++;
    	}
    	cout << fixed << setprecision(6) << e << endl;
    	return 0;
    }
    题目得分10

    参考答案:

    #include <iostream>
    #include <iomanip>
    using namespace std;
    int main() {
        double epsilon;
        cin >> epsilon;
        int i = 1;
        double fact = 1, item = 1, e = 0;
        while(item >= epsilon) {
            e += item;
            fact *= i;
            item = 1 / fact;
            ++i;
        }
        cout << fixed << setprecision(6) << e << endl;
        return 0;
    }
  3. 【描述】
    输入若干个整数,如果输入0,输入即终止。判定读入的整数中有多少个正整数、多少个负整数,并计算这些整数的总和和平均值(0不计算在内)。平均值结果保留2位小数。
    【输入】
    输入若干个整数,如果输入0,输入即终止。
    【输出】
    分行输出这些整数中的正整数个数、负整数个数、总和、平均值(0不计算在内)。
    若只输入0,则输出:No input。
    【输入示例】

    -1 -2 -3 -4 -5 6 7 8 9 0
    【输出示例】
    4
    5
    15
    1.67
    【来源】
    《程序设计基础——以C++为例》第2章实验12。

    (10分)

    我的答案:

    #include<iostream>
    #include<iomanip>
    #define f 0.000001
    using namespace std;
    int main()
    {
    	int a, sum = 0, pos = 0, neg = 0, i = 0;
    	double average = 0;
    	while (cin >> a, a != 0) {
    		if (a < 0) {
    			neg++;
    		}
    		else if (a > 0) {
    			pos++;
    		}
    		i++;
    		sum += a;
    	}
    	if (i == 0) {
    		cout << "No input";
    	}
    	else {
    		average = (double)sum / (double)i;
    		cout << pos << endl;
    		cout << neg << endl;
    		cout << sum << endl;
    		cout << fixed << setprecision(2) << average << endl;
    	}
    }
    题目得分10

    参考答案:

    #include <iostream>
    #include <iomanip>
    using namespace std;
    int main() {
        int countPositive = 0;// 正整数个数
        int countNegative = 0;// 负整数个数
        int count = 0;// 总的个数
        int sum = 0;// 累加变量
        int number;
        do {
            cin >> number;
            if (number > 0)
                ++countPositive;
            else if (number < 0)
                ++countNegative;
            sum += number;
            ++count;
        } while (number != 0);
        --count;
        if (count == 0)
            cout << "No input\n";
        else {
            cout << countPositive << endl;
            cout << countNegative << endl;
            cout << sum << endl;
            cout << fixed << setprecision(2) << (sum * 1.0 / count) << endl;
        }
        return 0;
    }
  4. 【描述】
    计算数列1+(1+2)+(1+2+3)+(1+2+3+4)+…的前n项之和。
    【输入】
    输入一个正整数n。
    【输出】
    输出数列前n项的和。
    【输入示例】

    3
    【输出示例】
    10
    【C++代码】
    《程序设计基础——以C++》第2章实验13。

    (10分)

    我的答案:

    #include<iostream>
    #include<iomanip>
    #define ll long long int
    using namespace std;
    int main()
    {
    	int t;
    	ll sum=0;
    	cin >> t;
    	for (int i = 0;i <= t;i++) {
    		sum +=(1+i)*i/2;
    	}
    	cout << sum;
    }
    题目得分10

    参考答案:

    #include <iostream>
    using namespace std;
    int main() {
        int n;
        cin >> n;
        int sum = 0;
        int subItem;
        for(int i = 1; i <= n; ++i) {
            subItem = 0;
            for(int j = 1; j <= i; ++j)
                subItem += j;
            sum += subItem;
        }
        cout << sum << endl;
        return 0;
    }
    
  5. 【描述】
    某工地需要搬运砖块,已知男人一人搬3块,女人一人搬2块,小孩两人搬1块。用45人正好搬45块砖,问有多少种搬法?
    【输入】
    没有输入。
    【输出】
    输出搬砖的男人、女人和小孩数。
    【输出示例】

    A,B,C
    A、B、C分别表示男人、女人、小孩数。
    【来源】
    《程序设计基础——以C++为例》第2章实验14。

    (10分)

    我的答案:

    #include<iostream>
    #include<iomanip>
    #define ll long long int
    using namespace std;
    int main()
    {
    	for (int i = 0;i <= 45 / 3;i++) {
    		for (int j = 0;j <= 45 / 2;j++) {
    			for (int z = 0;z <= 45;z+=2) {
    				if ((i * 3 + j * 2 + z / 2  == 45)&&(i+j+z==45)) {
    					cout << i << "," << j << "," << z << endl;;
    				}
    			}
    		}
    	}
    }
    题目得分10

    参考答案:

    #include <iostream>
    using namespace std;
    int main() {
        int men, women, child;
        for(men = 0; men <= 15; ++men) {
        	for(women = 0; women <= 22; ++women) {
                child = 45 - men - women;
                if(men * 3 + women * 2 + child * 0.5 == 45)
           		cout << men << "," << women << "," << child << endl;
        	}
        }
        return 0;
    }
  6. 【描述】
    给定一个十进制正整数,求其对应的二进制数中1的个数。
    【输入】
    第一个正整数表示有n(n > 0)个测试数据,其后n行是对应的测试数据,每行为一个正整数。
    【输出】
    分行输出n个正整数对应的二进制数中1的个数。
    【输入示例】

    4
    2
    100
    1000
    66
    【输出示例】
    1
    3
    6
    2

    (10分)

    我的答案:

    #include<iostream>
    #include<iomanip>
    #define ll long long int
    using namespace std;
    void solve() {
    	int n,ans_1=0;
    	cin >> n;
    	while (n > 0) {
    		int d;
    		d = n % 2;
    		if (d == 1)ans_1++;
    		n /= 2;
    	}
    	cout << ans_1 << endl;;
    	return;
    }
    int main()
    {
    	int t;
    	cin >> t;
    	while (t--) {
    		solve();
    	}
    	return 0;
    }
    题目得分10

    参考答案:

    #include <iostream>
    using namespace std;
    int main() {
        int n;
        cin >> n;
        for(int i = 0; i < n; ++i) {
            int value;
            cin >> value;
            int count_1 = 0;
            int remainder;
            while(value) {
                remainder = value % 2;		// 余数
                if(remainder == 1)
                    ++count_1;
                value = value / 2;			// 商
            }
            cout << count_1 << endl;
        }
        return 0;
    }
    
  7. 【描述】
    在杭师大校园里,没有自行车,上课办事会很不方便。但实际上,并非去办任何事情都是骑车快,因为骑车总要找车、开锁、停车、锁车等,这要耽误一些时间。假设找到自行车,开锁并骑上自行车的时间为27秒;停车锁车的时间为23秒;步行每秒行走1.2米,骑车每秒行走3.0米。请判断走不同的距离去办事,骑车快还是走路快。
    【输入】
    第一个正整数表示有n(n > 0)个测试数据,其后n行是对应的测试数据,每行为一次办事要行走的距离,单位为米。
    【输出】
    对应每个办事要行走的距离,如果骑车快,输出一行“Bike”;如果走路快,输出一行“Walk”;如果一样快,输出一行“All”。
    【输入示例】

    4
    50
    90
    120
    180
    【输出示例】
    Walk
    Walk
    Bike
    Bike

    (10分)

    我的答案:

    #include<iostream>
    #include<iomanip>
    #define ll long long int
    using namespace std;
    void solve() {
    	double walk_time,bike_time;
    	int rowl;
    	cin >> rowl;
    	walk_time = rowl / 1.2;
    	bike_time = rowl / 3.0 + 27 + 23;
    	if (walk_time<bike_time) {
    		cout << "Walk" << endl;
    	}
    	else if (walk_time>bike_time) {
    		cout << "Bike" << endl;
    	}else{
            cout<<"All"<<endl;
        }
    	return;
    }
    int main()
    {
    	int t;
    	cin >> t;
    	while (t--) {
    		solve();
    	}
    	return 0;
    }
    题目得分10

    参考答案:

    #include <iostream>
    #include <cmath>
    using namespace std;
    const double EPSILON = 1e-6;
    int main() {
        int n;
        cin >> n;
        for(int i = 0; i < n; ++i) {
            double distance;
            cin >> distance;
            double walk = distance / 1.2;
            double bike = 27 + distance / 3 + 23;
            if(fabs(walk - bike) < EPSILON)
                cout << "All" << endl;
            else if(walk < bike)
                cout << "Walk" << endl;
            else
                cout << "Bike" << endl;
        }
        return 0;
    }
    
  8. 【描述】
    输入一个正整数,从小到大输出该数所有的质因子。
    质因数(质因数)是指能整除给定正整数的质数(素数)。
    【输入】
    输入一个正整数。
    【输出】
    分行从小到大输出该数所有的质因子。
    【输入示例】

    120
    【输出示例】
    2
    2
    2
    3
    5
    【来源】
    《程序设计基础——以C++为例》第2章实验17。

    (10分)

    我的答案:

    #include<iostream>
    #include<string>
    using namespace std;
    string f(int x) {
        int i = 2;
        string ans = "";
        for (; x >= 2;) {
            if (x % i == 0) {
                ans += to_string(i) + "\n";
                x /= i;
            }
            else {
                i++;
            }
        }
        return ans;
    }
    int main() {
        int x;
        cin >> x;
        cout << f(x);
        return 0;
    }
    题目得分10

    参考答案:

    #include <iostream>
    using namespace std;
    int main() {
        int number, factor = 2;
        cin >> number;
        while(factor <= number) {
            if (number % factor == 0) {
                cout << factor << endl;
                number = number / factor;
            }
            else
                ++factor;
        }
        return 0;
    }
    
  9. 【描述】
    编写程序,用迭代法求立方根

    求立方根的迭代公式为:

    当满足如下条件时:

    迭代停止。
    【输入】
    输入一个数。
    【输出】
    输出该数的立方根。
    【输入示例】

    27
    【输出示例】
    3
    【来源】
    《程序设计基础——以C++为例》第2章实验18。

    (10分)

    我的答案:

    #include<iostream>
    #include<iomanip>
    #include<cmath>
    #define f 0.000001
    using namespace std;
    int main()
    {
    	double a;
    	cin >> a;
    	double x = 1.0;
    	if (a == 0) {
    		cout << 0 << endl;
    	}
    	else {
    		for (x;fabs(x * x * x - a) > f;x = (2 * x + a / x / x) / 3) {
    			continue;
    		}
    		cout << x;
    	}
    }
    题目得分10

    参考答案:

    #include <iostream>
    #include <cmath>
    using namespace std;
    const double EPSILON = 1e-6;
    int main() {
        double a, x, g;
        cin >> a;
        if(a == 0)
            cout << a << endl;
        else {
            x = a;
            g = (2.0 * x + a / (x * x)) / 3.0;
            while(fabs(x - g) >= EPSILON) {
                x = g;
                g = (2.0 * x + a / (x * x)) / 3.0;
            }
            cout << g << endl;
        }
        return 0;
    }
  10. 【描述】
    编写程序,根据输入的字符以及棱形的边长,输出以该字符为填充字符的棱形。
    【输入】
    输入在一行中给出字符和边长。
    【输出】
    输出以该字符为填充字符,相应边长的棱形。
    【输入示例】
    A 5
    【输出示例】
        A
       AAA
      AAAAA
     AAAAAAA
    AAAAAAAAA
     AAAAAAA
      AAAAA
       AAA
        A
    

    【来源】
    《程序设计基础——以C++为例》第2章实验19。(10分)

    我的答案:

    #include<iostream>
    #include<iomanip>
    #include<cmath>
    using namespace std;
    void f(char ch, int n) {
    	for (int i = 1;i < n;i++) {
    		for (int j = 1;j <= n - i;j++) {
    			cout << " ";
    		}
    		for (int k = 1;k <= 2 * i - 1;k++) {
    			cout << ch;
    		}
    		cout << endl;
    	}
    	for (int i = n;i >= 1;i--) {
    		for (int j = 1;j <= n - i;j++) {
    			cout << " ";
    		}
    		for (int k = 1;k <= 2 * i - 1;k++) {
    			cout << ch;
    		}
    		cout << endl;
    	}
    }
    int main()
    {
    	char ch;
    	int n;
    	cin >> ch;
    	cin >> n;
    	f(ch, n);
    }
    题目得分10

    参考答案:

    #include <iostream>
    using namespace std;
    int main() {
        char ch;
        int n;
        cin >> ch >> n;
        for(int i = 1; i <= n; ++i) {         /* 上半三角形 */
            for(int j = 1; j <= n - i; ++j)
                cout << " ";
            for(int j = 1; j <= 2 * i - 1; ++j)
                cout << ch;
            cout << endl;
        }
        for(int i = 1; i <= n - 1; ++i) {     /* 下半三角形 */
            for(int j = 1; j <= i; ++j)
                cout << " ";
            for(int j = 1; j <= 2 * n - 1 - 2 * i; ++j)
                cout << ch;
            cout << endl;
        }
        return 0;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值