杭电OJ 1002 A + B Problem II C语言

杭电OJ 1002 A + B Problem II C语言

简要说一下思路

用两个字符串保存数据。先对齐, 比如1 111 -> 001 111。然后从串尾字符开始,转成int做加法, 同时加上上一位的进位,最后按格式输出。

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

void HDOJ_1002(){
    int n = 0;
    scanf("%d", &n); 
    for (int i = 0; i < n; i++){ //n个case
        if (i > 0){ //按题目要求输出black line
            printf("\n\n");
        }
        char num1[1001] = {0}, num2[1001] = {0}, num1_[1001] = {0}, num2_[1001] = {0}, sum[1002] = {0};
        scanf("%s %s", num1, num2); //保存原始输入
        
        // 对齐, num1_和num2_保存对齐的输入, sum保存和
        int l1 = strlen(num1), l2 = strlen(num2);
        int l = 0; //对齐后长度
        if (l1 > l2){
           int m = l1 - l2;
           l = l1;
           for (int a = 0; a < m; a++){
               num2_[a] = '0';
           }
           for (int a = m; a < l1; a++){
               num2_[a] = num2[a-m];
           }
           strcpy(num1_, num1);
        }
        if (l1 < l2){
            l = l2;
            int m = l2 - l1;
            for (int a = 0; a < m; a++){
                num1_[a] = '0';
            }
            for (int a = m; a < l2; a++){
                num1_[a] = num1[a-m];
            }
            strcpy(num2_, num2);
        }
        if (l1 == l2){
            l = l1;
            strcpy(num1_, num1);
            strcpy(num2_, num2);
        }
        
        //从串尾开始做加法
        int k = 0; //保存进位
        while (--l >= 0) {
            int t = num1_[l] - '0' + num2_[l] - '0' + k; //当前位的和 + 进位
            if (t > 9){
                sum[l] = (t - 10) + '0';
                k = 1;
            }
            else {
                sum[l] = t + '0';
                k = 0;
            }
        }
        
        //按题目格式输出
        printf("Case %d:\n%s + %s = ", i+1, num1, num2);
       if (k == 1){
            putchar('1');
        }
       printf("%s", sum);
    }
}


int main() {
    HDOJ_1002();
    return 0;
}


  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值