加减速算(arithmetic)

题目描述 Description

加减法是计算中的基础运算,虽然规则简单,但是位数太多了,也难免会出错。现在的问题是:给定任意位数(不超过1000位)的加减法算式,请给出正确结果。为提高速度,保证给定运算的结果均为正整数。

输入输出格式 Input/output

输入格式:
一行:一个加法或减法的表达式
输出格式:
一个正整数,表示计算的结果(不可以有前导0)

输入输出样例 Sample input/output

样例测试点#1

输入样例:

12345678+111

输出样例:

123456789

思路:这题的数据量很大,有1000位,如果用int或longlong类型的直接计算是不可取的,必须用高精度算法。

这里可以分为步来算:

①用字符串读入数组

②扫描一遍数组,把操作符前后的两段存入两个数组

③利用高精度加减法计算两数组之和或之差存入a数组或b数组(你想怎么样都行)

④for循环输出(倒序)

补充:高精度算法是指参与运算的数(加数,减数,因子……)范围大大超出了标准数据类型(整型,实型)能表示的范围的运算

代码如下:

 1 #include<stdio.h>
 2 #include<string.h>
 3 int a[1001]={0},b[1001]={0};
 4 int i,ka,kb,k,c,temp;
 5 char s[2002],ch;
 6 void plus()//高精度加法函数
 7 {
 8     for(i=0;i<k;i++)
 9     {
10         a[i]=a[i]+b[i]+c;//按位加
11         if(a[i]>=10)//处理进位(满十进一)
12         {
13         a[i]=a[i]%10;
14         c=1;
15         }
16         else c=0;
17     }
18     if(c>0)
19     {
20         a[k]=c;
21         k++;
22     }
23 }
24 void minus()//高精度减法函数
25 {
26     for(i=0;i<ka;i++)
27     {
28         if(a[i]<b[i])//判断这一位计算是否要借位
29         {
30             c=1;
31             a[i+1]--;
32         }
33     else
34     c=0;
35     a[i]=a[i]+c*10-b[i];//计算这一位的结果
36     k=ka;
37     while(a[k-1]==0&&k>0)
38     k--;
39     }
40 }
41 int main()
42 {
43     scanf("%s",s);
44     k=0;
45     while((s[k]!=‘+‘)&&(s[k]!=‘-‘))//以运算符为界,分开两个操作数,期前部分计入数组a
46     {
47         a[k]=s[k]-‘0‘;
48         k++;
49     }
50     ch=s[k];//记录操作符
51     ka=k;//记录操作符当前位置
52     kb=0;
53     k++;//跳过继续
54     while(k<strlen(s))//运算符后部分计入数组b
55     {
56        b[kb]=s[k]-‘0‘;
57        k++;
58        kb++;//记录运算符后部分的位数
59     }
60     if(ka>=kb) k=ka;//取a和b的最大长度,以便进行按位计算
61     else k=kb;
62     for(i=0;i<ka/2;i++)//读入是从高位到低位的顺序,计算之前应该反序
63     {
64         temp=a[i];
65         a[i]=a[ka-i-1];
66         a[ka-1-i]=temp;
67     }
68     for(i=0;i<kb/2;i++)//读入是从高位到低位的顺序,计算之前应该反序
69     {
70         temp=b[i];
71         b[i]=b[ka-i-1];
72         b[ka-1-i]=temp;
73     }
74     c=0;//进位初始化
75     if(ch==‘+‘)//传入加法函数
76     plus();
77     else //传入减法函数
78     minus();
79     for(i=k-1;i>=0;i--)//按倒序输出结果
80     {
81         printf("%d",a[i]);
82     }
83     printf("\n");
84     return 0;
85 }
时间: 2024-10-11 15:11:13

加减速算(arithmetic)的相关文章

stm32S型加减速算法

电机加减速的时候需要用到平滑算法,常用的平滑算法有S型跟梯形,因为S型的平滑效果比较好,所以选择S型. 看了几篇论文,有的是使用多项函数.有的是使用分段,但这两个的函数曲线看起来并不是那么好,后面选择了sigmoid这类S型非线性变换. sigmoid函数 y = 1/(1+exp(-in))是一个良好的阈值函数,函数连续.光滑,严格单调并关于(0,0.5)中心对称,函数值∈[-1.1], 其导数f'(x)=f(x)*[1-f(x)],可以节约计算时间 sigmoid函数曲线的的方程y = 1/

电机加减速转动

控制电机的加减速,那就要用到pwm的初始化.也就是控制L298N的使能引脚. 1 GPIO_PinRemapConfig(GPIO_Remap_TIM4, ENABLE); //Timer完全映射 TIM4_CH3->PD14 2 3 4 TIM_TimeBaseStructure.TIM_Period = arr; //重装载 5 TIM_TimeBaseStructure.TIM_Prescaler =psc; //预分频 6 TIM_TimeBaseStructure.TIM_ClockD

java rsa加解密算法的实现

RSAUtils:RSA加解密的实现 package com.rsa.test; import java.io.ByteArrayOutputStream; import java.nio.charset.Charset; import java.security.Key; import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; import jav

加解密算法一:散列算法、对称加解密

.Net中的加解密操作所涉及的对象都在命名空间System.Security.Cryptography下,所以应先在程序中添加using System.Security.Cryptography. 1.散列算法: 用来产生一些数据片段(例如消息或会话项)的散列值的算法.好的散列算法具有在输入数据中的更改可以更改结果散列值中每个比特的特性:因此,散列对于检测在诸如消息等大型信息对象中的任何变化很有用.此外,好的散列算法使得构造两个独立的有相同散列的输入不能通过计算方法实现. 典型的散列算法包括 M

多语言(Java&amp;C#&amp;Ruby&amp;C++&amp;Objective-C&amp;Android)互通的TripleDES加解密算法实现

直入主题:前段时间根据公司对开发API的安全性要求,采用了小数据加密验证的方式,根据需求采用了三重DES加密算法.在实施的过程中发现各个语言之间加密由于加密补位的方式有所不同,导致不同语言之间加密之后无法相互解析.在强大的会联网技术和公司其他同事的支持下,最终整合了集Java,C#,Ruby,C++,Objective-C,Android多语言的可以互通的TripleDES加密算法,虽然在AES加密推崇的今天DES有些乏力,但小可大胆贴上代码,希望能给大家提供一些思路. Java DES加密(J

自定义刻度盘,用于显示一些界面效果,可实现1加减和0.5加减

主要代码如下,处女作,写得不好,多多体谅,基本功能都实现了,只是0.1加减的没有去弄,大家可以参考一下:自定义刻度盘文件TuneWheel.java /** * 类说明:自定义刻度盘 * Author: gaobaiq * Date: 2016/8/8 10:39 */ public class TuneWheel extends View { public static final int MOD_TYPE_HALF = 2; // 0.5加减 public static final int

JavaScript与C#互通的DES加解密算法

原文地址:传送门 本文提供了一个能使JavaScript与C#互通的DES加解密算法的实现,在前台页面中用JavaScript版本的DES算法将数据加密之后,传到服务器端,在服务器端可用C#版本的DES解密算法将其解密,得到原始数据,以起到一定的保密作用.但基于算法本身和密钥保密程度方面的考虑,使用本算法加密后的数据,其保密程度不是很高,故请酌情使用. 声明:本文中的JavaScript版的DES加解密算法来自于互联网,但为了方便于转化成C#版本的代码,本人对其进行了细微调整. JavaScri

步进电机

一.步进电机的构造 步进电动机构造上大致分为定子与转子两部分. 转子由转子 1.转子 2.永久磁钢等 3 部分构成.而且转子朝轴方向 已经磁化,转子 1 为 N 极时,转子 2 则为 S 极. 定子拥有小齿状的磁极,共有 10 个,皆绕有线圈. 其线圈的对角位置的磁极相互连接着,电流流通后,线圈即会被磁 化成同一极性.(例如某一线圈经由电流的流通后,对角线的磁极将 同化成 S 极或 N 极.) 对角线的 2 个磁极形成 1 个相,而由于有 A 相至 E 相等 5 个相位, 因此称为 5 相步进电

adult道具项目开发 - 模式

这个道具需要有几个模式,现在处于demo阶段,暂时想到4个模式:全深度抽插,半深度抽插,九浅一深,三长两短, 模式要如何实现呢.手机APP通过蓝牙来设置控制器的模式,控制器会解析这个模式的具体含义,将其翻译成步进电机的运动模式. 在我们这个道具中,步进电机上套有丝杆,单程全深度是8cm,步进电机转1圈丝杠前进8mm,完成整个单程需要10圈. 步进电机驱动器的细分数设置成2,所选的步进电机每收到1个脉冲转1.8度,360度需要200个脉冲,加上细分数为2,步进电机需要400个脉冲才能转1圈. 所以