第一章作业

CINTA 第一章作业

1.题目描述:

用C语言编程实现判断输入为偶数的函数,即如果输入为偶数,返回True,否则返回False。

思路:

直接写一个函数,判断利用位运算,一个偶数的二进制形式最后一位为0,而一个奇数的二进制形式的最后一位为1。所以可以利用和1相与的结果来直接判断该数是奇数还是偶数,最后按照题目要求输出格式输出即可。

代码:

//Code by Showball on 2022/8/30
#include<stdio.h>
void IsEven(int n){//判断n是否为偶数
     if(n&1) printf("False\n");
     else printf("True\n");
}
int main(){
    int t;//测试样例个数
    scanf("%d",&t);
    while(t--){
    int n;
    scanf("%d",&n);
    IsEven(n);
    }
    return 0;
}

代码测试:

测试样例:6
        1 2 3 4 5 6
测试输出:False
         True
         False
         True
         False
         True

测试结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MAU29j1C-1661836647952)(C:\Users\Crimaster\AppData\Roaming\Typora\typora-user-images\image-20220830124222511.png)]

3.题目描述:

用C语言编程实现一种迭代版本的简单乘法。

思路:

编程一个计算a+b结果的函数,a,b皆为正整数,
分为b是奇数或偶数两种情况进行简单迭代。如果b为奇数,返回 a+mul(a,b-1);
如果b为偶数,则返回 mul(a<<1,b/2);知道b=0时,迭代结束。

代码:

//Code by Showball on 2022/8/30
#include<stdio.h>
int mul(int a,int b){//计算a+b,保证a>=b.迭代次数更少
   if(a<b) return mul(b,a);
   if(b==0) return 0;
   if(b&1) return a+mul(a,b-1);
   else return mul(a<<1,b/2);
}
int main(){
    int t;//测试样例个数
    scanf("%d",&t);
    while(t--){
    int a,b;
    scanf("%d%d",&a,&b);
   printf("%d" "*" "%d" "=" "%d\n",a,b,mul(a,b));
    }
    return 0;
}

代码测试:

测试样例:6
        4 6
        5 4
        2 3
        7 8
        9 9
        5 5
测试输出:
        4*6=24
        5*4=20
        2*3=6
        7*8=56
        9*9=81
        5*5=25
     

测试结果:

在这里插入图片描述

4.证明命题1.1

题目描述:

证明以下命题:

在这里插入图片描述

证明:

证明第一个结论:
 已知a,b,c都是整数,因为a|b,所以一定存在一个整数p使得b=pa;
 同理,一定存在一个整数q使得c=qb;
进行代入可以得到c=qb=q(pa)=(pq)a。因为p,q都是整数,
所以pq也为整数.所以存在一个整数r,r=pq,使得c=ra。
所以a|c。
    证毕。
 证明第二个结论:
  已知a,b,c,m,n都是整数,因为c|a,所以一定存在一个整数p使得a=pc;
  同理,一定存在一个整数q使得b=qc;
进行代入可以得到ma+nb=m(pc)+n(qc)=(mp)c+(nq)c=(mp+nq)c。
因为p,q,n,m都是整数,所以mp+nq也为整数.
所以存在一个整数r,r=mp+nq,使得(ma+nb)=rc。
所以c|(ma+nb)。
    证毕。

选做题

2.题目描述:

给定一个整数v,如何判断v是否2的某次方?比如,v=4=pow(2,2),返回True;
v=9=pow(3,2)+1并非2的次方,返回False。请写一个C语言程序的函数来实现以上功能。

思路:

利用lowbit函数配合循环可以求出一个数二进制形式下有多少个1。如果一个数可以表示成2的次方,那么它的二进制形式下必须有且只有一个1。判断该条件即可。

代码:

//Code by Showball on 2022/8/30
#include<stdio.h>
#include <stdbool.h>
int lowbit(int n){//返回一位数二进制形式下最后一个1
    return n&-n;
}
bool IsSquare(int n){//判断二进制形式下只有一个1的才是2的n次方
    if(n<0) return false;//负数一定不满足情况
    int k=0;
    while(n){
        n^=lowbit(n);k++;
    }
    return k==1;
}
int main(){
    int t,n;
    scanf("%d",&t);//测试样例数量
    while(t--){
        scanf("%d",&n);
        if(IsSquare(n)) printf("True\n");
        else printf("False\n");
    }
    return 0;
}

代码测试:

测试样例: 6
          1
          2
          3
          4
          5
          6  
测试输出:
        True
        True
        False
        True
        False
        False
     

测试结果:

在这里插入图片描述

7.题目描述:

证明任意形如111…n个…1111的整数都不是平方数,n>2。

思路:

分别分析形如1111…1111的数的性质和平方数的性质,如果性质不存在交集,则证明成立。

证明:

我们先来研究平方数的性质:
  先上结论:若平方数是一个奇数,那么该平方数一定是4的倍数+1;
  若平方数是一个偶数,那么该平方数一定是4的倍数;
  证明:
  1.我们知道奇数的平方是奇数,偶数的平方是偶数。
  先考虑奇数的情况,存在一个奇数m,则m可表示为2k+1,其中k为整数。
  那么pow(m,2)=pow(2k+1,2)=pow(2k,2)+4*k+1=4*pow(k,2)+4*k+1。
  其中k为整数。所以证得奇数的平方数是奇数,并且该平方数是4的倍数+1.
  2.同理,考虑偶数的情况,存在一个偶数n,则n可以表示为2k,其中k为整数。
  那么pow(n,2)=pow(2k,2)=4*pow(k,2)。
  其中k为整数。所以证得偶数的平方数是偶数,并且该平方数是4的倍数。
接着我们来研究形如1111....1111的性质:
  通过2进制的性质,该类型的数可以表示为pow(2,n)-1。其中n大于2。
  所以当n>2时,该数便可以表示为4*pow(2,n-2)-1。将后面的常数化成正整数,即4*pow(2,n-3)+3;
  所以该类型的数是4的倍数+3。

分析完两种数的性质,我们发现无论如何形如111....1111的数都无法满足平方数对应的性质。
所以任意形如111....n个...1111的整数都不是平方数。
   证毕。
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Showball.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值