C言語注精度の計算

オリジナルリンク: http://c.biancheng.net/c/

大規模なデータブリーフのC言語タイプ

我々が知っているように、等、データ型intまたは二重を使用してデータを格納するための内部コンピュータは、操作データが大きい場合に、計算結果が正確でないように、コンピュータは、発生したオーバーフローする、の範囲を制限することです。例えば、20ビットの10進整数、int型の変数が格納されている場合、データのオーバーフローが発生します。数が整数演算を超えた場合に、実際の範囲は確かに直接表現される数の形で使用することができない、表現することができます。動作中に、データの多数は、2つのタイプで表すことができる文字列と整数配列を

  • 整数配列:各要素がどのように多くのビット配列の要素数が必要とされる一格納され、フォームがそれぞれの数であり、直接、非常に便利な操作を引くが、直接すべての整数の配列要素を入力することができません、一つだけ入力し、入力は、それぞれ2桁の間の区切り文字は、入力された値は、人々の習慣、満たしていませんがなければならない不便な入力と出力を。
  • 文字列(基本的に文字の配列である):文字列の最大長は何ですか、それはどのように多くの数字を示すことができます。文字列は、すべてのビットの値を直接入力し、出力することができ表すが、各ビット列が文字であり、それはさらに、数値計算、に変換されなければならない不便な操作

長所と整数の総合的な配列と文字の配列の欠点は、我々は次の質問では、データ列を読み込み、整数配列のダンプ操作は、文字列出力への変換に続いて、運転中に行います。

実際には、高精度の計算方法は、プログラミングを通じて、コンピュータ上の数学的な計算手順は再び完全にちょうど示しています。

精密加算器

問題の説明:
2を見つけるには、200以上でない非負の整数と。計算式の出力、加算結果は、結果が余分に持つことができない先行ゼロ、200以下の2本の入力ラインは、負でない整数、余分な0をリードしています。

分析:
いない200以上大きい整数の値を保持する文字列、とを有する便宜上動作は、格納された整数の大整数アレイに格納された文字列に転送される場合。ときに、2つの数値一緒に最初のビットが整列されているため、次に下位から計算され、実際にユーザ入力が、整数配列インデックスが最上位ビットが0に対応する場合、整数配列インデックスが最大ビットに対応場合、整数のアレイに転送文字列記憶された加算値、対向する第1逆変換、すなわち、0に対応する整数配列標識ビット、整数アレイ10に1つの対応標識。
ここに画像を挿入説明

#include <stdio.h>
#include <string.h>
#define MAXLEN 210
void Invert(char *a,int *b);//将a字符逆置转换到整数数组b中,确保下标0对应个位而不是最高位 
void Output(int *p,int len);//输出整型数组元素 
int main(void)
{
 char str1[MAXLEN],str2[MAXLEN],str[MAXLEN];//存放两个加数(输入)以及和(输出)的字符串
 int a[MAXLEN],b[MAXLEN],c[MAXLEN];//存放加数以及和的整型数组(中间处理) 
 printf("输入两个加数:\n");
 scanf("%s %s",str1,str2);
 //整型数组a,b,c的元素全部清零,memset函数一般用于在对定义的字符串进行初始化为"\0",对较大的结构体或数组进行清0操作的一种最快方法 
 memset(a,0,sizeof(a));
 memset(b,0,sizeof(b)); 
 memset(c,0,sizeof(c));
 //将两个加数字字符串按位逆置存放到整型数组中,下标0对应个位
 Invert(str1,a);
 Invert(str2,b);
 printf("******************运算过程(列竖式做加法)******************\n");
 Output(a,strlen(str1));
 printf("\n");
 Output(b,strlen(str2));
 int len=strlen(str1)>=strlen(str2) ? strlen(str1):strlen(str2);//求加数较长的位数
 for(int i=0;i<len;i++)//从第一位到最高位逐位相加运算 
 {
  c[i]+=a[i]+b[i];
  c[i+1]=c[i]/10;//c[i]能除多少个10就表示进多少个位,i位的进位数存放到c[i+1]上
  c[i]%=10; //c[i]进完位后的数则是(a[i]+b[i])求模10,为余下的数 
 } 
 printf("\n");
 Output(c,len);
 printf("\n******************运算过程******************");
 while(len>=0&&c[len]==0)//和的处理,去掉前导0,并把结果复制到串中
 {
  len--;
 } 
 memset(str,0,sizeof(str));//0<=>'\0'字符串结束符 
 int i=0;
 for(int j=len;j>=0;j--)
 {
  str[i++]=c[j]+'0';//整型数字转换为字符型数字 
 } 
  if(strlen(str)==0)
 {
  str[0]='0';//结果为0的情况 
 }
 printf("\n");
 printf("运算结果:%s + %s = %s\n",str1,str2,str);
 return 0;
} 
void Invert(char *a,int *b)
{
 int len=strlen(a),j=0;
 for(int i=len-1;i>=0;i--)
 {
  b[j++]=a[i]-'0';
 }
}
void Output(int *p,int len)
{
 for(int i=0;i<len;i++)
 {
  printf("%d",p[i]);
 }
}

操作出力:
ここに画像を挿入説明
コード疑問:
どのように具体的な運用整数配列それ?シミュレートされた一次の垂直列が加算方式を行う、すなわち、ビットが和からビットによって上位ビットに対応する開始位置に位置合わせし、以上10キャリーに等しいです。[210]最初の格納された加数、int型B [210]保存するための第2の加数、及びその後少しずつ加えること、INT Cに蓄積された2つの数値を加算した結果[210 INTと次のソースコードで]、次のコードセグメントがどこの位置に加工されるべき

 for(int i=0;i<len;i++)//从第一位到最高位逐位相加运算 
 {
  c[i]+=a[i]+b[i];
  c[i+1]=c[i]/10;//c[i]能除多少个10就表示进多少个位,i位的进位数存放到c[i+1]上
  c[i]%=10; //c[i]进完位后的数则是(a[i]+b[i])求模10,为余下的数 
 } 

精密乗算

問題の説明:
ない1000の以上の大きな整数の2つの要件の製品。二つの入力ラインは、各ラインがない1000以上の整数であり、余分なリーディング0であり;式と乗算結果を出力します。結果は0をリードし、余分なことはできません。

分析:
ここでは乗算記号は、データ構造は、単にシミュレーションプロセスを変更することを検討し、変更する、と見なされるためには、乗算アルゴリズムであります:

おすすめ

転載: blog.csdn.net/weixin_42124234/article/details/102725470