c语言练习5.8

1.分析代码

VS开发环境调试下面的代码,画图解释下面代码的问题

#include <stdio.h>
int main()
{
    int i = 0;
    int arr[] = {1,2,3,4,5,6,7,8,9,10};
    for(i=0; i<=12; i++)
    {
        arr[i] = 0;
        printf("hello bit\n");
    }
    return 0;
}

分析:

2.喝汽水问题

喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以喝多少汽水(编程实现)。

/*
思路:
1. 20元首先可以喝20瓶,此时手中有20个空瓶子
2. 两个空瓶子可以喝一瓶,喝完之后,空瓶子剩余:empty/2(两个空瓶子换的喝完后产生的瓶子) + empty%2(不够换的瓶子)
3. 如果瓶子个数超过1个,可以继续换,即重复2
*/
int main()
{
    int money = 0;
    int total = 0;
    int empty = 0;
​
​
    scanf("%d", &money);
    
    //方法1
    total = money;
    empty = money;
    while(empty>1)
    {
        total += empty/2;
        empty = empty/2+empty%2;
    }
​
    printf("total = %d\n", total);
    return 0;
}
​
​
// 方法二:按照上述喝水和用瓶子换的规则的话,可以发现,其实就是个等差数列:money*2-1
int main()
{
    int money = 0;
    int total = 0;
    int empty = 0;
​
​
    scanf("%d", &money);
    
    //方法2
    if(money <= 0)
    {
        total = 0;
    }
    else
    {
        total = money*2-1;
    }
    printf("total = %d\n", total);
​
​
    return 0;
}

3.打印图型

/*
思路:
仔细观察图形,可以发现,此图形中是由空格和*按照不同个数的输出组成的。
上三角:先输出空格,后输出*,每行中
  空格:从上往下,一行减少一个
  *:2*i+1的方式递增
  
下三角:先输出空格,后输出*,每行中
  空格:从上往下,每行多一个空格
  *: 从上往下,按照2*(line-1-i)-1的方式减少,其中:line表示总共有多少行
按照上述方式,将上三角和下三角中的空格和*分别输出即可。 
*/
​
​
int main()
{
    int line = 0;
    int i = 0;
    scanf("%d", &line);//7
    //打印上半部分
    for(i=0; i<line; i++)
    {
        //打印一行
        //打印空格
        int j = 0;
        for(j=0; j<line-1-i; j++)
        {
            printf(" ");
        }
        //打印*
        for(j=0; j<2*i+1; j++)
        {
            printf("*");
        }
        printf("\n");
    }
​
​
    //打印下半部分
    for(i=0; i<line-1; i++)
    {
        //打印一行
        int j = 0;
        for(j=0; j<=i; j++)
        {
            printf(" ");
        }
        for(j=0; j<2*(line-1-i)-1; j++)
        {
            printf("*");
        }
        printf("\n");
    }
    return 0;
}

4.水仙花数

求出0~100000之间的所有“水仙花数”并输出。

“水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身,如:153=1^3+5^3+3^3,则153是一个“水仙花数”

/*
思路:
此题的关键在于只要知道判断一个数据是否为水仙花数的方式,问题就迎刃而解。假定给定一个数据data,具体检测方式如下:
1. 求取data是几位数
2. 获取data中每个位置上的数据,并对其进行立方求和
3. 对data中每个位上的数据立方求和完成后,在检测其结果是否与data相等即可,
相等:则为水仙花数
否则:不是
具体实现参考以下代码。
*/
#include <stdio.h>
#include <math.h>
​
int main()
{
    int i = 0;
    for(i=0; i<=99999; i++)
    {
        int count = 1;
        int tmp = i;
        int sum = 0;
        //判断i是否为水仙花数
        //1. 求判断数字的位数
        while(tmp/10)
        {
            count++;
            tmp = tmp/10;
        }
     
        //2. 计算每一位的次方和
        tmp = i;
        while(tmp)
        {
            sum += pow(tmp%10, count);
            tmp = tmp/10;
        }
     
        //3. 判断
        if(sum == i)
            printf("%d ", i);
    }
    return 0;
}

5.求和

求Sn=a+aa+aaa+aaaa+aaaaa的前5项之和,其中a是一个数字,

例如:2+22+222+2222+22222

/*
思路:
通过观察可以发现,该表达式的第i项中有i个a数字,因此:
假设第i项为temp,则第i+1项为temp*10+a
具体参考以下代码
*/
int main()
{
    int a = 0;
    int n = 0;
    int i = 0;
    int sum = 0;
    int tmp = 0;
​
​
    scanf("%d%d", &a, &n);
    for(i=0; i<n; i++)
    {
        tmp = tmp*10+a;
        sum += tmp;
    }
    printf("%d\n", sum);
​
    return 0;
}

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值