c語言高精度加法
等十分鍾
在給你寫
加法函數
好久沒寫程序了
本來以為十分鍾能寫好
。。。。。(修改:修復了個小bug)
void
plus(char
*a,
char
*b,
char
*c){
int
i,index_a,index_b,index_c,carry=0,ten='9'+1,temp_index_c;
index_a=strlen(a)-1;
//
index變數指向最末一個數字
index_b=strlen(b)-1;
index_c=index_a>index_b?
index_a:index_b;
temp_index_c=index_c;
if(index_a>=index_b){
for(i=index_b+1;i>=0;i--){
b[i+(index_a-index_b)]=b[i];
}
for(i=0;i<index_a-index_b;i++)
b[i]='0';
}
else{
for(i=index_a+1;i>=0;i--){
a[i+(index_b-index_a)]=a[i];
}
for(i=0;i<index_b-index_a;i++)
a[i]='0';
}
while(index_c>=0){
c[index_c]=a[index_c]+b[index_c]+carry-'0';
if(c[index_c]>=ten){
c[index_c]-=ten-'0';
carry=1;
}
else
carry=0;
index_c--;
}
if(carry==1){
for(i=temp_index_c;i>0;i--){
c[i+1]=c[i];
}
c[0]=1;
}
c[temp_index_c+1]=0;
}
② C語言高精度加法
所謂高精度加法一般都是把數字存成字元型,然後按照加法規則一位一位的加並進位。我做過長整數的,基本上位數沒什麼限制。如果帶小數的話需要處理一下,稍微麻煩一些
③ C語言高精度實數加法
#include<stdio.h>
void main()
{
double m,n,sum;
printf("請輸入數據m:\n");
scanf("%lf",&m);
printf("\n");
printf("請輸入數據n:\n");
scanf("%lf",&n);
sum=m+n;
printf("%.2lf\n",sum);
}
④ C語言80位數高精度加法
整個思路就是錯誤的,getchhar()讀到的數字都被忽略了,所以只有2,4,6....位的數字參加運算
正確的思路應該是以字元串形式讀入,然後分離各個數字到數組里,最後相加輸出
⑤ c語言~~高精度加法~~
編個大數類。下面是我編過一個不成熟的,可以運行加減乘:
#include<iostream>
using namespace std;
class big
{
public:
big()
{
high=1;
num[0]=1;
int n;
for(n=1;n<40;n++)
{
num[n]=0;
}
}
big(int hi)
{
high=hi-1;
num[0]=1;
int n;
for(n=1;n<40;n++)
{
num[n]=0;
}
}
bool operator >(big &b2);
big operator +(big &b2);
big operator -(big &b2);
big operator *(big &b2);
void output();
void input();
big muln(int a);
private:
long num[40];
int high;
};
bool big::operator >(big &b2)
{
if(high>b2.high)return true;
if(high<b2.high)return false;
else
{
int i;
for(i=high;i>=0;i--)
if(num[i]>b2.num[i])return true;
return false;
}
}
big big::operator +(big &b2)
{
int maxhigh;
maxhigh=(high>b2.high)?high:b2.high;
big b(maxhigh+1);
int i;
for(i=maxhigh;i>=0;i--)
b.num[i]=num[i]+b2.num[i];
for(i=0;i<40;i++)
{
if(b.num[i]/10!=0)
{
b.num[i+1]+=b.num[i]/10;
b.num[i]=b.num[i]%10;
if(b.high<i+1)
b.high=i+1;
}
}
return b;
}
big big::operator -(big &b2)
{
big b;
int i;
if(*this>b2)
{
b.high=high;
for(i=high;i>=0;i--)
b.num[i]=num[i]-b2.num[i];
for(i=0;i<=b.high;i++)
{
if(b.num[i]<0)
{
b.num[i+1]--;
b.num[i]=b.num[i]+10;
}
}
if(b.num[high]==0)
b.high--;
}
if(b2>*this)
{
b.high=b2.high;
for(i=high;i>=0;i--)
b.num[i]=b2.num[i]-num[i];
for(i=0;i<=b.high;i++)
{
if(b.num[i]<0)
{
b.num[i+1]--;
b.num[i]=b.num[i]+10;
}
}
if(b.num[high]==0)
b.high--;
b.num[high]=-b.num[high];
}
return b;
}
big big::operator *(big &b2)
{
big b(high+b2.high),c(high+b2.high);
int i;
for(i=0;i<=high;i++)
{
int n;
c=b2.muln(num[i]);
for(n=1;n<=i;n++)
c=c.muln(10);
b=b+c;
}
b.num[0]--;
for(i=0;i<40;i++)
{
if(b.num[i]/10!=0)
{
b.num[i+1]+=b.num[i]/10;
b.num[i]=b.num[i]%10;
if(b.high<i+1)
b.high=i+1;
}
}
return b;
}
big big::muln(int a)
{
int i;
big b;
b.high=high;
for(i=0;i<=b.high;i++)
b.num[i]=num[i]*a;
for(i=0;i<40;i++)
{
if(b.num[i]/10!=0)
{
b.num[i+1]+=b.num[i]/10;
b.num[i]=b.num[i]%10;
if(b.high<i+1)
b.high=i+1;
}
}
return b;
}
void big::output()
{
int i;
for(i=high;i>=0;i--)
cout<<num[i];
}
void big::input()
{
int i;
char chr[40];
for(i=high;i>=0;i--)
{
cin>>chr[i];
num[i]=chr[i]-'0';
}
}
int main()
{
int n1,n2;
char c='y',*c1,*c2;
while(c=='y'||c=='Y')
{
cout<<"輸入第一個大數位數:";
cin>>n1;
big b1(n1);
cout<<endl<<"輸入第一個大數:"<<endl;
b1.input();
cout<<"選擇操作:"<<endl<<"1.加法"<<endl<<"2.減法"<<endl<<"3.乘法"<<endl;
int choice;
cin>>choice;
cout<<"輸入第二個大數位數:";
cin>>n2;
big b2(n2);
cout<<endl<<"輸入第二個大數:"<<endl;
b2.input();
big b3;
switch(choice)
{
case 1:b3=b1+b2;break;
case 2:b3=b1-b2;break;
case 3:b3=b1*b2;break;
}
b3.output();
cout<<endl<<"再來一次?Y(是)/ N(否)"<<endl;
cin>>c;
}
system("pause");
return 0;
}
⑥ c語言高精度加法 求改錯
注意一下,數組下標從0開始,最大下標取值是數組大小-1
這里不用atoi,直接用對應位置的值-'0'
輸入字元串數組不用取地址
剩下的還需要微調:改動部分注釋給出
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
inta1[100],b1[100],c[101];
intk1,k2,l,k;
voidadd(inta2[100],intb2[100])
{
inty=0;
inth,x;
for(h=99;h>=k;h--)////////////////////////////
{
x=a2[h]+b2[h]+y;
c[h]=x%10;
y=x/10;
}
if(y!=0)
{
k--;
c[k]=y;
}
for(h=k;h<=99;h++)
printf("%d",c[h]);
printf(" ");////////////////////
}
intmain()
{
intn,i,j;
chara[100],b[100];
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%s%s",a,b);////////////////////////
printf("Case%d: ",i);
for(j=0;j<100;j++)a1[j]=0;///////////////
for(j=0;j<100;j++)b1[j]=0;////////////////
for(j=0;j<101;j++)c[j]=0;//////////////
k1=99;/////////////////
l=strlen(a);
for(j=l-1;j>=0;j--)///////////////////
{
a1[k1]=a[j]-'0';//////////////////
printf("%c",a[l-j-1]);/////////////////////
k1--;
}//貌似是這個循環求改正
printf("+");
k1++;
k2=99;//////////////////////
l=strlen(b);
for(j=l-1;j>=0;j--)////////////////////
{
b1[k2]=b[j]-'0';/////////////////
printf("%c",b[l-j-1]);///////////////////
k2--;
}
k2++;
printf("=");//////////////////
if(k1>k2)k=k2;elsek=k1;///////////////////
add(a1,b1);
}
return0;
}
⑦ 高精度加法的C語言程序
#include<cstdio>#include<cstdlib>#include<iostream>#include<cstring>usingnamespacestd;charsa[1000],sb[10000];inta[1000],b[1000],c[1000];intla,lb,lc;intmain(){scanf(%s%s,sa,sb);la=strlen(sa);lb=strlen(sb);memset(a,0,sizeof(a));memset(b,0,sizeof(b));for(inti=0;i<la;i++)a[la-i-1]=sa[i]-'0';for(inti=0;i<lb;i++)b[lb-i-1]=sb[i]-'0';lc=la>lb?la:lb;//if(la>lb)lc=la;elselc=lb;memset(c,0,sizeof(c));for(inti=0;i<lc;i++){c[i]=a[i]+b[i]+c[i];if(c[i]>=10){c[i+1]=1;c[i]-=10;}}if(c[lc]>0)lc++;for(inti=lc-1;i>=0;i--)printf(%d,c[i]);return0;}#include<stdio.h>#include<string.h>intmain(){chara[10001],b[10001];inta1[10001]={0},b1[10001]={0},s[20002]={0};intlena,lenb;inti,j,k=0,t;scanf(%s%s,&a,&b);lena=strlen(a);lenb=strlen(b);for(i=0;i<lena;i++)a1[i]=a[i]-48;for(j=0;j<lenb;j++)b1[j]=b[j]-48;while(i>=0&&j>=0){s[k]=a1[i]+b1[j];k++;i--;j--;}if(i>=0)while(i>=0){s[k]=a1[i];k++;i--;}elseif(j>=0)while(j>=0){s[k]=b1[j];k++;j--;}for(t=1;t<k;t++)if(s[t]>=10){s[t]%=10;s[t+1]++;}while(s[k]==0)k--;for(t=k;t>0;t--)printf(%d,s[t]);return0;}
⑧ c語言問題 計算高精度加法
#include<stdio.h>
#include<conio.h>
#include<string.h>
#define MaxLen 256
void myadd( char* p, int n )
{
int t;
if( (*p) != '\0' ) t = (*p)-'0';
else t=0;
t = t + n;
if( t>=10 )
{
myadd( p+1, t/10 );
}
*p = t%10 + '0';
}
main()
{
char s[MaxLen] = {0};
char a[MaxLen] = {0};
char b[MaxLen] = {0};
printf( "輸入第一個數字\n" );
scanf( "%s",a );
printf( "輸入第二個數字\n" );
scanf( "%s",b );
int lena = strlen(a);
int lenb = strlen(b);
int len = (lena>=lenb?lenb:lena);
int i;
for( i=0;i<len;i++ )
{
int t = (a[lena-1-i]-'0') + (b[lenb-1-i]-'0');
myadd( &s[i], t );
}
if( lena>lenb )
{
for( ;i<lena;i++ )
{
int t = (a[lena-1-i]-'0');
myadd( &s[i], t );
}
}
else if( lenb>lena )
{
for( ;i<lenb;i++ )
{
int t = (b[lenb-1-i]-'0');
myadd( &s[i], t );
}
}
len = strlen(s);
for( int i1=0;i1<len/2;i1++ )
{
char ch = s[i1];
s[i1] = s[len-1-i1];
s[len-1-i1] = ch;
}
printf( "\n" );
printf( "%s\n",s );
getch();
}
⑨ C語言的高精度加法
#include<iostream>#include<string.h>using namespace std;
int main(){ char a1[1000],b1[1000]; int a2[1000],b2[1000],c[1001],len1,len2,i,j,k,t; while(cin>>a1>>b1) { len1=strlen(a1); len2=strlen(b1);
memset(a2,0,sizeof(a2)); memset(b2,0,sizeof(b2)); memset(c,0,sizeof(c));
k=0; for(i=len1-1;i>=0;i--) { a2[i]=a1[k]-48; k++; }
k=0; for(i=len2-1;i>=0;i--) { b2[i]=b1[k]-48; k++; }
j=0; t=(len1>len2)? len1:len2; while(j<t) { c[j]=a2[j]+b2[j]; j++; } for(i=0;i<t;i++) { if(c[i]>9) { c[i]-=10; c[i+1]++; } } if(c[t]!=0) cout<<c[t]; for(i=t-1;i>=0;i--) cout<<c[i]; cout<<endl; } return 0;}
⑩ 關於用C語言編寫高精度加減法
好像是哪個oj上的題目,直接模擬就行了,加減法都是從字元串的最後一個字元算起,如果*a + *b > '9'就進位,同時移動指針 a--, b--,c--就行了。