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
测试结果:
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的整数都不是平方数。
证毕。