精华内容
下载资源
问答
  • 除法可保留小数无限位./**/////////////////#include #include #include #include int cchkdig(char *r){int i=0;while(r[i]!='\0'){if(isdigit(r[i++])==0)return (0);}return (1);}//去掉整数串表示前面多余的零,...

    除法可保留小数无限位.

    /**/

    #include

    #include

    #include

    #include

    int cchkdig(char *r)

    {

    int i=0;

    while(r[i]!='\0')

    {

    if(isdigit(r[i++])==0)

    return (0);

    }

    return (1);

    }

    //去掉整数串表示前面多余的零,最后结果为空串时置为"0"

    void cdel0(char *r)

    {

    unsigned int lr;

    int i=0, j;

    lr=strlen(r);

    while(r[i]=='0')

    ++i;

    if(i>0)

    {

    for(j=0; j

    r[j]=r[j+i];

    for(j=lr-i; j

    {

    r[j]='\0';

    }

    }

    if(r[0]=='\0')

    {

    r[0]='0';

    }

    }

    int scmp(char *r, char *u)

    {

    unsigned int lr, lu;

    cdel0(r);

    cdel0(u);

    lr=strlen(r);

    lu=strlen(u);

    if(lr>lu)

    {

    return 1;

    }

    else if (lr

    {

    return -1;

    }

    return (strcmp(r, u));

    }//end scmp()

    //两个串表示数的减法

    char *ssub(char *r, char *u)

    {

    unsigned int i,lr, lu, lp,c=0;

    char h,hc;

    char *p;

    if(scmp(r, u)<0)

    return NULL;

    lr=strlen(r);

    lu=strlen(u);

    p=(char *)malloc((unsigned int)(lr+1)*sizeof(char));

    for(i=0; i

    {

    h=r[lr-i-1]-u[lu-i-1]-c;

    if(h<0)

    {

    c=1;

    h=h+10;

    }

    else

    c=0;

    p[i]=h+'0';

    hc=h+'0';

    }

    for (i=lu; i

    {

    h=r[lr-i-1]-'0'-c;

    if(h<0)

    {

    c=1;

    h=h+10;

    }

    else

    c=0;

    p[i]='0'+h;

    hc='0'+h;

    }

    p[i]='\0';

    lp=i-1;

    while(p[lp]=='0'&&lp!=0)

    {

    p[lp]='\0';

    lp--;

    }

    for(i=0; i

    {

    hc=p[i];

    p[i]=p[lp-i];

    p[lp-i]=hc;

    }

    return (p);

    }//end ssub()

    /*

    //两个串表示数的加法

    char *sadd(char *r, char *u)

    {

    unsigned int lr, lu, lp;

    int i, h, c=0;

    char hc, *p;

    lr=strlen(r);

    lu=strlen(u);

    if(lu>lr)

    {

    p=r;

    r=u;

    u=p;

    h=lr;

    lr=lu;

    lu=h;

    }

    p=(char *)malloc((unsigned int)(lr+2)*sizeof(char));

    for(i=0; i

    {

    h=r[lr-i-1]-'0'+u[lu-i-1]-'0'+c;

    if(h>9)

    {

    c=1;

    h=h-10;

    }

    else

    c=0;

    p[i]=h+'0';

    }

    for(i=lu; i

    {

    h=r[lr-i-1]-'0'+c;

    if(h>9)

    {

    c=1;

    h=h-10;

    }

    else

    c=0;

    p[i]='0'+h;

    }

    if(c>0)

    {

    p[i]=c+'0';

    lp=i;

    }

    else

    lp=i-1;

    for(i=lp+1; i

    p[i]='\0';

    for(i=0; i

    展开全文
  • C语言大数四则运算

    2015-01-29 11:23:00
    /**/////////////////#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> /*int cchkdig(char *r) { int i=0; while(r[i]!='\0') { if(...
    1. /**/
    2. #include <stdio.h>
    3. #include <stdlib.h>
    4. #include <string.h>
    5. #include <ctype.h>
    6. /*int cchkdig(char *r)
    7. {
    8. int i=0;
    9. while(r[i]!='\0')
    10. {
    11. if(isdigit(r[i++])==0)
    12. return (0);
    13. }
    14. return (1);
    15. } */
    16. void del_0(char *r) //去掉整数串表示前面多余的零,最后结果为空串时置为"0"
    17. {
    18. unsigned int lr;
    19. int i=0, j;
    20. lr=strlen(r);
    21. while(r[i]=='0')
    22. ++i;
    23. if(i>0)
    24. {
    25. for(j=0; j<lr-i; ++j)
    26. r[j]=r[j+i];
    27. for(j=lr-i; j<lr; ++j)
    28. {
    29. r[j]='\0';
    30. }
    31. }
    32. if(r[0]=='\0')
    33. {
    34. r[0]='0';
    35. }
    36. }
    37. int scmp(char *r, char *u) //比较长度
    38. {
    39. unsigned int lr, lu;
    40. del_0(r);
    41. del_0(u);
    42. lr=strlen(r);
    43. lu=strlen(u);
    44. if(lr>lu)
    45. {
    46. return 1;
    47. }
    48. else if (lr<lu)
    49. {
    50. return -1;
    51. }
    52. return (strcmp(r, u));
    53. }
    54. char *sub(char *r, char *u) //两个串表示数的减法
    55. {
    56. unsigned int i,lr, lu, lp,c=0;
    57. char h,hc;
    58. char *p;
    59. if(scmp(r, u)<0) //r比u大
    60. return NULL;
    61. lr=strlen(r);
    62. lu=strlen(u);
    63. p=(char *)malloc((unsigned int)(lr+1)*sizeof(char));
    64. for(i=0; i<lu; ++i)
    65. {
    66. h=r[lr-i-1]-u[lu-i-1]-c;
    67. if(h<0)
    68. {
    69. c=1;
    70. h=h+10;
    71. }
    72. else
    73. c=0;
    74. p[i]=h+'0';
    75. hc=h+'0';
    76. }
    77. for (i=lu; i<lr; ++i)
    78. {
    79. h=r[lr-i-1]-'0'-c;
    80. if(h<0)
    81. {
    82. c=1;
    83. h=h+10;
    84. }
    85. else
    86. c=0;
    87. p[i]='0'+h;
    88. hc='0'+h;
    89. }
    90. p[i]='\0';
    91. lp=i-1;
    92. while(p[lp]=='0'&&lp!=0)
    93. {
    94. p[lp]='\0';
    95. lp--;
    96. }
    97. for(i=0; i<(lp+1)/2; ++i)
    98. {
    99. hc=p[i];
    100. p[i]=p[lp-i];
    101. p[lp-i]=hc;
    102. }
    103. return (p);
    104. }//end sub()
    105. char *add(char *r, char *u) //两个串表示数的加法
    106. {
    107. unsigned int lr, lu, lp;
    108. int i, h, c=0;
    109. char hc, *p;
    110. lr=strlen(r);
    111. lu=strlen(u);
    112. if(lu>lr)
    113. {
    114. p=r;
    115. r=u;
    116. u=p;
    117. h=lr;
    118. lr=lu;
    119. lu=h;
    120. }
    121. p=(char *)malloc((unsigned int)(lr+2)*sizeof(char));
    122. for(i=0; i<lu; ++i)
    123. {
    124. h=r[lr-i-1]-'0'+u[lu-i-1]-'0'+c;
    125. if(h>9)
    126. {
    127. c=1;
    128. h=h-10;
    129. }
    130. else
    131. c=0;
    132. p[i]=h+'0';
    133. }
    134. for(i=lu; i<lr; ++i)
    135. {
    136. h=r[lr-i-1]-'0'+c;
    137. if(h>9)
    138. {
    139. c=1;
    140. h=h-10;
    141. }
    142. else
    143. c=0;
    144. p[i]='0'+h;
    145. }
    146. if(c>0)
    147. {
    148. p[i]=c+'0';
    149. lp=i;
    150. }
    151. else
    152. lp=i-1;
    153. for(i=lp+1; i<lr+2; ++i)
    154. p[i]='\0';
    155. for(i=0; i<(lp+1)/2; ++i)
    156. {
    157. hc=p[i];
    158. p[i]=p[lp-i];
    159. p[lp-i]=hc;
    160. }
    161. return (p);
    162. }//end add()
    163. char *mul(char *r, char *u) //两个串表示数的乘法
    164. {
    165. unsigned int lr, lu, lp;
    166. int i, j, c, h;
    167. char *p;
    168. lr=strlen(r);
    169. lu=strlen(u);
    170. p=(char *)malloc((unsigned int)(lr+lu+1)*sizeof(char));
    171. for(i=0; i<lr+lu; ++i)
    172. p[i]='0';
    173. p[lr+lu]='\0';
    174. for(i=lr-1; i>=0; --i)
    175. {
    176. c=0;
    177. for(j=lu-1; j>=0; --j)
    178. {
    179. lp=i+j+1;
    180. h=(r[i]-'0')*(u[j]-'0')+p[lp]-'0'+c;
    181. c=h/10;
    182. h=h%10;
    183. p[lp]=h+'0';
    184. }
    185. if(c>0)p[i+j+1]=c+'0';
    186. }
    187. del_0(p);
    188. return p;
    189. }//end mul()
    190. char *div(char *u, char *v, int n) //两个串表示数的除法,结果精确到小数点后第n位
    191. {
    192. char *p, *f, *r,*q;
    193. unsigned int i, lu, lv, lr, iw, c, h;
    194. int kh, j;
    195. lu=strlen(u);
    196. lv=strlen(v);
    197. f=(char *)malloc((unsigned int)(lu+n+3)*sizeof(char));
    198. q=(char *)malloc(sizeof(char));
    199. for(i=0; i<lu+n+3; ++i)
    200. f[i]='\0';
    201. r=(char *)malloc((unsigned int)(lv+2)*sizeof(char));
    202. for(i=0; i<lv+2; ++i)
    203. r[i]='\0';
    204. for(iw=0; iw<lu+n+2; ++iw)
    205. {
    206. if(iw<lu)
    207. {
    208. del_0(r);
    209. lr=strlen(r);
    210. r[lr]=u[iw];
    211. r[lr+1]='\0';
    212. }
    213. else if(iw>lu)
    214. {
    215. del_0(r);
    216. q[0]='0';
    217. if(scmp(r, q)==0)
    218. {
    219. break;
    220. }
    221. lr=strlen(r);
    222. r[lr]='0';
    223. r[lr+1]='\0';
    224. }
    225. else
    226. {
    227. f[lu]='.';
    228. continue;
    229. }
    230. kh=0;
    231. while(scmp(r, v)>=0)
    232. {
    233. p=r;
    234. r=sub(p, v);
    235. ++kh;
    236. }
    237. f[iw]=kh+'0';
    238. }
    239. if(iw==lu+n+2)
    240. {
    241. if(f[lu+n+1]>='5')
    242. {
    243. f[lu+n+1]='\0';
    244. c=1;
    245. for(j=lu+n; j>=0; --j)
    246. {
    247. if(c==0)
    248. {
    249. break;
    250. }
    251. if(f[j]=='.')
    252. {
    253. continue;
    254. }
    255. h=f[j]-'0'+c;
    256. if(h>9)
    257. {
    258. h=h-10;
    259. c=1;
    260. }
    261. else
    262. c='\0';
    263. f[j]=h+'0';
    264. }
    265. }
    266. else
    267. f[lu+n+1]='\0';
    268. }
    269. free(r);
    270. free(p);
    271. q=NULL;
    272. free(q);
    273. del_0(f);
    274. return(f);
    275. }//end div()
    276. /*
    277. //两个串表示数的除法,结果分别用整商与余数表示
    278. char *sdivkr(char *u, char *v, char **rout)
    279. {
    280. char *f, *r;
    281. unsigned int i, lu, lv, lr, iw;
    282. int kh;
    283. lu=strlen(u);
    284. lv=strlen(v);
    285. f=(char *)malloc((unsigned int)(lu+1)*sizeof(char));
    286. for(i=0; i<lu+1; ++i) f[i]='\0';
    287. r=(char *)malloc((unsigned int)(lv+2)*sizeof(char));
    288. for(i=0; i<lv+2; ++i) r[i]='\0';
    289. for(iw=0; iw<lu; ++iw)
    290. {
    291. del_0(r);
    292. lr=strlen(r);
    293. r[lr]=u[iw];
    294. r[lr+1]='\0';
    295. kh=0;
    296. while(scmp(r, v)>=0)
    297. {
    298. r=sub(r, v);
    299. ++kh;
    300. }
    301. f[iw]=kh+'0';
    302. }
    303. del_0(r);
    304. *rout=r;
    305. del_0(f);
    306. return(f);
    307. }//end *sdivkr()
    308. */
    309. /*调用上述函数实现两任意长正整数任意指定精度的算术计算器程序
    310. void main(int argc, char *argv[])
    311. {
    312. char *p, *r;
    313. int n;
    314. if(argc!=4)
    315. {
    316. if(argc!=3)
    317. printf("\n>>\"order n1 op n2\" or n ! ");
    318. exit(0);
    319. }
    320. del_0(argv[1]);
    321. if(cchkdig(argv[1])==0)
    322. {
    323. printf("Input data error, Input again!");
    324. exit(0);
    325. }
    326. del_0(argv[3]);
    327. if(cchkdig(argv[3])==0)
    328. {
    329. printf("Input data error, Input again!");
    330. exit(0);
    331. }
    332. if(strcmp(argv[2], "+")==0)
    333. {
    334. printf("%s", p=add(argv[1], argv[3]));
    335. free(p);
    336. }
    337. else if(strcmp(argv[2], "-")==0)
    338. {
    339. printf("%s", p=sub(argv[1], argv[3]));
    340. free(p);
    341. }
    342. else if(strcmp(argv[2], "*")==0)
    343. {
    344. printf("%s", p=mul(argv[1], argv[3]));
    345. free(p);
    346. }
    347. else if(argv[2][0]=='/' && strlen(argv[2])==1)
    348. {
    349. if(argv[3][0]=='0')
    350. {
    351. printf("error!devided by zero!!\n");
    352. exit(0);
    353. }
    354. p=sdivkr(argv[1], argv[3], &r);
    355. printf("k=%s r=%s", p, r);
    356. free(p);
    357. free(r);
    358. }
    359. else
    360. if(argv[2][0]=='/'&&strlen(argv[2])>1)
    361. {
    362. if(argv[3][0]=='0')
    363. {
    364. printf("error!devided by zero!!\n");
    365. exit(0);
    366. }
    367. argv[2][0]='\0';
    368. del_0(argv[2]);
    369. if(cchkdig(argv[2])==0)
    370. {
    371. printf("Input data error, Input again!");
    372. exit (0);
    373. }
    374. n=atoi(argv[2]);
    375. printf("%s", p=div(argv[1], argv[3], n));
    376. free(p);
    377. }
    378. } */
    379. char a[200000];
    380. int main()
    381. {
    382. //freopen("read.txt", "r", stdin);
    383. int n;
    384. scanf("%d", &n);
    385. while(n--)
    386. {
    387. memset(a, '\0', sizeof(a));
    388. char b[200] = {"0"};
    389. while(~scanf("%s", a) && a[0] != 0)
    390. {
    391. strcpy(b, add(a, b));
    392. }
    393. printf("%s\n", b);
    394. if(n!=0) printf("\n");
    395. }
    396. return 0;
    397. }

        




    附件列表

     

    转载于:https://www.cnblogs.com/sober-reflection/p/1bcdc370a0830eb0727da1c9ab766cbf.html

    展开全文
  • } if(num1->minus * num2->minus ) //符号不同,执减法 { if(i==0) //两数相等 { //结果长度为一位数,就是数值0 result->digit =1; result->num[0]=0; //结果值为0 result->minus =1; //结果设为正号 return; //...

    #include

    #include

    #include

    typedef struct bigint

    {

    char *num; //指向长整数数组(序号0中保存着最高位)

    char minus; //符号(1表示正数,-1表示负数)

    int digit; //保存该数的位数(实际位数)

    }BIGINT, *pBIGINT;

    void BigIntTrans(pBIGINT num1) //将字符串转为数字表示

    {

    char *temp; //临时数组

    int i,k,len;

    len=strlen(num1->num); //字符串长度

    //分配内存

    if(!(temp = (char *)malloc(sizeof(char)* len)))

    {

    printf("内存分配失败!\n");

    exit(0);

    }

    i=0;

    num1->minus=1; //保存为正数

    if(num1->num[0]=='-') //判断是否为负数

    {

    num1->minus=-1;

    i++;

    }

    k=0; //数字位数计数器

    while(num1->num[i]!='\0') //字符串未结束

    {

    if(num1->num[i]>='0' && num1->num[i] <='9') //数字为0~9

    //将ASCII码转换为对应数字

    temp[k]=num1->num[i]-'0';

    k++;

    }

    i++;

    }

    for(i=0;idigit;i++) //清空数组各元素

    num1->num[i]=0;

    num1->digit=k; //转换后的数据位数

    for(i=0,k--;k>=0;k--,i++) //将临时数组各位置反置保存到数组num中

    num1->num[i]=temp[k];

    BigIntTrim(num1); //整理输入的大整数

    }

    void BigIntTrim(pBIGINT num1) //整理大整数,去掉前面多余的0

    {

    int i;

    for(i=num1->digit-1;i>=0;i--) //从高位检查是否为0

    {

    if(num1->num[i] !=0) //遇到不为0的最高位

    break; //跳出循环

    }

    if(i<0) //若余数全部为0

    {

    num1->digit=1; //设置余数位数为1

    num1->num[0]=0;

    }else

    num1->digit=i+1; //余数位数

    }

    void BigIntPrint(pBIGINT result) //输出大整数

    {

    int j;

    if(result->minus ==-1) //是负数

    printf("-"); //输出负数

    //若大整数为0

    if(result->digit ==1 &&result->num[0]==0)

    printf("0");

    else //不为0

    {

    //从高位到低位输出

    for(j=result->digit-1;j>=0;j--)

    printf("%d",result->num[j]);

    }

    }

    int BigIntEqual(pBIGINT num1,pBIGINT num2) //比较绝对值大小

    {

    int i;

    //num1的位数大于num2

    if(num1->digit>num2->digit)

    return 1;

    //num1的位数小于num2

    else if(num1->digitdigit)

    return -1;

    else //两数位数相等

    {

    i=num1->digit-1; //num1的数据位数

    while(i>=0) //从高位向地位比

    {

    //num1对应位大于num2

    if(num1->num[i]>num2->num[i])

    return 1;

    //num1对应位小于num2

    else if(num1->num[i]num[i])

    return -1;

    else //比较下一位

    i--;

    }

    }

    return 0; //相等

    }

    void BigIntAdd(pBIGINT num1,pBIGINT num2,pBIGINT result)

    {

    int i;

    i=BigIntEqual(num1,num2); //比较两数绝对值大小

    if(i<0) //num1绝对值小于num2

    {

    pBIGINT temp;

    temp=num1; //交换两数

    num1=num2;

    num2=temp;

    }

    if(num1->minus * num2->minus <0) //符号不同,则执减法

    {

    if(i==0) //两数相等

    {

    //结果长度为一位数,就是数值0

    result->digit =1;

    result->num[0]=0; //结果值为0

    result->minus =1; //结果设为正号

    return; //返回

    }

    //调用相减函数完成异号相加

    BigIntSub1(num1,num2,result);

    }else

    //调用相加函数完成同号相加

    BigIntAdd1(num1,num2,result);

    }

    void BigIntAdd1(pBIGINT num1,pBIGINT num2,pBIGINT result)

    {

    int i,carry;

    carry=0; //清除进位

    result->minus =num1->minus; //保存符号

    //将被加数复制到结果数组中

    for(i=0;idigit;i++)

    result->num[i]=num1->num[i];

    //num2中的数小,可能位数也少些

    for(i=0;idigit;i++)

    {

    //将对应位的数和进位数相加

    result->num[i]=result->num[i]+num2->num[i]+carry;

    carry=result->num[i]/10; //计算进位数据

    result->num[i]=result->num[i]%10; //保留一位

    }

    if(carry) //若最后还有进位

    result->num[i]=result->num[i]+carry;

    BigIntTrim(result); //整理结果

    }

    //减法函数

    void BigIntSub(pBIGINT num1,pBIGINT num2,pBIGINT result)

    {

    num2->minus =-1 * num2 ->minus; //将减数的符号取反

    BigIntAdd(num1,num2,result); //调用加法函数

    }

    //异号相减函数

    void BigIntSub1(pBIGINT num1,pBIGINT num2,pBIGINT result)

    {

    int i,borrow;

    result->minus =num1->minus; //结果符号

    borrow=0;

    //将被减数的内容复制到结果中

    for(i=0;idigit;i++)

    result->num[i]=num1->num[i];

    for(i=0;i<=num2->digit;i++)

    {

    //num1减去num2,并减去低位的借位

    result->num[i]=result->num[i]-num2->num[i]-borrow;

    if(result ->num[i]<0) //若为负数

    {

    result->num[i]=10+result->num[i]; //向高位借位

    borrow=1; //设置借位数

    }else

    borrow=0;

    }

    if(borrow==1)

    result->num[i]=result->num[i]-borrow;

    i=num1->digit;

    while(i>0)

    {

    if(result->num[i]==0)

    i--;

    else

    break;

    }

    result->digit=i+1; //保存结果位数

    BigIntTrim(result); //整理结果

    }

    void BigIntMul(pBIGINT num1,pBIGINT num2,pBIGINT result)

    {

    char carry,temp;

    int i,j,pos;

    //结果数组和中间数清0

    for(i=0;idigit+num2->digit;i++)

    result->num[i]=0;

    //用乘数的每一位乘以被乘数

    for(i=0;idigit;i++)

    {

    carry=0; //清除进位

    //被乘数的每一位

    for(j=0;jdigit;j++)

    {

    //相乘并加上进位

    temp=num2->num[i] * num1->num[j]+carry;

    //计算进位carry

    carry =temp/10;

    //计算当前位的值

    temp=temp%10;

    pos=i+j;

    //计算结果累加到临时数组中

    result->num[pos]+=temp;

    carry=carry+result->num[pos]/10; //计算进位

    result->num[pos]=result->num[pos]%10;

    }

    if(carry>0)

    {

    result->num[i+j]=carry; //加上最高位进位

    result->digit=i+j+1; //保存结果位数

    }else

    result->digit=i+j; //保存结果位数

    }

    result->minus=num1->minus * num2->minus; //结果的符号

    }

    void BigIntDiv(pBIGINT num1,pBIGINT num2,pBIGINT result,pBIGINT residue)

    //除法函数

    {

    BIGINT quo1,residol,quo2;

    int i,j,k,m; //k保存试商结果,m保存商的位数

    char t;

    result->minus = num1->minus * num2->minus; //商的符号

    //分配余数的内存空间

    residue->num =(char *)malloc(sizeof(char) * num2->digit);

    for(i=0;idigit;i++) //将余数全部清0

    residue->num[i]=0;

    m=0;

    for(i=num1->digit-1;i>=0;i--)

    {

    //重新设置余数的位数比除数多一位

    residue->digit=num2->digit+1;

    for(j=num2->digit-1;j>0;j--) //移余数

    residue->num[j]=residue->num[j-1];

    //复制被除数中的一位到余数的最低位中

    residue->num[0]=num1->num[i];

    BigIntTrim(residue); //整理余数

    k=0; //试商

    //比较余数与除数的大小

    while(BigIntEqual(residue,num2)>=0)

    {

    BigIntSub1(residue,num2,residue); //用余数减去除数,差值保存在余数中

    k++; //试商加1

    }

    result->num[m++]=k; //保存商

    }

    result->digit=m; //保存商的位数

    for(i=0;i

    {

    t=result->num[i];

    result->num[i]=result->num[m-1-i];

    result->num[m-1-i]=t;

    }

    BigIntTrim(result); //整理商

    BigIntTrim(residue); //整理余数

    }

    int main()

    {

    //参与运算的数,结果,余数

    BIGINT num1,num2,result,residue;

    int i=0,len;

    char op;

    printf("输入最大数的位数:");

    scanf("%d",&len);

    if(!(num1.num=(char *)malloc(sizeof(char) * (len+1))) )

    {

    printf("内存分配失败!\n");

    exit(0);

    }

    num1.digit=len +1;

    if(!(num2.num=(char *)malloc(sizeof(char) * (len +1))))

    {

    printf("内存分配失败!\n");

    exit(0);

    }

    num2.digit=len+1;

    if(!(result.num=(char *)malloc(sizeof(char) * (2*len +1))))

    {

    printf("内存分配失败!\n");

    exit(0);

    }

    result.digit=2*len+1;

    for(i=0;i

    result.num[i]=0;

    printf("选择大整数的运算(+,-,*,/):");

    fflush(stdin);

    scanf("%c",&op);

    switch(op)

    {

    case '+':

    printf("\n输入被加数:");

    scanf("%s",num1.num);

    printf("\n输入加数:");

    scanf("%s",num2.num);

    BigIntTrans(&num1);

    BigIntTrans(&num2);

    BigIntAdd(&num1,&num2,&result); //加法

    break;

    case '-':

    printf("\n输入被减数:");

    scanf("%s",num1.num);

    printf("\n输入减数:");

    scanf("%s",num2.num);

    BigIntTrans(&num1);

    BigIntTrans(&num2);

    BigIntSub(&num1,&num2,&result); //减法

    break;

    case '*':

    printf("\n输入被乘数:");

    scanf("%s",num1.num);

    printf("\n输入乘数:");

    scanf("%s",num2.num);

    BigIntTrans(&num1);

    BigIntTrans(&num2);

    BigIntMul(&num1,&num2,&result); //乘法

    break;

    case '/':

    printf("\n输入被除数:");

    scanf("%s",num1.num);

    printf("\n输入除数:");

    scanf("%s",num2.num);

    BigIntTrans(&num1);

    BigIntTrans(&num2);

    if(num2.digit==1 && num2.num[0]==0) //大整数为0

    printf("除数不能为0!\n");

    else

    BigIntDiv(&num1,&num2,&result,&residue); //除法

    break;

    }

    if(op=='/')

    {

    //为除法且除数不为0

    if(!(num2.digit==1 && num2.num[0]==0))

    {

    printf("商:");

    BigIntPrint(&result);

    printf("\t余数:");

    BigIntPrint(&residue);

    }

    }else

    {

    printf("结果:");

    BigIntPrint(&result);

    }

    getch();

    return 0;

    }

    展开全文
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼#include#include#define s 100000 int add(char a[],char b[],int x){int i,j=0;int ADD;for(i=s-1;i>=s-x;i--){ADD=a[i]-'0'+b[i]-'0';if(ADD>...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

    #include

    #include

    #define s 100000 int add(char a[],char b[],int x)

    {int i,j=0;

    int ADD;

    for(i=s-1;i>=s-x;i--)

    {ADD=a[i]-'0'+b[i]-'0';

    if(ADD>=10)

    {a[i]=ADD-10+'0';

    a[i-1]++;

    if(i==s-x)

    j=1;

    }

    else

    a[i]=ADD+'0';

    }

    if(j)

    {x++;}

    return x;}

    int jianfa(char a[],char b[],int x,int y)/*减法*/

    {int i,j=0;

    int ADD;

    if(x>y)

    {for(i=s-1;i>=s-x;i--)

    {ADD=(a[i]-'0')-(b[i]-'0');

    if(ADD>=0)

    a[i]=ADD+'0';

    else

    {a[i]=ADD+10+'0';

    a[i-1]--;}

    if(a[s-x]=='0')

    x--;}

    return x;

    }

    else if(x

    {for(i=s-1;i>=s-y;i--)

    {ADD=(b[i]-'0')-(a[i]-'0');

    if(ADD>=0)

    b[i]=ADD+'0';

    else

    {b[i]=ADD+10+'0';

    b[i-1]--;}}

    for(i=s-1;i>=s-y;i--)

    a[i]=b[i];

    printf("-");

    return y;

    }

    else

    {

    while(a[s-x]==b[s-y])

    {

    a[s-x]='0';

    b[s-y]='0';

    x--;y--;

    if(x==0&&y==0)

    return 1; }

    if(a[s-x]>b[s-y])

    {for(i=s-1;i>=s-x;i--)

    {ADD=(a[i]-'0')-(b[i]-'0');

    if(ADD>=0)

    a[i]=ADD+'0';

    else

    {a[i]=ADD+10+'0';

    a[i-1]--;}

    if(a[s-x]=='0')

    x--;}

    return x;}

    else if(a[s-x]

    {for(i=s-1;i>=s-y;i--)

    {ADD=(b[i]-'0')-(a[i]-'0');

    if(ADD>=0)

    b[i]=ADD+'0';

    else

    {b[i]=ADD+10+'0';

    b[i-1]--;} }

    for(i=s-1;i>=s-y;i--)

    a[i]=b[i];

    printf("-");

    return y;

    } }

    return 1;} int chengfa(char a[],char b[],int x,int y)

    {

    int i,j,k;

    char c[s];

    for(k=0;k

    c[k]=0;

    for(j=0;j

    {

    for(i=0;i

    {

    c[i+j]+=(a[s-i-1]-'0')*(b[s-j-1]-'0');

    if(c[i+j]>=10)

    {

    c[i+j+1]+=(c[i+j])/10;

    c[i+j]=(c[i+j])%10; }

    }

    }

    for(i=0;i

    a[i]=c[i];

    i=x+y-1;

    while(1)

    {

    if(c[i--]!=0)break;}

    i++; return i;

    } int qiuyu(char a[],char b[],int x,int y)/*求余*/

    {

    int n,l,i;

    if(x

    {printf("0\n");return 0;}

    else if(x==y)

    {while(a[s-x]==b[s-y])

    {x--;y--;

    if(x==0)

    {printf("0\n");return 0;}

    }

    if(a[s-x]

    {l=s-x;

    while(l

    printf("%c",a[l++]);

    printf("\n");

    return 0;}

    else if(a[s-x]>b[s-y])

    {i=(a[s-x]-'0')/(b[s-x]-'0');

    for(l=0;l

    n=jianfa(a,b,x,y);

    l=s-n;

    while(l

    printf("%c",a[l++]);

    printf("\n");

    return 0;}

    }

    else if(x>y)

    {while(x!=y)

    {

    for(i=s-1;i>=s-x;i--)

    {n=(a[i]-'0')-(b[i]-'0');

    展开全文
  • C语言实现大数四则运算

    千次阅读 2019-03-21 15:23:34
    C语言实现大数四则运算 一、简介 众所周知,C语言中INT类型是有限制,不能进行超过其范围的运算,而如果采用float类型进行运算,由于float在内存中特殊的存储形式,又失去了计算的进度。要解决整个问题,一种...
  • c语言实现的大数四则运算
  • 本人最近学习大数四则运算,用C语言实现后上传供大家参考 包含加减乘除四则运算
  • C语言/C++实现大数四则运算 大数加法运算、大数减法运算、大数乘法运算、大数除法运算
  • 大数四则运算,DH算法C语言实现
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼#include#include#define s 100000 int add(char a[],char b[],int x){int i,j=0;int ADD;for(i=s-1;i>=s-x;i--){ADD=a[i]-'0'+b[i]-'0';if(ADD>...
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼#include#include#define s 100000 int add(char a[],char b[],int x){int i,j=0;int ADD;for(i=s-1;i>=s-x;i--){ADD=a[i]-'0'+b[i]-'0';if(ADD>...
  • 大数四则运算C语言实现)

    千次阅读 2019-07-08 15:01:49
    大数加法 /***TOJ1112***/ #include<stdio.h> #include<string.h> #include<stdlib.h> #define maxn 10005 char num1[maxn], num2[maxn]; int _num1[maxn], _num2[maxn]; int _max(int a, int ...
  • 大数四则运算

    2012-04-21 21:17:24
    c语言编写的关于大数四则运算的程序,便于理解
  • c语言 整数四则运算

    千次阅读 2020-07-19 15:19:17
    整数四则运算 计算2个正整数的和、差、积、商并输出。题目保证输入和输出全部在整型范围内。 输入格式: 输入在一行中给出2个正整数A和B。 输出格式: 在4行中按照格式“A 运算符 B = 结果”顺序输出和、差、积、商。 ...
  • C语言大数运算-大数运算库篇

    千次阅读 2017-04-04 16:38:26
    通过前面的3篇文章我们已经实现了大数四则运算,本篇博客我们会把这是几个个方法做成一个库文件,可以供自己日后使用。细心的读者可能意到了,每个程序都引用了big.h但是都被注释掉了。big.h就是头文件只要将函数的...
  • 大数四则运算 双链表法,满足广大学生的课设要求,强有力的堵住老师提问的嘴
  • 论文:大数四则运算的C++实现.mht 网上下载的
  • 大数四则运算C语言

    千次阅读 2007-04-17 22:27:00
    完全按照自己的想法做的,所以不太成熟,希望有兴趣的朋友提出意见! #include#include//最大数长度#define MAX 200//读入输入的大整数,a[0]存储大整数的长度void read(int *a){ unsigned int i,len;...
  • 便于采用合理的运算方式 for (i = 0 ; i; i++) { // 初始化 num[i] = 0 ; num1[i] = 0 ; num2[i] = 0 ; } for (i = strlen(ch1) - 1 , j = 0 ; i >= 0 ; i-- ) num1[j ++] = ch1[i] - ' 0 ' ...
  • 大数四则运算的C++实现[摘要] 大数运算不仅仅运用在密码学中,还运用在一些物理学研究、生物学,化学等科目中。大数运算,意味着参加的值和计算结果通常是以上百位数,上千位数以及更大长度之间的整数运算。例如...
  • //循环数组接受大数 n=i+1; i++; //n是长度 } while(a[i]); for(i=n;i;i++) a[i]=0; */ head1=(LinkList*)malloc(sizeof(LinkList)); head1->next=NULL; for(i=0;idata=a[i]; s->data=a[i]-'0'; //printf("%d",s->...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,798
精华内容 719
关键字:

c语言大数四则运算

c语言 订阅