大数加法(小数情况)

话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。 
这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。 

现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。 

Input本题目包含多组测试数据,请处理到文件结束。 
每一组测试数据在一行里面包含两个长度不大于400的正小数A和B。Output请在一行里面输出输出A+B的值,请输出最简形式。详细要求请见Sample Output。 
Sample Input

1.1 2.9
1.1111111111 2.3444323343
1 1.1

Sample Output

4
3.4555434454
2.1

说真的,= =不得不吐槽一下出题人,题目都说了正的小数A和B,那为什么有整数情况,第一个代码纪念一下把A B都当成整数的情况

#include<stdio.h>
#include<string.h>
char a[401],b[401];
int str1[401],str2[401],str3[401],str4[401],str5[401],str6[401];
int main()
{
    int len1,len2,i,median1,median2,k2,k1,max1,max2;
    while(scanf("%s%s",a,b)!=EOF)
    {
        memset(str1,0,sizeof(str1));
        memset(str2,0,sizeof(str2));
        memset(str3,0,sizeof(str3));
        memset(str4,0,sizeof(str4));
        memset(str5,0,sizeof(str5));
        memset(str6,0,sizeof(str6));
        len1=strlen(a);
        len2=strlen(b);
        for(i=0;i<len1;i++)
            if(a[i]=='.')
              median1=i;
        for(i=0;i<len2;i++)
            if(b[i]=='.')
              median2=i;
        for(i=0;i<median1;i++)
            str1[i]=a[median1-1-i]-'0';
        for(i=0;i<len1-median1-1;i++)
            str2[i]=a[median1+1+i]-'0';
        for(i=0;i<median2;i++)
            str3[i]=b[median2-1-i]-'0';
        for(i=0;i<len2-median2-1;i++)
            str4[i]=b[median2+1+i]-'0';
        if(median1>median2)
            max1=median1;
        else
            max1=median2;
        if(len1-1-median1>len2-1-median2)
            max2=len1-median1-1;
        else
            max2=len2-median2-1;
        k2=0;
        for(i=max2-1;i>=0;i--)
        {
            str5[i]=(str2[i]+str4[i]+k2)%10;
            k2=(str2[i]+str4[i]+k2)/10;
        }
        if(k2!=0)
         str5[max2]=1;
         k1=0;
        for(i=0;i<max1;i++)
        {
            str6[i]=str5[max2]+(str1[i]+str3[i]+k1)%10;
            k1=(str1[i]+str3[i]+k1)/10;
            str5[max2]=0;
        }
        if(k1!=0)
        str6[max1]=1;
        for(i=max1-1;i>=0;i--)
            printf("%d",str6[i]);
           printf(".");
        for(i=0;i<max2;i++)
            printf("%d",str5[i]);
        printf("\n");
    }
    return 0;
}

第二个代码

#include<stdio.h>
#include<string.h>
char a[410],b[410];
int s1[410],s11[410],s2[410],s22[410],s3[410],s33[410];
int main()
{
    int len1,len2,i,j,m1,m2,max1,max2,k;
    while(scanf("%s%s",a,b)!=EOF)
    {
       memset(s1,0,sizeof(s1));
       memset(s11,0,sizeof(s11));
       memset(s2,0,sizeof(s2));
       memset(s22,0,sizeof(s22));
       m1=len1=strlen(a);
       m2=len2=strlen(b);
       for(i=0;i<len1;i++)
        if(a[i]=='.')
          m1=i;
       for(i=0;i<len2;i++)
        if(b[i]=='.')
        m2=i;
       for(i=0,j=m1-1;i<m1;i++,j--)
        s1[i]=a[j]-'0';
       for(i=m1+1,j=0;i<len1;i++,j++)
        s11[j]=a[i]-'0';
       for(i=0,j=m2-1;i<m2;i++,j--)
        s2[i]=b[j]-'0';
       for(i=m2+1,j=0;i<len2;i++,j++)
        s22[j]=b[i]-'0';
        max1=max2=0;
       if(m1>m2)
        max1=m1;
       else
        max1=m2;
       if((len1-m1)>(len2-m2))
        max2=len1-m1;
       else
        max2=len2-m2;
        k=0;
       for(i=max2-1;i>=0;i--)
       {
           s33[i]=(s11[i]+s22[i]+k)%10;
           k=(s22[i]+s11[i]+k)/10;
       }
       for(i=0;i<max1;i++)
       {
           s3[i]=(s1[i]+s2[i]+k)%10;
           k=(s1[i]+s2[i]+k)/10;
       }
       if(k!=0)
        printf("1");
      for(i=max1-1;i>=0;i--)
        printf("%d",s3[i]);
      while(s33[max2-1]==0)
      {
          if(s33[max2-1]==0)
            max2--;
      }
      if(max2>0)
        printf(".");
      for(i=0;i<max2;i++)
        printf("%d",s33[i]);
      printf("\n");
    }
    return 0;
}

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于Java语言开发的小学生数学练习程序,支持100以内的加、减、乘、除运算: ```java import java.util.Random; import java.util.Scanner; public class MathPractice { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); Random random = new Random(); int correctCount = 0; int totalCount = 0; while (true) { int a = random.nextInt(100) + 1; int b = random.nextInt(100) + 1; int operator = random.nextInt(4); String opStr; int result; switch (operator) { case 0: // 加法 opStr = "+"; result = a + b; break; case 1: // 减法 if (a < b) { int temp = a; a = b; b = temp; } opStr = "-"; result = a - b; break; case 2: // 乘法 opStr = "x"; result = a * b; break; case 3: // 除法 if (b == 1) { continue; // 除数不能为1 } int quotient = a / b; if (quotient * b != a) { continue; // 不能整除 } opStr = "/"; result = quotient; break; default: throw new IllegalStateException("Unexpected value: " + operator); } System.out.printf("%d %s %d = ", a, opStr, b); int answer = scanner.nextInt(); if (answer == result) { System.out.println("回答正确!"); correctCount++; } else { System.out.println("回答错误!"); } totalCount++; System.out.printf("你已经回答了%d题,其中%d题回答正确。\n", totalCount, correctCount); System.out.println("是否继续?(y/n)"); String continueStr = scanner.next(); if (!"y".equalsIgnoreCase(continueStr)) { break; } } System.out.printf("你一共回答了%d题,其中%d题回答正确。", totalCount, correctCount); } } ``` 程序首先通过 `Scanner` 和 `Random` 类创建一个输入和一个随机数生成器。然后程序进入一个循环,每次生成两个随机数和一个运算符,根据运算符计算出正确答案,然后提示用户输入答案,根据用户输入和正确答案进行比较,输出回答正确或回答错误的提示信息,并记录回答正确的题目数和总题目数。然后询问用户是否继续做题,如果用户输入的是 `y`,则继续下一轮循环,否则退出循环,输出总题目数和回答正确的题目数。在程序中,除法运算需要特别处理,保证被除数和除数都在100以内,且能够整除,除数不能为1。减法运算需要保证大数小数,因此如果a小于b,需要交换a和b的值。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值