① 求高精度c語言程序
給,已經編譯運行確認了:
#include<iostream>
#include<stdlib.h>
using namespace std;
int getlength(char *ch)
{
int i;
for(i=0;i<1000;i++)
if(ch[i]=='\0')
break;
return i;
}
void plusdata(int *dt,int *pdt,int k,int kk)
{
int i;
for(i=0;i<k;i++)
{
dt[i]=dt[i]+pdt[i];
if(dt[i]>9)
{
dt[i]-=10;
dt[i+1]++;
}
}
if(dt[i]>9)
{
dt[i]-=10;
dt[i+1]++;
}
if(dt[kk]!=0)
i=kk;
else
i=kk-1;
for(;i>=0;i--)
cout<<dt[i];
cout<<endl;
}
void minusdata(int *dt,int *mdt,int k,int kk,int signal)
{
int i;
for(i=0;i<k;i++)
{
dt[i]=dt[i]-mdt[i];
if(dt[i]<0)
{
dt[i]+=10;
dt[i+1]--;
}
}
if(dt[i]<0)
{
dt[i]+=10;
dt[i+1]--;
}
while(dt[kk]==0)
kk--;
if(signal==0)
cout<<'-';
for(i=kk;i>=0;i--)
cout<<dt[i];
cout<<endl;
}
void main()
{
char ch1[1000],ch2[1000],ch0[2],ch;
int data1[1001],data2[1001];
int i,j,k1,k2,flag=0;
for(i=0;i<1001;i++)
{
data1[i]=0;
data2[i]=0;
}
cout<<"You can input the first date"<<endl;
cin>>ch1;
cout<<"You can input the second date"<<endl;
cin>>ch2;
cout<<"What operation you want?( + or - )"<<endl;
cin>>ch;
ch0[1]='\0';
j=0;
while(ch1[j]=='0')
j++;
for(i=0;i<999-j;i++)
ch1[i]=ch1[i+j];
j=0;
while(ch2[j]=='0')
j++;
for(i=0;i<999-j;i++)
ch2[i]=ch2[i+j];
k1=getlength(ch1);
k2=getlength(ch2);
j=k1;
for(i=0;i<k1;i++)
{
j--;
ch0[0]=ch1[j];
data1[i]=atoi(ch0);
if((ch1[i]<'0')||(ch1[i]>'9'))
flag=1;
}
j=k2;
for(i=0;i<k2;i++)
{
j--;
ch0[0]=ch2[j];
data2[i]=atoi(ch0);
if((ch2[i]<'0')||(ch2[i]>'9'))
flag=1;
}
if(flag==0)
{
if(ch=='+')
{
if(k1<k2)
plusdata(data2,data1,k1,k2);
else
plusdata(data1,data2,k2,k1);
}
if(ch=='-')
{
if(k1==k2)
{
while(data1[k1-1]==data2[k1-1])
k1-=1;
if(data1[k1-1]>data2[k1-1])
minusdata(data1,data2,k2,k2,1);
else
minusdata(data2,data1,k2,k2,0);
}
else
{
if(k1>k2)
minusdata(data1,data2,k2,k1,1);
else
minusdata(data2,data1,k1,k2,0);
}
}
}
else
cout<<"You have input a invaluable char!"<<endl;
}
② c語言求高精度小數
//改了部分代碼
#include<stdio.h>
#include<math.h>
#defineN200//小數位數,方便調試
intmain(){
intm,n;
inti;
intj=0;
scanf("%d/%d",&m,&n);
if(m*n<0){//處理一下正負號:如果結果是負數時
printf("-");//先輸出負號
m=abs(m);//後面運算過程全部用正數來運算
n=abs(n);
}
printf("%d.",m/n);
m=m%n;
for(i=1;i<=N;i++){
if(m==0){//能整除時
printf("0");
continue;
}
j=10*m/n;
printf("%d",j);
m=10*m%n;
}
printf(" ");
return0;
}
③ 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語言如何運用數組做高精度的開方運算,要求精確到小數點後100位
#include<stdio.h>
#include<string.h>
intl;
intwork(into,char*O,intI)
{
charc,*D=O;
if(o>0)
{
for(l=0;D[l];D[l++]-=10)
{
D[l++]-=120;
D[l]-=110;
while(!work(0,O,l))
D[l]+=20;
putchar((D[l]+1032)/20);
}
putchar(10);
}
else
{
c=o+(D[I]+82)%10-(I>l/2)*(D[I-l+I]+72)/10-9;
D[I]+=I<0?0:!(o=work(c/10,O,I-1))*((c+999)%10-(D[I]+92)%10);
}
returno;
}
intmain()
{
chars[1200];s[0]='0';
scanf("%s",s+1);
if(strlen(s)%2==1)
work(2,s+1,0);
else
work(2,s,0);
return0;
}
⑤ c語言實現大數比較(高精度)
//可以轉換成字元串來比較,添加數字轉換成字元串就可以了
#include<stdio.h>
#include<string.h>
intmain()
{
chara[1001],b[1001];
gets(a);
gets(b);
inttemm=strcmp(a,b);
if(temm>0)
printf("%s",a);
elseif(temm<0)
printf("%s",b);
else
printf("兩個數據相等 ");
return0;
}
⑥ 急求高精度加法演算法(C語言)!!
高 精 度 算 法
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <malloc.h>
int an,bn,fa=1,fb=1; /* 把an,bn,k設為全局變數,an紀錄第一個高精度數組的位數,bn紀錄第二個高精度數組的位數,k紀錄輸出結果的位數*/
char b1[250], b2[250]; /*紀錄需要計算的兩個高精度數據 */
void input(int a1[],int a2[]) /*函數input為輸入函數,用來紀錄兩個待計算的高精度數據,以數組首地址為參數.以實現返回兩個高精度數據*/
{
int i,ai=1,bi=1;
scanf ( "%s%s", b1, b2 ); /*輸入兩個高精度數據 */
an = strlen( b1 ); /*an紀錄b1的位數 */
bn = strlen( b2 ); /*bn紀錄b2的位數 */
if(b1[0]==45) { an--; fa=-1;ai=0;} /*判斷數組的符號 */
if(b2[0]==45) { bn--; fb=-1;bi=0;}
for (i=0; i<an; i++,ai++) {a1[i]=b1[an-ai]-'0'; printf("%d",a1[i]);} /*把字元形數據b1轉為整數形數據,同樣用數組紀錄 */
for (i=0; i<bn; i++,bi++) a2[i]=b2[bn-bi]-'0'; /* 同上 */
return;
}
void addition(int a[],int b[],int q) /*高精度加法運算*/
{
int i,c[251]={0},k;
if(fa*fb>0||q)
{
if(an>bn) k=an;
else k=bn; /*用k紀錄結果的最小位數*/
for(i=0;i<k;i++)
{
c[i]=a[i]+b[i]+c[i];
c[i+1]=(int)c[i]/10;
c[i]=(int)c[i]%10;
} /*高精度加法運算過程*/
if(c[k]) k++; /*判斷最後結果的位數*/
if(fa<0&&q||fa<0) printf("-");
for(i=k-1;i>=0;i--) printf("%d",c[i]); /*輸出結果*/
return;
}
else subtraction(a,b,1);
return;
}
subtraction(int a[],int b[],int q) /*高精度減法運算*/
{
int i,f=0,c[251]={0},k;
if(fa*fb>0||q)
{
if(an>bn) k=an;
else /*用k紀錄結果的最大位數*/
{ k=bn;
for(i=k;a[i]<=b[i]&&i>=0;i--)
if(a[i]<b[i]) f=1; /*f紀錄結果符號*/
}
if(!f) /*高精度減法運算過程*/
for(i=0;i<k;i++)
{
if(a[i]<b[i])
{ a[i+1]--;
a[i]+=10;
}
c[i]=a[i]-b[i];
}
else /*當a<b時的處理*/
for(i=0;i<k;i++)
{
if(b[i]<a[i])
{ b[i+1]--;
b[i]+=10;
}
c[i]=b[i]-a[i];
}
while(!c[k-1]&&k>1) k--; /*判斷最後結果的位數*/
if(q&&(fa>0&&f||fa<0&&!f)||fa>0&&(fb>0&&!f||f&&!q)) printf("-"); /*如果f為真是輸出負號*/
for(i=k-1;i>=0;i--) printf("%d",c[i]);
return;
}
else addition(a,b,1);
}
void multiplication( int a[], int b[]) /*高精度乘法運算*/
{
int i, j, c[501] = {0},k;
k = an + bn - 1; /*用k紀錄結果的最大位數*/
for(i = 0; i < an; i++) /*高精度乘法運算過程*/
for(j = 0;j < bn; j++)
{
c[i+j] = a[i] * b[j] + c[i+j];
c[i+j+1] = c[i+j] / 10 + c[i+j+1];
c[i+j] = c[i+j] % 10;
}
while(!c[k]) k--; /*判斷最後結果的位數*/
if(fa*fb<0) printf("-");
for(i = k; i >= 0; i--) printf("%d",c[i]); /*輸出結果*/
}
main()
{
int a[250]={0},b[250]={0};
input(a,b);
printf("\n%s+%s=",b1,b2);addition(a,b,0);
printf("\n%s-%s=",b1,b2);subtraction(a,b,0);
printf("\n%s*%s=",b1,b2);multiplication(a,b);
getch();
}
1、 高精度除以低精度;
演算法:按照從高位到低位的順序,逐位相除。在除到第j位時,該位在接受了來自第j+1位的余數後與除數相除,如果最高位為零,則商的長度減一。源程序如下:
#include <stdio.h>
#define N 500
main()
{
int a[N] = {0}, c[N] = {0};
int i, k, d, b;
char a1[N];
printf("Input 除數:");
scanf("%d", &b);
printf("Input 被除數:");
scanf("%s", a1);
k = strlen(a1);
for(i = 0; i < k; i++) a[i] = a1[k - i - 1] - '0';
d = 0;
for(i = k - 1; i >= 0 ; i--)
{
d = d * 10 + a[i];
c[i] = d / b;
d = d % b;
}
while(c[k - 1] == 0 && k > 1) k--;
printf("商=");
for(i = k - 1; i >= 0; i--) printf("%d", c[i]);
printf("\n余數=%d", d);
}
2、高精度乘以高精度(要求用盡可能少的存儲單元);
演算法:用數組保存兩個高精度數,然後逐位相乘,注意考慮進位和總位數。源程序如下:
#include <stdio.h>
main()
{
int a[240] = {0}, b[240] = {0}, c[480] = {0};
int i, j, ka, kb, k;
char a1[240], b1[240];
gets(a1);
ka = strlen(a1);
gets(b1);
kb = strlen(b1);
k = ka + kb;
for(i = 0; i < ka; i++) a[i] = a1[ka-i-1] - '0';
for(i = 0; i < kb; i++) b[i] = b1[kb-i-1] - '0';
for(i = 0; i < ka; i++)
for(j = 0; j < kb; j++)
{
c[i + j] = c[i + j] + a[i] * b[j];
c[i + j +1] = c[i + j +1] + c[i + j]/10;
c[i + j] = c[i + j] % 10;
}
if(!c[k]) k--;
for(i = k-1; i >= 0; i--) printf("%d", c[i]);
}
3、高精度除以高精度(要求用盡可能少的存儲單元);
演算法:用計算機模擬手算除法,把除法試商轉化為連減。
#include <stdio.h>
#define N 500
int bj(int a[], int b[], int k1, int k2) /*比較大小函數*/
{
int i, t, flag; /*flag作標志位*/
if(k1 < k2)
flag = 0; /*被除數小於除數返回0*/
else if(k1 > k2)
flag = 1; /*被除數大於除數返回1*/
else
{ /*被除數和除數位數相等則逐位進行比較*/
i = k1;
t = 0;
while(t == 0 && i > 0)
{
if(a[i] > b[i]) {t = 1; flag = 1;}
else if(a[i] == b[i]) i--;
else {t = 1; flag = 0;}
}
if(i == 0 && t == 0) flag = 2; /*被除數等於除數返回2*/
}
return flag;
}
int jf(int a[], int b[], int k1, int k2) /*減法運算*/
{
int i, k, d[N];
for(i = 0; i < k2; i++) d[i] = b[i]; /*把除數賦給數組d*/
for(i = k2; i < N; i++) d[i] = 0; /*d數組無數據的高位置0*/
k = k1 - k2 - 1; /*計算減法起始位置*/
if(k < 0) k = 0;
if(k > 0)
{
for(i = k2 - 1; i >= 0; i--) d[i + k] = d[i]; /*移動減數位數與被減數對齊*/
for(i = 0; i < k; i++) d[i] = 0; /*移動後的其餘位置0*/
}
for(i = 0; i < k1; i++)
{
if(a[i] >= d[i]) a[i] -= d[i];
else
{
a[i + 1] = a[i + 1] - 1;
a[i] = 10 + a[i] - d[i];
}
}
return k;
}
main()
{
int a[N] = {0}, b[N] = {0}, c[N] = {0}, d[N] = {0};
int i, ka, kb, m, t, t1, t2, k, x, kd, kk;
char a1[N], b1[N];
printf("Input 被除數:");
scanf("%s", a1);
ka = strlen(a1);
for(i = 0; i < ka; i++) a[i] = a1[ka - i -1] - '0';
printf("Input 除數:");
scanf("%s", b1);
kb = strlen(b1);
for(i = 0; i < kb; i++) b[i] = b1[kb - i -1] - '0';
kd = ka; /*保存被除數位數 */
t2 = bj(a, b, ka, kb);
m = 0;
do
{
while(a[ka - 1] == 0) ka--;
t = bj(a, b, ka, kb);
if(t >= 1)
{
k = jf(a, b, ka, kb);
c[k]++;
if(k > m) m = k;
t1 = 0;
for(i = k; i <= m; i++)
{
x = c[i] + t1;
c[i] = x % 10;
t1 = x / 10;
}
if(t1 > 0) {m++; c[m] = t1; }
}
}while(t == 1);
if(t2 == 0)
{
printf("商=0");
printf("\n余數=");
for(i = kd - 1; i >= 0; i--) printf("%d", a[i]);
exit(1);
}
if(t2 == 2)
{
printf("商 = 1");
printf("\n余數 = 0");
exit(1);
}
kk = kd;
while(!c[kd - 1]) kd--;
printf("商 = ");
for(i = kd - 1; i >= 0; i--) printf("%d", c[i]);
while(!a[kk]) kk--;
printf("\n余數 = ");
if(kk < 0)
{
printf("0");
exit(1);
}
for(i = kk; i >= 0; i--) printf("%d", a[i]);
}
4、 N!,要求精確到P位(0〈P〈1000〉。
演算法:結果用數組a保存,開始時a[0]=1,依次乘以數組中各位,注意進位和數組長度的變化。源程序如下:
#include <stdio.h>
#define M 1000
main()
{
int a[M], i, n, j, flag = 1;
printf("n=");
scanf("%d",&n);
printf("n!=");
a[0] = 1;
for(i = 1; i < M; i++) a[i] = 0;
for(j = 2; j <= n; j++)
{
for(i = 0; i < flag; i++) a[i] *= j;
for(i = 0; i < flag; i++)
if(a[i] >= 10)
{
a[i+1] += a[i]/10;
a[i] = a[i] % 10;
if(i == flag-1) flag++;
}
}
for(j = flag - 1; j >= 0; j--)
printf("%d", a[j]);
}
問題1. 麥森數
【問題描述】形如2P-1的素數稱為麥森數,這時P一定也是個素數。但反過來不一定,即如果P是個素數,2P-1不一定也是素數。到1998年底,人們已找到了37個麥森數。最大的一個是P=3021377,它有909526位。麥森數有許多重要應用,它與完全數密切相關。
任務:從文件中輸入P(1000<P<3100000),計算2P-1的位數和最後500位數字(用十進制高精度數表示)
【輸入格式】
文件中只包含一個整數P(1000<P<3100000)
【輸出格式】
第一行:十進制高精度數2P-1的位數。
第2-11行:十進制高精度數2P-1的最後500位數字。(每行輸出50位,共輸出10行,不足500位時高位補0)
不必驗證2P-1與P是否為素數。
【輸入樣例】
1279
【輸出樣例】
386
演算法:2的冪可以轉化成左移運算,為了提高運算速度,可每次左移10位,即每次乘210。對於個位單獨考慮,每次左移一位。源程序如下:
#include <stdio.h>
#include <math.h>
#define MAX 100000
main()
{
int p;
int i, j;
scanf("%d", &p);
printf("%d\n", (int)(p * log10(2.0)) + 1);
long store[110] = {0};
store[0] = 1;
int left = p % 10;
p /= 10;
for(i = 1; i <= p; i++)
{
for(j = 0; j <= 100; j++)
store[j] <<= 10;
for(j = 0; j <= 100; j++)
{
if(store[j] >= MAX)
{
store[j + 1] += store[j] / MAX;
store[j] %= MAX;
}
}
}
for(i = 1; i <= left; i++)
{
for(j = 0; j <= 100; j++)
store[j] <<= 1;
for(j = 0; j <= 100; j++)
{
if(store[j] >= MAX)
{
store[j + 1] += store[j] / MAX;
store[j] %= MAX;
}
}
}
store[0] -= 1;
for(i = 1; i < 100; i++)
{
if(store[i - 1] < 0)
{
store[i] -= 1;
store[i - 1] += MAX;
}
else
break;
}
for(i = 99; i >= 0; i--)
{
printf("%05d", store[i]);
if((100 - i) % 10 == 0)
printf("\n");
}
}
問題2. 有一個正整數N(N可能達到120位),它是由若干個不大於65535的正整數相乘而得到的。請把這個數分解成素數因子(質因子)的乘積。
輸入:輸入文件只有一行為N的值。
輸出:(1)素數因子由小到大分行輸出;
(2)每一行輸出一個素數因子和該素數因子的個數,用一個空格分開;
(3)如果正整數N的分解中有一個以上的大於65535的素數,請按照(1)、(2)的要求輸出分解中的小於65535的素數後,在下一行輸出
「DATA ERROR!」。
演算法:先將2到65535之間的所有素數保存在數組中,用這個數去除數組中的每一個數,得到一個質因數就列印出來。源程序如下:
#include <stdio.h>
#include <math.h>
int length, temp[120];
int sushu(int a[])
{
int i, j, k = 0, m;
for(i = 2; i <= 65537; i++)
{
m = sqrt(i);
for(j = 2; j <= m; j++)
if(i % j == 0) break;
if(j > m)
{
a[k] = i;
k++;
}
}
return k;
}
int divide(int a[], int k)
{
int i, d = 0;
for(i = length - 1; i >= 0; i--)
{
d = d * 10 + a[i];
temp[i] = d / k;
d = d % k;
}
if(!d)
{
while(temp[length - 1] == 0 && length > 1) length--;
for(i = 0; i < length; i++)
{
a[i] = temp[i];
temp[i] = 0;
}
for(i = length; i < 120; i++) a[i] = 0;
}
else
for(i = 0; i < length; i++) temp[i] = 0;
return d;
}
main()
{
int i, k, s, d; /*s計數器; d余數*/
int a[6600], b[120] = {0}, c[120] = {0};
char b1[120];
gets(b1);
length = strlen(b1);
for(i = 0; i < length; i++) b[i] = b1[length - i - 1] - '0';
k = sushu(a);
for(i = 0; i < k; i++)
{
s = 0;
d = divide(b, a[i]);
while(!d)
{
s++;
d = divide(b, a[i]);
}
if(i == k - 1)
{
printf("Data Error!");
break;
}