刘汝佳第二章习题

2-1 水仙花数,输出100~999中所有水仙花数

#include <iostream>
using namespace std;

int main (void)
{
    for (int i= 100; i <= 999; i++)
    {
       int a = i / 100;
       int b = ( i % 100 ) / 10;
       int c = i % 10;
       if ( i == a * a * a + b * b * b + c * c *c ){
           cout << i << ' ';
       }
    }
}

2-3 倒三角形 (提示:把图在纸上画出来,数一数几个星号,几个空,找规律

发现对于n层的倒三角形,第i行,有i-1个空格,有2 * n -2 * i + 1个星号即2(n-i)+1

#include <iostream>
using namespace std;

int main(void)
{
    int n;
    cin >> n;
    for ( int i = 1; i <= n; i++) {
        for ( int o = 1 ; o < i; o++ ) {
            cout << ' ';
        }
        
        for (int x = 1; x <= 2 * ( n -i ) + 1; x++) {
            cout << '*';
        }
        cout << endl;
    }
}

2-4 子序列的和

#include 

int main (void)
{
    int a, b;
    float sum=0;
    while(1){
        printf("Please input two numbers\n");
        scanf("%d %d", &a, &b);
        if (a==0 && b==0){
            return 0;
        }
        if (a >= b || b >= 10e6){
            printf("error\n");
            continue;
        } else {
            for (int i=a; i <= b; i++){
                sum+= (1.0/i) * (1.0/i);      
            }
            printf("%.5f\n", sum);
        }
    }
}

2-5 分数化小数

#include <stdio.h>

int main (void)
{
    while(1){
        int a, b, c;
        scanf("%d %d %d", &a, &b, &c);
        if (a == b == c == 0) break;
        printf("%.*f", c, (float) a/b); 
    }
}

2-6排列 (提示,用枚举法。因为三个数字各位的和为定值,乘积也为定值,从123扫描到987 / 3,发现满足上述条件的数字即可)

#include <iostream>
using namespace std;

int calc (int num, int &result_add, int &result_mul)
{
    int i = num / 100;
    int j = (num % 100) / 10;
    int k = num % 10;

    result_add = result_add + i + j + k;
    result_mul = result_mul * i * j * k;
}


int main (void)
{
    int i, j, k;
    int result_add;
    int result_mul;
    
    int sum = 0, pro = 1;
    for (int a = 1; a <= 9; a++) sum += a, pro *= a;

    for ( i = 123; i <= 987 / 3; i++ ){
        j = i * 2;
        k = i * 3;
        
        result_add = 0;
        result_mul = 1;
        calc(i, result_add, result_mul);
        calc(j, result_add, result_mul);
        calc(k, result_add, result_mul);
        if ( result_add == sum && result_mul == pro ){
            cout << i << ' ' << j << ' ' << k << endl;
        }
    }
}

 

刘汝佳第一章习题

1-1 输入3个整数,输出他们的平均值,保留3位小数

#include <iostream>
#include <stdio.h>
using namespace std;

int main(void)
{
    float a, b,c;
    cin >> a >> b >> c;
    printf("%.3f", (a+b+c)/3);
    return 0;
}

1-2 输入华氏温度,输出对应的摄氏温度,保留3位小数

#include <iostream>
#include <stdio.h>
using namespace std;

int main(void)
{
    float f;
    cin >> f;
    printf("%.3f", 5 * ( f - 32 ) / 9 );
    return 0;
}

1-3 输入正整数,输出1+2+…+n的值

#include <iostream>
using namespace std;

int main(void)
{
    int n;
    cin >> n;
    int sum = 0;
    for (int i = 1; i <= n; i++){
        sum += i;
    }
    cout << sum << endl;
}

1-4 正弦和余弦,输入正整数n(n<360),输出n度的正弦、余弦值

#include <stdio.h>
#include <math.h>
int main( void )
{
     while(1){
         int n;
         printf("Please give an angle\n");
         scanf("%d", &n);
         if ( n < 0 || n >= 360 ) {
             printf("error\n");
             continue;
         } else {
             printf("cos(a)=%f, sin(a)=%f\n", cos(n), sin(n));
         }
     }
}

1-5 打折 一件衣服95元,若消费300元,可打85折。输入购买衣服件数,输出需要支付金额,保留两位小数。

#include <stdio.h>

int main( void ) 
{
    while(1){
        printf("Give a number\n");
        int n;
        scanf("%d", &n);
        if (n <=0) {
            printf("error\n");
        } else {
            if ( n * 95 >= 300) {
                printf("%.2f\n", n * 95 * 0.85);
            } else {
                printf("%d\n", n * 95);
            }
        }

    }

}

1-6三角形 输入三角形三边长度,判断是否能构成直角三角形的3个边长

#include <iostream>
using namespace std;

int main(void)
{
    int a, b, c;
    cin >> a >> b >> c;
    if ( ( a + b <= c) || ( a + c <= b )|| ( b + c <=a ) ){
         cout << "no" << endl;
    } else {
        cout << "yes" << endl;
    } 
}

1-7年份 输入年份,判断是否闰年

#include <iostream>
using namespace std;

int main(void)
{
    int year;
    cin >> year;
    if ((y % 4 == 0 && y % 100 != 0) ||y % 400 ==0)
        cout << "yes" << endl;
    else 
        cout << "no"  << endl;
}

 

分解素因数

#include <stdio.h>
#include <iostream>
#include <math.h>

using namespace std;

bool is_prime(int num)
{
    if (num < 2) return false;
    for (int i = 2; i < num; i++){
        if (num % i == 0)
            return false;
    }
    return true;
}

int main(void)
{
    int number;
    cin >> number;
    
    if (number < 2) {
        cout << "Please give a number bigger than 2" << endl;
        return 0;
    }

    if (is_prime(number)){
        cout << number << endl;
        return 0;
    }

    int prime_list[1000] = {0};
    int prime_count = 0;
    for (int i = 2; i <= number; i++){
        if (is_prime(i)){
            prime_list[++prime_count] = i;
        } 
    }

    int factor_list[1000] = {0};
    int factor_count = 0;

    int number_divided = number;

    int i = 1;
    while (number_divided != 1){
        int divider = prime_list[i];

        while(true){
            if (number_divided % divider == 0){
                factor_list[++factor_count] = divider;
                number_divided /= divider;
            } else {
               i++; 
               break;
            }
        }
    }

    for (int i = 1; i <= factor_count; i++){
        cout << factor_list[i] << ' '; 
    }
    cout << endl;
    return 0;
}