C语言培训_011

斐波那契前100项(借助数组法)

#include"stdio.h"

typedef struct shu
{
	int x[100];
}shu;

shu plus(shu a,shu b)
{
	shu c;
	for(int i=0;i<100;i++)
	{
		c.x[i]=0;
	}
	int temp=99;
	while(a.x[temp]==0&&temp>0)
	{
		temp--;
	}
	temp++;	
	for(int i=0;i<temp;i++)
	{
		c.x[i]=a.x[i]+b.x[i];
	}
	
	for(int i=0;i<100;i++)
	{
		while(c.x[i]>=10)
		{
			c.x[i]=c.x[i]-10;
			c.x[i+1]=c.x[i+1]+1;
		}
	}
	return c;
}

void output(shu a)
{
	int i=99;
	while(a.x[i]==0&&i>0)
	{
		i--;
	}
	
	for(int j=i;j>-1;j--)
	{
		printf("%d",a.x[j]);
	}
}


int main()
{
	shu n[100]={{{1}},{{1}}};
	for(int i=2;i<100;i++)
	{
		n[i]=plus(n[i-1],n[i-2]);
	}
	
	for(int i=0;i<1000;i++)
	{
		output(n[i]);
		printf("\n\n");
	}
	return 0;
}

长正整数的加法乘法(接上一题)

#include"stdio.h"
//定义无符号结构体。最大可储存100位数。 
typedef struct shu 
{
	int x[100];
}shu;

shu plus(shu a,shu b)//加法函数 
{
	shu c;// C 为最后返回的结果。 
	for(int i=0;i<100;i++)
	{
		c.x[i]=0;//一般系统会把各个位置重置为 0 。但保险起见我们再手动设置一下。 
	}
	
	int a1=99,b1=99;// a1,b1,为输入两个数的最大位数。 
	while(a.x[a1]==0&&a1>0)//从99位起,只要是 0 ,则不是最高位.最后算出的 a1 为 shu a 的最高位。 
	{
		a1--;
	}
	
	while(b.x[b1]==0&&b1>0)// b1 为 shu b 的最高位。 
	{
		b1--;
	}
	
	int max=a1>b1?a1:b1;// max 为两个最高位的最大值。 
	for(int i=0;i<=max;i++)// C 每一位都是 a,b 对应位置的和。 
	{
		c.x[i]=a.x[i]+b.x[i];
	}
	
	for(int i=0;i<max+1;i++)// 化简 c . 
	{
		while(c.x[i]>=10)//找到一个位置比 10 大,则进位。 
		{
			int k=c.x[i];
			c.x[i]=c.x[i]%10;
			c.x[i+1]=c.x[i+1]+k/10;
		}
	}
	return c;
}

shu multi(shu a,shu b)// 乘法函数 
{
	shu c;// C 为最后返回的结果 
	for(int i=0;i<100;i++)
	{
		c.x[i]=0;//初始化 C 的每一位。 
	}
	int a1=99,b1=99;//求出输入两个数的位数。 
	while(a.x[a1]==0)
	{
		a1--;
	}
	while(b.x[b1]==0)
	{
		b1--;
	}
	int max=a1>b1?a1:b1;//两个输入数的最大位数。
	int min=a1>b1?b1:a1;//两个输入数较小的位数。
	int sum=max+min;//两个输入数的总位数。 
	for(int i=0;i<=b1;i++)
	{
		for(int j=0;j<=a1;j++)
		{
			c.x[i+j]=c.x[i+j]+b.x[i]*a.x[j];//画出乘法公式找规律,累加c。 
		}
	}
	
	for(int i=0;i<100&&i<sum;i++)//想想一个数乘 99 就知道为什么 i 要小于 sum 了。 
	{
		while(c.x[i]>=10)//大于 10 的那个位置 进位。 
		{
			int k=c.x[i]; 
			c.x[i]=c.x[i]%10;
			c.x[i+1]=c.x[i+1]+k/10;
		}
	}
	return c; 
}
shu min(shu a,shu b)
{
	int a1=99,b1=99;
	while(a.x[a1]==0)
	{
		a1--;
	}
	while(b.x[b1]==0)
	{
		b1--;
	}
	int max=a1>b1?a1:b1;
	
	shu c;
	for(int i=0;i<100;i++)
	{
		c.x[i]=0;
	}
	
	for(int i=0;i<=max;i++)
	{
		c.x[i]=a.x[i]-b.x[i];
	}
	
	
	return c;
}
void output(shu a)
{
	int i=99;
	while(a.x[i]==0&&i>0)
	{
		i--;
	}
	int temp=1;
	for(int j=i;j>-1;j--)
	{
		printf("%d",a.x[j]);
		if(temp++==3)
		{
			temp=1;
			printf(",");
		}
	}
	printf("\n");
}


int main()
{
	shu a={8,8,8,8,8,8,8,8};//10的意思。高位到低位算的。 
	shu b={9,9,9,9,9,9,9,9,9};//321的意思。写函数的时候没考虑到这个问题。现在不想改了。 
	shu c=multi(b,a);
	printf("88 888 888 * 999 999 999 =");
	output(c);
	
	printf("88 888 888 + 999 999 999 =");
	shu d=plus(a,b);
	output(d);
	
	return 0;
}

有符号大数的四则运算(接上一题)


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值