C语言基础题(二)

目录

1.统计进位

2.数组逆序

3.分解质因数(二)

4.孪生素数

5.连续1的个数

6.解不等式(二)

7.完美数(二)

8.循环字母字符串

9.公因数与公倍数

10.水仙花数

11.个人所得税


1.统计进位

描述:

很多小学生在学习加法时,发现“进位”特别容易出错。你的任务是计算两个3位数在相加时需要多少次进位。你编制的程序应当可以连续处理多组数据,直到读到两个整数0(这是输入结束标记)。

int main()
{
    int m = 0;
    int n = 0;
    int count = 0;
    int arr[100];
    // 直到输入两个0
    while(scanf("%d %d",&m,&n) == 2)
    {
        if(!m && !n)
        {
            break;
        }
        int sum = 0;
        int goBit = 0;
        while(n > 0 && m > 0)
        {
            if((n % 10 + m % 10 + goBit) >= 10)
            { 
                sum++;
                // 这里不能直接对n进行+1
                // 可能导致n直接进位
                // n /= 10;
                // m /= 10;
                // n++;
                goBit = 1;
            }
            else 
            {
                goBit = 0;
            }
            n /= 10;
            m /= 10;
        }
        arr[count] = sum;
        printf("%d\n",arr[count]);
        count++;
    }
    return 0;
}

2.数组逆序

描述:

编写C语言程序,从键盘输入m个整数,然后以相反的顺序输出。

输入格式:

第1行是整数m。
接下来一共m行数据,每行包含一个整数n。

void swap(long long arr[],int n)
{
    int i = 0;
    for(i = n - 1; i >= 0;i--)
    {
        printf("%lld\n",arr[i]);
    }
}

int main()
{
    int m;
    scanf("%d",&m);
    int i = 0;
    long long arr[1000] = {0};
    for(i = 0; i < m;++i)
    {
        scanf("%lld",&arr[i]);
    }
    swap(arr,m);
    return 0;
}

3.分解质因数(二)

问题描述:

分解质因数:任何一个合数都可以写成若干个质数(素数)相乘的形式。例如:
 2000 = 2×2×2×2×5×5×5
 2005 = 5×401
 2010 = 2×3×5×67

编写C语言程序,从键盘读入两个整数m和n(使用空格分隔),然后对m和n之间(包括m和n)的所有整数分解质因数,并输出到屏幕。每行显示1个整数分解。

输入格式:

一共1行数据,包含两个整数m和n(使用空格分隔)。

输出格式:

输出n – m + 1行信息,等号和星号的左右两边各有一个空格,行末没有空格。
如果n是素数,则输出n。
如果n是合数,则按升序输出n的所有质因数,之间使用星号(*)代替中文乘号(×)。

void printSu(int num)
{
        int flag = 0;
        printf("%d = ",num);
        int j = 0;
        for(j = 2;j <= num;++j)
        {
            while(num % j == 0)
            {
                if(flag)
                {
                    printf(" * ");
                }
                printf("%d",j);
                num /= j;
                flag = 1;
            }
        }
        printf("\n");
}


int main()
{
    int n,m;
    scanf("%d %d",&n,&m);
    if(n > m)
    {
        int tmp = n;
        n = m;
        m = tmp;
    }
    int i = 0;
    
    for(i = n; i <= m; ++i)
    {
        printSu(i);
    }
    return 0;
}

4.孪生素数

问题描述

编写C语言程序,从键盘读入两个整数m和n(使用空格分隔),统计在区间[m, n]孪生素数对(差为2的两个相邻素数)的数量。

例如,在区间[2, 100]的孪生素数为(3, 5)、(5, 7)、(11, 13)、(17, 19)、(29, 31)、(41, 43)、(59, 61)、(71, 73),一共8对。

输入格式

一共1行数据,包含整数m和n,之间使用空格分隔。

输出格式

输出孪生素数对的数量,行末没有换行符。

int main()
{
    int n,m;
    scanf("%d %d",&n,&m);
    if(n > m)
    {
        int tmp = n;
        n = m;
        m = tmp;
    }
    int i = 0;
    int arr[1000000] = {0};//存储素数
    int count = 0; // 记录数组大小
    int flag = 0;
    for(i = n; i <= m;++i)
    {
        flag = 0;
        int j = 0;
        //根号判断素数
        for(j = 2; j*j <= i;++j)
        {
            if(i % j == 0)
            {
                flag = 1;
                break;
            }
        }
        if(!flag)
        {
            arr[count] = i; 
            count++;
        }
    }
    int x = 0;
    int ret = 0;
    // arr的数组索引在 [0,count - 1]的区间 超过则数组越界
    for(x = 0; x < count - 1;x++)
    {
        if(arr[x+1] - arr[x] == 2)
        {
            ret++;
        }
    }
    printf("%d\n",ret);
    return 0;
}

5.连续1的个数

问题描述

编写C语言程序,从键盘读入一个个位数字不为5的奇数odd,然后计算至少多少个连续的1组成的整数能被该奇数整除。

例如:odd等于13,则至少6个连续的1组成的整数(111111)能被13整除(即111111 / 13 = 8547)。

输入格式

一共1行数据,包含一个奇数odd。

int main()
{
    int n;
    scanf("%d",&n);
    if(n == 1)
    {
        printf("1");
    }
    else 
    {
        long long sum = 1;
        int nub = 1;
        while(sum != 0)
        {
            sum = (sum*10 + 1) % n;
            nub++;
        }
        printf("%d",nub);
    }
    
    return 0;
}

6.解不等式(二)

问题描述

求解下面关于x的不等式:

n < 1 + 1/2 + 1/3 + ⋯⋯ + 1/x < n+1

编写C语言程序,从键盘读入一个整数n,然后求解上面关于x的不等式,并输出结果到屏幕。

输入格式

一共1行数据,包含整数n。

输出格式

输出满足不等式的x的最小整数和最大整数,之间使用一个空格分隔,行末没有换行符。

int main()
{
    int n;
    scanf("%d",&n);
    double sum = 0.0;
    int min_x = 1, max_x = 1;
    int x = 1;
    while(x)
    {
        sum+=1.0/x;
        // 判断是否大于n 并且是第一次赋值的最小值
        if(sum > n && min_x == 1)
        {
            min_x = x;
        }
        if(sum >= n+1 )
        {
            max_x = x - 1;
            break;
        }
        x++;
    }
    printf("%d %d",min_x,max_x);
    return 0;
}

7.完美数(二)

问题描述

正整数n的所有小于n的正因数之和如果等于n本身,则称n是完美数(Perfect Number)。例如,6和28都是完美数,因为:
 6 = 1 + 2 + 3
 28 = 1 + 2 + 4 + 7 + 14

编写C语言程序,从键盘读入两个整数m和n(使用空格分隔),然后输出m和n之间(包括m和n)的所有“完美数”到屏幕。每行显示1个完美数,并统计在区间[m, n]完美数的数量。

输入格式

一共1行数据,包含两个整数m和n(使用空格分隔)。

输出格式

每行输出1个完美数。最后一行输出完美数的个数。如果该区间没有完美数,则输出0。

“+”和“=”的两边各有一个空格。

每行的行末没有空格。

int main()
{
    int n, m;
    scanf("%d %d", &n, &m);
    int ret = 0;
    if (n > m) {
        int tmp = n; 
        n = m;
        m = tmp;
    }
    for (int i = n; i <= m; ++i) {
        int sum = 0;
        int j = 1;
        // 根号求素数
        for ( j = 1; j * j <= i; ++j) {
            if (i % j == 0) {
                sum += j;
                // 加上i / j 的另一个因子 
                if (j != 1 && j != i / j) { // 避免加上自己和重复加上平方根
                    sum += i / j;
                }
            }
        }

        // 检查是否为完美数
        if (sum == i) {
            if(i == 1)
            {
                continue;
            }
            printf("%d = 1", i);
            int j = 1;
            int flag = 0;
            for (j = 2; j < i; ++j) {
                if (i % j == 0) {
                    printf(" + ");
                    printf("%d", j);
                }
            }
            printf("\n");
            ret++;
        }
    }
    printf("%d",ret);
    return 0;
}

8.循环字母字符串

问题描述

编写程序,从键盘读入一个英文字母,如果是大写字母,则从该字母开始按升序输出大写形式的字母表,在输出最后一个字母Z后,继续从字母A输出,直到26个大写字母全部输出完毕;如果是小写字母,则从该字母开始按升序输出小写形式的字母表,在输出最后一个字母z后,继续从字母a输出,直到26个小写字母全部输出完毕。

输入样例

F

输出样例

FGHIJKLMNOPQRSTUVWXYZABCDE

int main()
{
    char n;
    scanf("%c",&n);
    if(n >= 'A' && n <= 'Z')
    {
        int i = 0;
        for(i = 0; i < 26; ++i )
        {
            printf("%c",n);
            n++;
            if(n > 'Z')
            {
                n = 'A';
            }
        }
    }
    else if(n >= 'a' && n <= 'z')
    {
        int i = 0;
        for(i = 0; i < 26; ++i )
        {
            printf("%c",n);
            n++;
            if(n > 'z')
            {
                n = 'a';
            }
        }
    }
    else 
    {
        printf("error");
    }
    return 0;
}

9.公因数与公倍数

最大公因数(Greatest Common Divisor,简称GCD),也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个。整数m和n的最大公约数记为GCD(m, n)。

最小公倍数(Least Common Multiple,简称LCM)是指两个或多个整数共有的倍数中除了0以外最小的一个。整数m和n的最小公倍数记为LCM(m, n)。

整数m、n、GCD(m, n)以及LCM(m, n)的关系是:

    m ×n=GCD(m,n)  ×LCM(m,n)

问题描述

编写程序,从键盘读入两个整数m和n(使用空格分隔),然后输出m和n的最大公约数和最小公倍数到屏幕。

int main()
{
    long long n,m;
    scanf("%lld %lld",&n,&m);
    if(n > m)
    {
        int t = n;
        n = m;
        m = t;
    }
    // 提前存取用于求最小公倍数
    long long i = n;
    long long j = m;
    long long tmp = 0;
    while(n != 0)
    {
        tmp = m % n;
        m = n;
        n = tmp;
    }
    printf("%lld\n",m);

    // 利用公式 n * m = 最大公约数 * 最小公约数
    long long small = (i*j) / m;
    printf("%lld",small);
    return 0;
}

10.水仙花数

问题描述

一个n位整数,如果等于它的n个数字的n次方之和,则该n位数称为n位水仙花数。

  • 一个三位数,如果等于它的三个数字的三次方之和,则该三位数称为三位水仙花数;
  • 一个四位数,如果等于它的四个数字的四次方之和,则该四位数称为四位水仙花数;

例如,153是其中一个三位水仙花数:

                        153= 1^3+ 5^3+ 3^3=1+125+27
                    

编写程序,输出所有三位水仙花数。每行输出一个水仙花数。

#include <math.h>
int main()
{
    int i = 0;
    for (i = 100; i < 1000; ++i)
    {
        int gewei = pow((i % 10),3);
        int shiwei = pow((i % 100 / 10),3);
        int baiwei = pow((i / 100),3);
        if(gewei + shiwei + baiwei == i)
        {
            printf("%d\n",i);
        }
    }
    return 0;
}

11.个人所得税

问题描述

假设某地区个人所得税的缴纳方式如下:
月总收入在1600元以下(含1600元)不需要缴纳个人所得税。月总收入在1600元以上,那么需要缴税的部分为:月总收入-1600,简称“应税收入”,且分级逐级计算:

  • 应税收入在500元内(含500元)的部分,税率为5%;
  • 应税收入在500元~2000元内(含2000元)的部分,税率为10%;
  • 应税收入2000元~5000元内(含5000元)的部分,税率为15%;
  • 应税收入5000元~10000元内(含10000元)的部分,税率为20%;
  • 应税收入在10000元以上的部分,税率为30%。

例如,某职工的当月的总收入为7000元,那么他应缴的个人所得税计算如下:

(1) 应税收入 = 月总收入 - 1600 = 7000 - 1600 = 5400 (元)

(2) 500元内的所得税 = 500 * 5% = 25 (元)

(3) 500元~2000元内的所得税 = (2000 - 500) * 10% = 150 (元)

(4) 2000元~5000元内的所得税 = (5000 - 2000) * 15% = 450 (元)

(5) 5000元~10000元内的所得税 = (5400 - 5000) * 20% = 80 (元)

(6) 应缴纳的个人所得税共计 = 25 + 150 + 450 + 80 = 705 (元)

编写程序,从键盘读入月总收入,然后计算应缴的个人所得税。

int main()
{
    double n;
    scanf("%lf",&n);
    double x = 0;
    if(n < 1600)
    {
        printf("0.00");
        return 0;
    }
    else 
    {
        int ret = n - 1600;
        if(ret <= 500)
        {
            x += ret * 0.05;
        }
        else 
        {
            x += 500 * 0.05;
            if(ret <= 2000)
            {
                x += (ret - 500) * 0.1;
            }
            else
            {
                x += (2000 - 500) * 0.1;
                if(ret <= 5000)
                {
                    x += (ret - 2000) * 0.15;
                }
                else 
                {
                    x += (5000 - 2000) * 0.15;
                    if(ret <= 10000)
                    {
                        x += (ret - 5000) * 0.2;
                    }
                    else
                    {
                        x += (10000 - 5000) * 0.2;
                        x += (ret - 10000) * 0.3;
                    }
                }
            }
        }
        printf("%.2lf",x);
    }
    
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值