C语言入门--奇偶个数及数字特征值

浙江大学慕课第三周编程练习题

1

奇偶个数(5分)

题目内容:

你的程序要读入一系列正整数数据,输入-1表示输入结束,-1本身不是输入的数据。程序输出读到的数据中的奇数和偶数的个数。

输入格式:

一系列正整数,整数的范围是(0,100000)。如果输入-1则表示输入结束。

输出格式:

两个整数,第一个整数表示读入数据中的奇数的个数,第二个整数表示读入数据中的偶数的个数。两个整数之间以空格分隔。

输入样例:

9 3 4 2 5 7 -1

输出样例:

4 2

时间限制:500ms内存限制:32000kb

对于这道题较为简单,相信各位同学应该都会写,但我还是想把我的代码分享一下,不为别的,就当是纪念一下自己的劳动成果吧

我的代码

#include <stdio.h>
int main()
{
    int a;
    int even=0;//偶数
    int odd=0;//奇数 
    do
    {
        scanf("%d",&a);
        if(a%2==0)
        {
            even++;
        }
        else
        {
            odd++;
        }
    }while(a!=-1);
    printf("偶数个数为%d 奇数个数为%d",even,odd-1);
    return 0;
}

然后,我看到一位大佬是这样写的代码如下

#include <stdio.h>

int main()
{
    int a,number1,number2;
    number1 = 0;
    number2 = 0;
    scanf("%d", &a);
    while(a!=-1){
        if(a%2==0){
            number2++;
        }
        else{
            number1++;
        }
    scanf("%d", &a);
    }
    printf("%d %d",number1,number2);
    return 0;
}

挺好的,我一开始的思路也是这样,但是这样需要再进入循环之前就要输入a的值,想来想去没有想到办法 。。。。太尴尬了,

2

数字特征值(5分)

题目内容:

对数字求特征值是常用的编码算法,奇偶特征是一种简单的特征值。对于一个整数,从个位开始对每一位数字编号,个位是1号,十位是2号,以此类推。这个整数在第n位上的数字记作x,如果x和n的奇偶性相同,则记下一个1,否则记下一个0。按照整数的顺序把对应位的表示奇偶性的0和1都记录下来,就形成了一个二进制数字。比如,对于342315,这个二进制数字就是001101。

这里的计算可以用下面的表格来表示:

数字

3

4

2

3

1

5

数位

6

5

4

3

2

1

数字奇偶

数位奇偶

奇偶一致

0

0

1

1

0

1

二进制位值

32

16

8

4

2

1

你的程序要读入一个非负整数,整数的范围是[0,1000000],然后按照上述算法计算出表示奇偶性的那个二进制数字,输出它对应的十进制值。

提示:将整数从右向左分解,数位每次加1,而二进制值每次乘2。

输入格式:

一个非负整数,整数的范围是[0,1000000]。

输出格式:

一个整数,表示计算结果。

输入样例:

342315

输出样例:

13

时间限制:500ms内存限制:32000kb

#include <stdio.h>
int main()
{
    int x;
    int count=0;
    int digit;
    int two=1;
    int sum=0;
    scanf("%d",&x);
    while(x!=0)
    {
        digit=x%10;
        count++;
        if(((digit%2==0)&&(count%2==0))||((digit%2!=0)&&(count%2!=0)))
        {
        
            sum=sum+two;
        }
        two*=2;
        x/=10;
    }
    printf("%d",sum);
    return 0;
 } 

这个是我写的代码,em......严格来说并不能说是独立完成的,第17行代码,是我参考了别人的思路,我真滴太菜了,唉,下面这个是我参考的代码,很棒的一个代码

#include <stdio.h>
int main()
{
    int num,a=1,digit=0,count=1;
    scanf("%d", &num);
    do{
        if((num+count)%2==0){
            digit = digit + a;
        } 
        count++;    
        num /= 10;
        a *= 2;
    }while(num>0);
    printf("%d", digit);
    return 0;
}

很棒的一个代码,第8行我解释一下;

她后面还写了个num/=10.知道吧,你可以找个数代进去试一下,em.....哎呀,怎么说呢em.....就是它输入的num这个数,判断sum到底是奇数还是偶数是跟他的个位数是息息相关的,所以这个数和位数count相加就相当于这个数的个位数与count相加,之后再把这个各位去掉,将原本的十位变为了个位,然后再进行判断,核心就是偶数加偶数还是偶数,奇数加奇数也还是奇数

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值