C语言大数四则运算

  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. }

来自为知笔记(Wiz)

附件列表

时间: 2024-11-15 01:08:55

C语言大数四则运算的相关文章

大数四则运算之加法运算--------C语言版(未考虑负数)

/* 声明两个字符数组,用于存储大数,声明两个整数型数组便于计算,将字符数组中的元素转换为对应整数存于整数数组中,将低位放在整数数组低位,便于对齐计算 判断是否有进位,计算结果高位先输出,从数组后往前找,找到第一个不为0的数,可以设置一个标志位.*/ #include<stdio.h>#include<string.h> int main(){ int num1[1000],num2[1000],i,j,max; char ch1[1000],ch2[1000]; int flag

C语言实现四则运算的生成器

该四则运算生成器前期只有简单的功能,全部代码均是小编自己编写,用的是C语言工具是VS2013,只支持windows平台运行.由用户界面但无图形化界面. 功能目前只有两个,一是在cmd窗口中显示随机生成50道计算题,有四列整齐排布,用户可以控制上下左右来移动光标到每道题的等号后面来答题,答完一道题之后可以回车到下一道题,最后打完键入q退出并显示每道题的答案和用户的答案.二是随机生成四则运算,但并无答题功能. 有用户界面,原来计划实现5个功能,分别是单一的加减乘除,最后一个是50道题中随机的生成加减

C语言 &#183; 大数加法

算法提高 大数加法 时间限制:1.0s   内存限制:256.0MB 问题描述 输入两个正整数a,b,输出a+b的值. 输入格式 两行,第一行a,第二行b.a和b的长度均小于1000位. 输出格式 一行,a+b的值. 样例输入 42 样例输出 6 1 #include<stdio.h> 2 #include<string.h> 3 int main() 4 { 5 char a[1001],b[1001]; 6 int s[1001],d[1001]; 7 scanf("

c语言-大数乘法(16进制)

由来 由于工作中用到,自己在网上找了一些大数乘法源码,都没有符合我要求的.所以自己实现了一个. 分析过程 仿照我们小学学过的10进制乘法算式,来实现的大数乘法. 先举一个例子:234 * 567 这是我们最普通的乘法算式,对于程序实现起来还有点难,因此我们再继续计算分析: (注:图中的小数字,不是次方,只是进位的数) 这个计算过程跟上图的区别就是加法跟乘法分开来计算,我在做乘法部分的时候,只是单纯的计算乘法,没有做加法,把进位的数标记出来,最后把在同一列的数字统统加起来,该进位的进位,最后起算出

C语言大数运算

1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #define max 100//数字位数 5 void add(char *s1,char *s2)//两位大于0的数字加法 6 { 7 int mun1[max+1]={0},mun2[max+1]={0},m,n,i=0,j=0; 8 m=strlen(s1)-1; 9 n=strlen(s2)-1; 10 for (i=0;m&g

实验1--用C语言编程四则运算

#include<stdio.h>#include<stdlib.h>#include <time.h>#define N 30main(){int a,b,k,i,n;float c,d;srand(time(NULL));do{printf("\n请输入数字类型(1.整数 2.小数) -1为退出程序: ");scanf("%d",&n); switch(n){case 1:{ for(i=0;i<N;i++){a

c++ 小项目 &nbsp; 大数四则运算(整数)

代码如下: #pragma once #include<iostream> #include<assert.h> #include<string> using namespace std; #define UN_INIT 0XCCCCCCCCCCCCCCCC; #define MAX 0x7FFFFFFFFFFFFFFF #define MIN 0X8000000000000000 typedef long long  INT64; class BigData { pu

c语言实现四则运算2

设计要求: 1.题目避免重复: 2.可定制(数量/打印方式): 3.可以控制下列参数: 是否有乘除法.是否有括号. 数值范围.加减有无负数.除法有无余数.否支持分数 (真分数, 假分数, …).是否支持小数 (精确到多少位).打印中每行的间隔可调整: 我的设计思路 关于避免重复这个问题,我思考了好久好久,在本次设计过程中我也把这个问题放到了最后解决,但遗憾的是由于时间紧张,以及个人的水平实在有限,这个问题还是没有得到妥善的解决.本来准备将之前输出的每个式子全部存到数组里面,然后下一次输出时用fo

C语言实现四则运算

Github:https://github.com/YgR9710/Calculation 1. PSP2.1表格 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 120 240 · Estimate · 估计这个任务需要多少时间 100 200 Development 开发 2000 3000 · Analysis · 需求分析 (包括学习新技术) 200 300 · Design Spec · 生成设