根据评论要求,改进代码:
从网站建设到定制行业解决方案,为提供成都网站设计、做网站服务体系,各种行业企业客户提供网站建设解决方案,助力业务快速发展。创新互联将不断加快创新步伐,提供优质的建站服务。
1、函数getBCode是题目要的递归函数,实现转二进制(最高位是符号位)。
思路是十进制数绝对值除以2求余,得到反向二进制原码,反向创建链表保存结果,最终得到的单向链表就是完整二进制数原码,之后根据正负性,负数取反+1。链表头添加符号位。
2、函数freeBny为释放链表,如要重复调用函数getBCode,每次调用需调用一次freeBny。
3、函数showBny是打印输出,为对齐显示,按4的倍数位打印,高位补齐的位数值均与符号位一致。
#include stdio.h
#include malloc.h
#include math.h
typedef struct binary//成员用char类型保存数值,不是'1'或'0'的ASCII码
{
char b;//一位二进制数0或1
struct binary *next;
}BNY;
BNY *getBCode(int n);//获得二进制数(最高位是符号位)
void showBny(BNY *bnyHead);//对齐打印二进制数(保证是4的倍数)
void freeBny(BNY *bnyHead);//释放二进制数链表空间
int main()
{
int n;
BNY bny,*bnyHead=bny;
while(1)
{
printf("请输入一个整数:"),scanf("%d",n);
bnyHead-next=getBCode(n);
printf("转为二进制数:"),showBny(bnyHead);
freeBny(bnyHead);
printf("\n");
}
return 0;
}
void freeBny(BNY *bnyHead)
{
BNY *prev=NULL,*bny=NULL;
bny=bnyHead-next;
while(bny)
{
if(prev) prev-next=NULL,free(prev),prev=NULL;
prev=bny;
bny=bny-next;
}
bnyHead-next=NULL;
}
void showBny(BNY *bnyHead)
{
int i,f=-1,len=0,n=0;
BNY *bnySave=bnyHead;
while(bnyHead-next)
{
if(f==-1) f=bnyHead-next-b;
len++;
bnyHead=bnyHead-next;
}
if(len%4)
n=4-len%4;
for(i=0;in;i++)printf("%d",f);
bnyHead=bnySave;
while(bnyHead-next)
{
printf("%d",bnyHead-next-b);
n++;
if(n==4)printf(" "),n=0;
bnyHead=bnyHead-next;
}
}
BNY *getBCode(int n)
{
int s,y;
static BNY*bnyPrev=NULL;
static int cy=0,f=-1;//加1进位用
if(f==-1 n=0)f=1;
if(f==-1 n0)f=0,cy=1;
n=abs(n);
BNY *bnyNew=NULL;
s=n/2,y=n%2;
bnyNew=(BNY *)malloc(sizeof(BNY));
if(!bnyNew) return NULL;
bnyNew-b=y;
// 如是负数,直接取反+1
if(!f) bnyNew-b=!(bnyNew-b);//从最低位开始,负数取反
if(cy)bnyNew-b=bnyNew-b+cy,cy=0;//负数+1
if(bnyNew-b1)bnyNew-b=0,cy=1;
bnyNew-next=NULL;
if(bnyPrev) bnyNew-next=bnyPrev;
bnyPrev=bnyNew;
n=s;
if(n==0)
{
bnyNew=(BNY *)malloc(sizeof(BNY));//添加符号位
if(!bnyNew) return NULL;
if(!f)
bnyNew-b=1;
else
bnyNew-b=0;
bnyNew-next=bnyPrev;
bnyPrev=NULL;
cy=0,f=-1;
return bnyNew;
}
return getBCode(n);
}
#include stdio.h
int gcd(int m,int n) {
if(m*n==0)
return (m==0?n:m);
if(mn)
return gcd(m%n,n);
else if(mn)
return gcd(n%m,m);
}
int main(void) {
int m,n;
printf("请输入两个数:\n");
scanf("%d%d",m,n);
printf("其最大公约数为:\n");
printf("%d\n",gcd(m,n));
return 0;
}
运行结果
# include stdio.h
void reverse( int n); //函数声明
void main ( )
{ int n;
printf("Input n: "); scanf("%d",n);
if(n0) n=-n;
printf("The reversed digits are: ");
reverse(n);
printf("\n");
}
void reverse(int n) //定义递归函数
{ printf("%d", n%10); //输出最低位数
if(n/10!=0) reverse(n/10); //如果除去最低位后还有其他数字,递归处理剩余部分
}
这个题用循环语句比较简单,递归的话稍微复杂点,下面是我刚写的:
Hand和Hand2是递归函数;Test是测试函数,用来检验x1,x2,x3的值是否满足条件,满足的话输出(这个函数不是重点,我只写了句提示,你把它补充完整就行);fun函数直接调用Hand函数,主函数中把fun函数放进去就行了。
void fun(bool x1,bool x2,bool x3){
static int count=0;
Hand(x1,x2,x3,count);
}
void Test(bool X,bool Y,bool Z){ //测试函数
if((x1 || !x2 || x3)(!x1 || x2 || x3)) ..... 输出X,Y,Z的值
}
bool Hand2(int x){ //递归函数,按顺序为x1x2x3赋值
if(x=0) return false;
ruturn !Hand(x-1);}
void Hand(bool x1,bool x2,bool x3,count) //递归函数,依次赋值并检测(调用了Hand2和Test)
{
if (count=8) return ;
x1=Hand2(count%4);x2=Hand2(count%2);x3=Hand2(count);
Test(x1,x2,x3);
Hand(x1,x2,x3,count++);
}
采用就给分吧。
#include "stdio.h"
void intrev(int n){
if(n){
printf("%d",n%10);
intrev(n/10);
}
}
int main(int argc,char *argv[]){
int x;
printf("Please enter a positive integer...\n");
if(scanf("%d",x)!=1 || x1){
printf("Input error, exit...\n");
return 0;
}
intrev(x);
printf("\n");
return 0;
}
运行样例:
我给你举个简单的例子你就明白了,你可以假设n=3
然后代入这个函数,a(3)=a(2)+5;而a(2)=a(1)+5;a(1)=1
所以最后就是a(3)=1+5+5=11…
同理你可以算出a(10)=1+5*9=46
满意请采纳