大数减法2——在较短的数前补充前导零,以对齐最低位

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>

int main()
{
    char str1[255], str2[255];
    int num1[255] = { 0 }, num2[255] = { 0 };//用于存放减数和被减数,且较短者补前导零
    int dvalue[255] = { 0 };
    int length1, length2, length;
    int i, j;
    int neg_flag = 0;//差为负数的标志位
    int flag = 0;//借位标志

    gets(str1);
    gets(str2);
    length1 = strlen(str1);
    length2 = strlen(str2);
    length = length1 > length2 ? length1 : length2;

    //将两个数存入到num[]中
    for (i = length - 1,j = length1 - 1; j >= 0; i--,j--)
    {
        num1[i] = str1[j] - ‘0‘;
    }

    for (i = length - 1, j = length2 - 1; j >= 0; i--, j--)
    {
        num2[i] = str2[j] - ‘0‘;
    }

    //从后往前进行减法计算
    for (i = length - 1; i >= 0; i--)
    {
        dvalue[i] = flag + num1[i] - num2[i];
        if (dvalue[i] < 0)
        {
            dvalue[i] = dvalue[i] + 10;
            flag = -1;//表示借位
        }
        else
        {
            flag = 0;
        }
    }

    //如果跳出上述循环时,flag=-1,表示差为负数。
    //当判断结果为负数后,后续的算法示例如下:
    //比如123-456,在借位计算后,差值为667,实际为1123-456的差值。
    //则667需要再减去1000后才为实际差值。先置位负数标志位neg_flag,再使用1000-667。
    //即用10减最低位,再依次用9减其余各位。
    if (flag == -1)
    {
        neg_flag = 1;
        dvalue[length - 1] = 10 - dvalue[length - 1];
        for (i = length - 2; i >= 0; i--)
        {
            dvalue[i] = 9 - dvalue[i];
        }
    }

    //输出差值前,先跳过差值的前导零
    i = 0;
    while (dvalue[i] == 0 && (i < length))
    {
        i++;
    }

    //如果两个数相等,差值的各位全部为0,只输出一个0
    if (i == length)
    {
        putchar(‘0‘);
        return 0;
    }

    //如果是负数,先输出负号
    if (neg_flag == 1)
    {
        putchar(‘-‘);
    }

    for (; i < length; i++)
    {
        printf("%d", dvalue[i]);
    }

    return 0;
}

大数减法2——在较短的数前补充前导零,以对齐最低位,布布扣,bubuko.com

时间: 2024-11-01 09:53:20

大数减法2——在较短的数前补充前导零,以对齐最低位的相关文章

大数加法2&mdash;&mdash;在较短的加数前补充前导零

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> int main() { char str1[255], str2[255]; int num1[255] = { 0 }, num2[255] = { 0 };//用于存放加数,且较短者补前导零 int sum[255] = { 0 }; int length1, length2, length; int i, j; gets(str1); g

大数减法(含小数)

正数减法 描述: 两个任意长度的正数相减,这两个正数可以带小数点,也可以是整数,请输出结果.输入的字符串中,不会出现除了数字与小数点以外的其它字符,不会出现多个小数点以及小数点在第一个字符的位置等非法情况,所以考生的程序中无须考虑输入的数值字符串非法的情况. 详细要求以及约束:1.输入均为正数,但输出可能为负数:2.输入输出均为字符串形式:3.如果输出是正数则不需要带符号,如果为负数,则输出的结果字符串需要带负号例如:2.2-1.1 直接输出为"1.1",1.1-2.2 则需要输出为&

hdu 3191 How Many Paths Are There (次短路径数)

How Many Paths Are There Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1010    Accepted Submission(s): 332 Problem Description oooccc1 is a Software Engineer who has to ride to the work place

大数减法

大数减法 void Move(char a[]) //当结果第一位为零时,用此函数将有效位向前移动一位 { int i,len,cnt=0; len=strlen(a); if(a[0]=='0') for(i=0;i<=len;i++) a[i]=a[i+1]; } void sub(char a[],char b[]) //差存放在a数组中 { bool flag=0; //判断是否有借位 int len1,len2,sub1,sub2; len1=strlen(a);len2=strlen

大数加减1——将两个数均前后倒置,以对齐最低位

#include <stdio.h> //将读入的数据存储到num[1]~num[x]中,num[0]表示存入数据的长度. void read(int num[]) { int i; char ch; for (i = 0; i<500; i++) num[i] = 0; i = 1; while ((ch = getchar()) != '\n') { num[i] = ch - '0'; i++; num[0]++; } } //将数据num[]中的数翻转,以便计算 void rev

hdu1568&amp;&amp;hdu3117 求斐波那契数前四位和后四位

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1568 题意:如标题所示,求斐波那契数前四位,不足四位直接输出答案 斐波那契数列通式: 当n<=20的时候,不足四位,所以直接打表. 当n>20的时候,大于四位的时候,ans满足这个公式:ans=-0.5*log10(5.0)+num*1.0*log10((1+sqrt(5.0))/2.0); 这个公式是怎么来的呢?我们可以对an取10的对数,根据对数的性质. log10(ans)=log10(1/

FZU 1775 Counting Binary Trees 卡特兰数前n项和%m(m可为非素数

题目链接:点击打开链接 题意: 卡特兰数前n项和 结果%m 把答案当成2部分搞. #include<stdio.h> #include<cmath> #define int __int64 const int N = 100000; struct inverse_element{ int x, y, q; void extend_Eulid(int a,int b) { if(b == 0){ x = 1;y = 0;q = a; }else{ extend_Eulid(b,a%b

关于杭州绿城项目短信验证码前加图形验证码,我说用这种方式的都是蠢材

日前,某外包公司帮杭州绿城做了屋牛项目,改项目的短信平台遭到恶意大规模的请求,向运营商购买的短信很快耗尽.该团队想了方法即在短信验证码前加图形验证码. 分析一下,黑客模拟发起短信验证码的请求,他只能根据他获得得到的数据进行模拟,这里指一般的黑客攻击,且只针对此具体问题.对http熟悉的,都知道4个域,application.request.response.session.如果我们在session(或者HttpRuntime.Cache)里放一个token,每次请求比对该token,再辅以每个号

NYOJ 1233 差值(字符串排序+大数减法)

题意T组测试数据,每组数据给你n(0<n<=1000)个无符号整型范围内的数,把这些数字任意排列后连接成一个大数,求能排出的所有数当中最大的与最小的两个数的差值.例如{1, 2}, 最大为21,最小为12,差值为9. 样例输入131 2 3 样例输出198 思路乍一看是个大数问题,然而后来发现排序才是这道题的重点. 一开始想的是按数字的大小排序,但显然不对.例如{9, 10},按数字排序的话9 < 10,则最小值为910,但是显然109更小. 后来想到按字典序排,并且深信不疑的WA了两次