Exemple #1
0
int divide(struct NUMBER *a,struct NUMBER *b,struct NUMBER *c,struct NUMBER *d)
{
	int k,res = 0;
	struct NUMBER tmp_a,n,m,l,abs_a,abs_b;

	copyNumber(a,&tmp_a);//aが破壊されないようにtmp_aにコピー

	if(isZero(b) == 0)//isZeroは0か-1が返るので
		return(-1);

	clearByZero(c);
	clearByZero(d);//c,dを0でクリア
	clearByZero(&n);
	clearByZero(&m);
	clearByZero(&l);//作業用変数n,m,lを0でクリア

	setInt(&n,1);//適当な変数に1を突っ込む
	if(numComp(b,&n) == 0)//除数が1ならば
	{
		copyNumber(a,c);//c = a;
		return(0);
	}


	getAbs(a,&abs_a);
	getAbs(b,&abs_b);//a,bの絶対値をとる

	if((getSign(a) == 1) && (getSign(b) == 1))
	{
		while(1)//xから何回yを引けるか調べる
		{
			if(numComp(&tmp_a,b) == -1)//a < bならば
				break;
			copyNumber(b,&n);//bを作業用変数nに代入
			setInt(&m,1);//作業用変数mに1を代入
			while(1)
			{
				copyNumber(&n,&l);
				mulBy10(&l,&n);
				copyNumber(&m,&l);
				mulBy10(&l,&m);//mとnを10倍
				if(numComp(&tmp_a,&n) == -1)//a < nならば
				{
					copyNumber(&n,&l);
					divBy10(&l,&n);
					copyNumber(&m,&l);
					divBy10(&l,&m);//10倍しちゃったので10で割る。いい方法を模索中、一時的に保存する?
					break;
				}
			}
			while(1)
			{
				copyNumber(&tmp_a,&l);//lに現在のaを代入
				sub(&l,&n,&tmp_a);//a = l -n; すなわち a -= n; 
				copyNumber(c,&l);//lにcを代入
				add(&l,&m,c);//c = l + m;すわなち c += m;
				if(numComp(&tmp_a,&n) == -1)
					break;
			}
		}
		copyNumber(&tmp_a,d);//残ったtmp_aがすなわち剰余
	}


	if((getSign(a) == 1) && (getSign(b) == -1)) 
	{
		res = divide(a,&abs_b,c,d);
		setSign(c,-1);//+ / -は解が負であるため
	}
	if((getSign(a) == -1) && (getSign(b) == 1))
	{
		res = divide(&abs_a,b,c,d);
		setSign(c,-1);//- / +は解が負であるため
		setSign(d,-1);//- / +は剰余が負であるため
	}
	if((getSign(a) == -1)&& (getSign(b) == -1))
	{
		res = divide(&abs_a,&abs_b,c,d);//-x / -yは解が正であるためなにもしない
		setSign(d,-1);//- / -は剰余が負であるため
	}
	return(res);
}
Exemple #2
0
//除算(ひっ算ver.)
int divide(struct NUMBER *a,struct NUMBER *b,struct NUMBER *c,struct NUMBER *d){

  
  struct NUMBER az,bz;//絶対値
  struct NUMBER bb;//azと同じ桁数にしたbzを保管
  struct NUMBER sho,amari;
  struct NUMBER tmp;//一時保管場所
  struct NUMBER n;//n:azのコピー
  struct NUMBER c1,d1;//普通の除算を行うときに使う
  struct NUMBER bz2;//bzコピー
  int i=0;
  int ak,bk;//aとbのゼロ判定かつ桁数をみる。
  int f;//aとbの桁数の差
  int ch;

  clearByZero(c);  
  clearByZero(d);
  clearByZero(&az);  
  clearByZero(&bz);  
  clearByZero(&bb);  
  clearByZero(&sho);  
  clearByZero(&amari);  
  clearByZero(&tmp);  
  clearByZero(&n);

  copyNumber(a,&az);
  copyNumber(b,&bz);
  copyNumber(&bz,&bz2);

  if(numComp(a,b)==-1) {
    return -1;
  }

  if(isZero(b)==0){
    return -1;
  }

  if(isZero(a)==0){
    setInt(c,0);
    setInt(d,0);
    return 0;
  }

  ak=readKETA(a);
  bk=readKETA(b);

  //bをaと桁数合わせる。
  if(ak>bk){
    f=ak-bk; //桁数の差を知る
    while(i<f){
      mulBy10(&bz,&bb);
      copyNumber(&bb,&bz);
      i++;
    }
  }

  copyNumber(&bz,&bb);

  //除算実行
  while(1){

    //桁数を合わせたbのほうが大きい場合
    //÷10して、fをデクリメント
    if(numComp(&az,&bb)==-1){
      divBy10(&bb,&tmp);
      copyNumber(&tmp,&bb);
      f--;
    }
     
    //分母のほうが大きい場合
    if(numComp(&az,&bz2)==-1) {
      break;
    }
    copyNumber(&az,&n);
    i=0;

    while(numComp(&az,&bb)==1 || numComp(&az,&bb)==0){ //az<bbになるまで繰り返す。
      //ふつうの割り算アルゴリズム
      sub(&n,&bb,&tmp);
      copyNumber(&tmp,&n);
      copyNumber(&n,&az);
      i++;
    }
    c->n[KETA-1-f]=i;
    copyNumber(&n,&az);
  }

  copyNumber(&n,d);

  return 0;

}